Changeset 439 for EcnlProtoTool/trunk/mruby-2.1.1
- Timestamp:
- Jul 9, 2020, 8:51:43 AM (4 years ago)
- Location:
- EcnlProtoTool/trunk/mruby-2.1.1
- Files:
-
- 149 added
- 19 deleted
- 222 edited
- 1 moved
Legend:
- Unmodified
- Added
- Removed
-
EcnlProtoTool/trunk/mruby-2.1.1/.cproject
r426 r439 49 49 <option id="ilg.gnuarmeclipse.managedbuild.cross.option.addtools.createflash.1907336908" name="Create flash image" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.addtools.createflash" value="true" valueType="boolean"/> 50 50 <targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="ilg.gnuarmeclipse.managedbuild.cross.targetPlatform.194370869" isAbstract="false" osList="all" superClass="ilg.gnuarmeclipse.managedbuild.cross.targetPlatform"/> 51 <builder buildPath="${workspace_loc:/mruby- 1.3.0}" id="com.renesas.cdt.managedbuild.gcc.rz.builder.1751464165" keepEnvironmentInBuildfile="false" managedBuildOn="false" name="GCC for Renesas Builder" superClass="com.renesas.cdt.managedbuild.gcc.rz.builder"/>51 <builder buildPath="${workspace_loc:/mruby-2.1.1}" id="com.renesas.cdt.managedbuild.gcc.rz.builder.1751464165" keepEnvironmentInBuildfile="false" managedBuildOn="false" name="GCC for Renesas Builder" superClass="com.renesas.cdt.managedbuild.gcc.rz.builder"/> 52 52 <tool id="com.renesas.cdt.managedbuild.gcc.rz.tool.assembler.322468629" name="Cross ARM GNU Assembler" superClass="com.renesas.cdt.managedbuild.gcc.rz.tool.assembler"> 53 53 <option id="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.usepreprocessor.1448772766" name="Use preprocessor" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.usepreprocessor" value="true" valueType="boolean"/> -
EcnlProtoTool/trunk/mruby-2.1.1/.gitignore
r331 r439 1 # / 1 *.lock 2 2 *.bak 3 *.bc 3 4 *.d 5 *.i 4 6 *.o 5 /benchmark/**/*.dat6 /benchmark/*.pdf7 /benchmark/*.png8 7 *.orig 9 8 *.pdb 10 9 *.rej 10 *.s 11 11 *.sav 12 12 *.swp … … 16 16 .ccmalloc 17 17 .svn 18 /.git 18 .vscode 19 .yardoc 20 cscope.files 19 21 cscope.out 20 22 tags 21 /src/y.tab.c 23 24 /.git 22 25 /bin 23 26 /build 24 27 /mruby-source-*.gem 25 doc/api 26 .yardoc 28 29 /benchmark/**/*.dat 30 /benchmark/*.pdf 31 /benchmark/*.png 32 33 /doc/api 34 /doc/capi -
EcnlProtoTool/trunk/mruby-2.1.1/.gitlab-ci.yml
r331 r439 12 12 CXX: g++-4.7 13 13 LD: gcc-4.7 14 script: "./minirake all test"14 script: rake --verbose all test 15 15 Test gcc-4.7 32bit: 16 stage: test 17 image: registry.gitlab.com/dabroz/mruby:gcc47_0.7 18 variables: 19 CC: gcc-4.7 20 CXX: g++-4.7 21 LD: gcc-4.7 22 CFLAGS: "-m32 " 23 LDFLAGS: "-m32" 24 script: env; rake --verbose all test 25 Test gcc-4.7 32bit_utf8: 26 stage: test 27 image: registry.gitlab.com/dabroz/mruby:gcc47_0.7 28 variables: 29 CC: gcc-4.7 30 CXX: g++-4.7 31 LD: gcc-4.7 32 CFLAGS: "-m32 -DMRB_UTF8_STRING=1" 33 LDFLAGS: "-m32" 34 script: env; rake --verbose all test 35 Test gcc-4.7 32bit_nan: 36 stage: test 37 image: registry.gitlab.com/dabroz/mruby:gcc47_0.7 38 variables: 39 CC: gcc-4.7 40 CXX: g++-4.7 41 LD: gcc-4.7 42 CFLAGS: "-m32 -DMRB_NAN_BOXING=1" 43 LDFLAGS: "-m32" 44 script: env; rake --verbose all test 45 Test gcc-4.7 32bit_nan_utf8: 46 stage: test 47 image: registry.gitlab.com/dabroz/mruby:gcc47_0.7 48 variables: 49 CC: gcc-4.7 50 CXX: g++-4.7 51 LD: gcc-4.7 52 CFLAGS: "-m32 -DMRB_NAN_BOXING=1 -DMRB_UTF8_STRING=1" 53 LDFLAGS: "-m32" 54 script: env; rake --verbose all test 55 Test gcc-4.7 32bit_word: 16 56 stage: test 17 57 image: registry.gitlab.com/dabroz/mruby:gcc47_0.7 … … 22 62 CFLAGS: "-m32 -DMRB_WORD_BOXING=1" 23 63 LDFLAGS: "-m32" 24 script: env; ./minirake --verbose all test25 Test gcc-4.7 32bit_ utf8:64 script: env; rake --verbose all test 65 Test gcc-4.7 32bit_word_utf8: 26 66 stage: test 27 67 image: registry.gitlab.com/dabroz/mruby:gcc47_0.7 … … 32 72 CFLAGS: "-m32 -DMRB_WORD_BOXING=1 -DMRB_UTF8_STRING=1" 33 73 LDFLAGS: "-m32" 34 script: env; ./minirake --verbose all test 35 Test gcc-4.7 32bit_nan: 36 stage: test 37 image: registry.gitlab.com/dabroz/mruby:gcc47_0.7 38 variables: 39 CC: gcc-4.7 40 CXX: g++-4.7 41 LD: gcc-4.7 42 CFLAGS: "-m32 -DMRB_NAN_BOXING=1" 43 LDFLAGS: "-m32" 44 script: env; ./minirake --verbose all test 45 Test gcc-4.7 32bit_nan_utf8: 46 stage: test 47 image: registry.gitlab.com/dabroz/mruby:gcc47_0.7 48 variables: 49 CC: gcc-4.7 50 CXX: g++-4.7 51 LD: gcc-4.7 52 CFLAGS: "-m32 -DMRB_NAN_BOXING=1 -DMRB_UTF8_STRING=1" 53 LDFLAGS: "-m32" 54 script: env; ./minirake --verbose all test 74 script: env; rake --verbose all test 55 75 Test gcc-4.7 32bit_int16: 56 76 stage: test … … 62 82 CFLAGS: "-m32 -DMRB_INT16=1" 63 83 LDFLAGS: "-m32" 64 script: env; ./minirake --verbose all test84 script: env; rake --verbose all test 65 85 Test gcc-4.7 32bit_int16_utf8: 66 86 stage: test … … 72 92 CFLAGS: "-m32 -DMRB_INT16=1 -DMRB_UTF8_STRING=1" 73 93 LDFLAGS: "-m32" 74 script: env; ./minirake --verbose all test94 script: env; rake --verbose all test 75 95 Test gcc-4.7 32bit_int16_nan: 76 96 stage: test … … 82 102 CFLAGS: "-m32 -DMRB_INT16=1 -DMRB_NAN_BOXING=1" 83 103 LDFLAGS: "-m32" 84 script: env; ./minirake --verbose all test104 script: env; rake --verbose all test 85 105 Test gcc-4.7 32bit_int16_nan_utf8: 86 106 stage: test … … 92 112 CFLAGS: "-m32 -DMRB_INT16=1 -DMRB_NAN_BOXING=1 -DMRB_UTF8_STRING=1" 93 113 LDFLAGS: "-m32" 94 script: env; ./minirake --verbose all test114 script: env; rake --verbose all test 95 115 Test gcc-4.7 32bit_int64: 96 116 stage: test … … 102 122 CFLAGS: "-m32 -DMRB_INT64=1" 103 123 LDFLAGS: "-m32" 104 script: env; ./minirake --verbose all test124 script: env; rake --verbose all test 105 125 Test gcc-4.7 32bit_int64_utf8: 106 126 stage: test … … 112 132 CFLAGS: "-m32 -DMRB_INT64=1 -DMRB_UTF8_STRING=1" 113 133 LDFLAGS: "-m32" 114 script: env; ./minirake --verbose all test134 script: env; rake --verbose all test 115 135 Test gcc-4.7 32bit_float: 136 stage: test 137 image: registry.gitlab.com/dabroz/mruby:gcc47_0.7 138 variables: 139 CC: gcc-4.7 140 CXX: g++-4.7 141 LD: gcc-4.7 142 CFLAGS: "-m32 -DMRB_USE_FLOAT=1" 143 LDFLAGS: "-m32" 144 script: env; rake --verbose all test 145 Test gcc-4.7 32bit_float_utf8: 146 stage: test 147 image: registry.gitlab.com/dabroz/mruby:gcc47_0.7 148 variables: 149 CC: gcc-4.7 150 CXX: g++-4.7 151 LD: gcc-4.7 152 CFLAGS: "-m32 -DMRB_USE_FLOAT=1 -DMRB_UTF8_STRING=1" 153 LDFLAGS: "-m32" 154 script: env; rake --verbose all test 155 Test gcc-4.7 32bit_float_word: 116 156 stage: test 117 157 image: registry.gitlab.com/dabroz/mruby:gcc47_0.7 … … 122 162 CFLAGS: "-m32 -DMRB_USE_FLOAT=1 -DMRB_WORD_BOXING=1" 123 163 LDFLAGS: "-m32" 124 script: env; ./minirake --verbose all test125 Test gcc-4.7 32bit_float_ utf8:164 script: env; rake --verbose all test 165 Test gcc-4.7 32bit_float_word_utf8: 126 166 stage: test 127 167 image: registry.gitlab.com/dabroz/mruby:gcc47_0.7 … … 132 172 CFLAGS: "-m32 -DMRB_USE_FLOAT=1 -DMRB_WORD_BOXING=1 -DMRB_UTF8_STRING=1" 133 173 LDFLAGS: "-m32" 134 script: env; ./minirake --verbose all test174 script: env; rake --verbose all test 135 175 Test gcc-4.7 32bit_float_int16: 136 176 stage: test … … 142 182 CFLAGS: "-m32 -DMRB_USE_FLOAT=1 -DMRB_INT16=1" 143 183 LDFLAGS: "-m32" 144 script: env; ./minirake --verbose all test184 script: env; rake --verbose all test 145 185 Test gcc-4.7 32bit_float_int16_utf8: 146 186 stage: test … … 152 192 CFLAGS: "-m32 -DMRB_USE_FLOAT=1 -DMRB_INT16=1 -DMRB_UTF8_STRING=1" 153 193 LDFLAGS: "-m32" 154 script: env; ./minirake --verbose all test194 script: env; rake --verbose all test 155 195 Test gcc-4.7 32bit_float_int64: 156 196 stage: test … … 162 202 CFLAGS: "-m32 -DMRB_USE_FLOAT=1 -DMRB_INT64=1" 163 203 LDFLAGS: "-m32" 164 script: env; ./minirake --verbose all test204 script: env; rake --verbose all test 165 205 Test gcc-4.7 32bit_float_int64_utf8: 166 206 stage: test … … 172 212 CFLAGS: "-m32 -DMRB_USE_FLOAT=1 -DMRB_INT64=1 -DMRB_UTF8_STRING=1" 173 213 LDFLAGS: "-m32" 174 script: env; ./minirake --verbose all test214 script: env; rake --verbose all test 175 215 Test gcc-4.7 64bit: 216 stage: test 217 image: registry.gitlab.com/dabroz/mruby:gcc47_0.7 218 variables: 219 CC: gcc-4.7 220 CXX: g++-4.7 221 LD: gcc-4.7 222 CFLAGS: '' 223 LDFLAGS: '' 224 script: env; rake --verbose all test 225 Test gcc-4.7 64bit_utf8: 226 stage: test 227 image: registry.gitlab.com/dabroz/mruby:gcc47_0.7 228 variables: 229 CC: gcc-4.7 230 CXX: g++-4.7 231 LD: gcc-4.7 232 CFLAGS: "-DMRB_UTF8_STRING=1" 233 LDFLAGS: '' 234 script: env; rake --verbose all test 235 Test gcc-4.7 64bit_nan: 236 stage: test 237 image: registry.gitlab.com/dabroz/mruby:gcc47_0.7 238 variables: 239 CC: gcc-4.7 240 CXX: g++-4.7 241 LD: gcc-4.7 242 CFLAGS: "-DMRB_NAN_BOXING=1" 243 LDFLAGS: '' 244 script: env; rake --verbose all test 245 Test gcc-4.7 64bit_nan_utf8: 246 stage: test 247 image: registry.gitlab.com/dabroz/mruby:gcc47_0.7 248 variables: 249 CC: gcc-4.7 250 CXX: g++-4.7 251 LD: gcc-4.7 252 CFLAGS: "-DMRB_NAN_BOXING=1 -DMRB_UTF8_STRING=1" 253 LDFLAGS: '' 254 script: env; rake --verbose all test 255 Test gcc-4.7 64bit_word: 176 256 stage: test 177 257 image: registry.gitlab.com/dabroz/mruby:gcc47_0.7 … … 182 262 CFLAGS: "-DMRB_WORD_BOXING=1" 183 263 LDFLAGS: '' 184 script: env; ./minirake --verbose all test185 Test gcc-4.7 64bit_ utf8:264 script: env; rake --verbose all test 265 Test gcc-4.7 64bit_word_utf8: 186 266 stage: test 187 267 image: registry.gitlab.com/dabroz/mruby:gcc47_0.7 … … 192 272 CFLAGS: "-DMRB_WORD_BOXING=1 -DMRB_UTF8_STRING=1" 193 273 LDFLAGS: '' 194 script: env; ./minirake --verbose all test 195 Test gcc-4.7 64bit_nan: 196 stage: test 197 image: registry.gitlab.com/dabroz/mruby:gcc47_0.7 198 variables: 199 CC: gcc-4.7 200 CXX: g++-4.7 201 LD: gcc-4.7 202 CFLAGS: "-DMRB_NAN_BOXING=1" 203 LDFLAGS: '' 204 script: env; ./minirake --verbose all test 205 Test gcc-4.7 64bit_nan_utf8: 206 stage: test 207 image: registry.gitlab.com/dabroz/mruby:gcc47_0.7 208 variables: 209 CC: gcc-4.7 210 CXX: g++-4.7 211 LD: gcc-4.7 212 CFLAGS: "-DMRB_NAN_BOXING=1 -DMRB_UTF8_STRING=1" 213 LDFLAGS: '' 214 script: env; ./minirake --verbose all test 274 script: env; rake --verbose all test 215 275 Test gcc-4.7 64bit_int16: 216 276 stage: test … … 222 282 CFLAGS: "-DMRB_INT16=1" 223 283 LDFLAGS: '' 224 script: env; ./minirake --verbose all test284 script: env; rake --verbose all test 225 285 Test gcc-4.7 64bit_int16_utf8: 226 286 stage: test … … 232 292 CFLAGS: "-DMRB_INT16=1 -DMRB_UTF8_STRING=1" 233 293 LDFLAGS: '' 234 script: env; ./minirake --verbose all test294 script: env; rake --verbose all test 235 295 Test gcc-4.7 64bit_int16_nan: 236 296 stage: test … … 242 302 CFLAGS: "-DMRB_INT16=1 -DMRB_NAN_BOXING=1" 243 303 LDFLAGS: '' 244 script: env; ./minirake --verbose all test304 script: env; rake --verbose all test 245 305 Test gcc-4.7 64bit_int16_nan_utf8: 246 306 stage: test … … 252 312 CFLAGS: "-DMRB_INT16=1 -DMRB_NAN_BOXING=1 -DMRB_UTF8_STRING=1" 253 313 LDFLAGS: '' 254 script: env; ./minirake --verbose all test314 script: env; rake --verbose all test 255 315 Test gcc-4.7 64bit_int64: 316 stage: test 317 image: registry.gitlab.com/dabroz/mruby:gcc47_0.7 318 variables: 319 CC: gcc-4.7 320 CXX: g++-4.7 321 LD: gcc-4.7 322 CFLAGS: "-DMRB_INT64=1" 323 LDFLAGS: '' 324 script: env; rake --verbose all test 325 Test gcc-4.7 64bit_int64_utf8: 326 stage: test 327 image: registry.gitlab.com/dabroz/mruby:gcc47_0.7 328 variables: 329 CC: gcc-4.7 330 CXX: g++-4.7 331 LD: gcc-4.7 332 CFLAGS: "-DMRB_INT64=1 -DMRB_UTF8_STRING=1" 333 LDFLAGS: '' 334 script: env; rake --verbose all test 335 Test gcc-4.7 64bit_int64_word: 256 336 stage: test 257 337 image: registry.gitlab.com/dabroz/mruby:gcc47_0.7 … … 262 342 CFLAGS: "-DMRB_INT64=1 -DMRB_WORD_BOXING=1" 263 343 LDFLAGS: '' 264 script: env; ./minirake --verbose all test265 Test gcc-4.7 64bit_int64_ utf8:344 script: env; rake --verbose all test 345 Test gcc-4.7 64bit_int64_word_utf8: 266 346 stage: test 267 347 image: registry.gitlab.com/dabroz/mruby:gcc47_0.7 … … 272 352 CFLAGS: "-DMRB_INT64=1 -DMRB_WORD_BOXING=1 -DMRB_UTF8_STRING=1" 273 353 LDFLAGS: '' 274 script: env; ./minirake --verbose all test354 script: env; rake --verbose all test 275 355 Test gcc-4.7 64bit_float: 356 stage: test 357 image: registry.gitlab.com/dabroz/mruby:gcc47_0.7 358 variables: 359 CC: gcc-4.7 360 CXX: g++-4.7 361 LD: gcc-4.7 362 CFLAGS: "-DMRB_USE_FLOAT=1" 363 LDFLAGS: '' 364 script: env; rake --verbose all test 365 Test gcc-4.7 64bit_float_utf8: 366 stage: test 367 image: registry.gitlab.com/dabroz/mruby:gcc47_0.7 368 variables: 369 CC: gcc-4.7 370 CXX: g++-4.7 371 LD: gcc-4.7 372 CFLAGS: "-DMRB_USE_FLOAT=1 -DMRB_UTF8_STRING=1" 373 LDFLAGS: '' 374 script: env; rake --verbose all test 375 Test gcc-4.7 64bit_float_word: 276 376 stage: test 277 377 image: registry.gitlab.com/dabroz/mruby:gcc47_0.7 … … 282 382 CFLAGS: "-DMRB_USE_FLOAT=1 -DMRB_WORD_BOXING=1" 283 383 LDFLAGS: '' 284 script: env; ./minirake --verbose all test285 Test gcc-4.7 64bit_float_ utf8:384 script: env; rake --verbose all test 385 Test gcc-4.7 64bit_float_word_utf8: 286 386 stage: test 287 387 image: registry.gitlab.com/dabroz/mruby:gcc47_0.7 … … 292 392 CFLAGS: "-DMRB_USE_FLOAT=1 -DMRB_WORD_BOXING=1 -DMRB_UTF8_STRING=1" 293 393 LDFLAGS: '' 294 script: env; ./minirake --verbose all test394 script: env; rake --verbose all test 295 395 Test gcc-4.7 64bit_float_int16: 296 396 stage: test … … 302 402 CFLAGS: "-DMRB_USE_FLOAT=1 -DMRB_INT16=1" 303 403 LDFLAGS: '' 304 script: env; ./minirake --verbose all test404 script: env; rake --verbose all test 305 405 Test gcc-4.7 64bit_float_int16_utf8: 306 406 stage: test … … 312 412 CFLAGS: "-DMRB_USE_FLOAT=1 -DMRB_INT16=1 -DMRB_UTF8_STRING=1" 313 413 LDFLAGS: '' 314 script: env; ./minirake --verbose all test414 script: env; rake --verbose all test 315 415 Test gcc-4.7 64bit_float_int64: 416 stage: test 417 image: registry.gitlab.com/dabroz/mruby:gcc47_0.7 418 variables: 419 CC: gcc-4.7 420 CXX: g++-4.7 421 LD: gcc-4.7 422 CFLAGS: "-DMRB_USE_FLOAT=1 -DMRB_INT64=1" 423 LDFLAGS: '' 424 script: env; rake --verbose all test 425 Test gcc-4.7 64bit_float_int64_utf8: 426 stage: test 427 image: registry.gitlab.com/dabroz/mruby:gcc47_0.7 428 variables: 429 CC: gcc-4.7 430 CXX: g++-4.7 431 LD: gcc-4.7 432 CFLAGS: "-DMRB_USE_FLOAT=1 -DMRB_INT64=1 -DMRB_UTF8_STRING=1" 433 LDFLAGS: '' 434 script: env; rake --verbose all test 435 Test gcc-4.7 64bit_float_int64_word: 316 436 stage: test 317 437 image: registry.gitlab.com/dabroz/mruby:gcc47_0.7 … … 322 442 CFLAGS: "-DMRB_USE_FLOAT=1 -DMRB_INT64=1 -DMRB_WORD_BOXING=1" 323 443 LDFLAGS: '' 324 script: env; ./minirake --verbose all test325 Test gcc-4.7 64bit_float_int64_ utf8:444 script: env; rake --verbose all test 445 Test gcc-4.7 64bit_float_int64_word_utf8: 326 446 stage: test 327 447 image: registry.gitlab.com/dabroz/mruby:gcc47_0.7 … … 332 452 CFLAGS: "-DMRB_USE_FLOAT=1 -DMRB_INT64=1 -DMRB_WORD_BOXING=1 -DMRB_UTF8_STRING=1" 333 453 LDFLAGS: '' 334 script: env; ./minirake --verbose all test454 script: env; rake --verbose all test 335 455 Test gcc-4.8 32bit: 456 stage: test 457 image: registry.gitlab.com/dabroz/mruby:gcc48_0.7 458 variables: 459 CC: gcc-4.8 460 CXX: g++-4.8 461 LD: gcc-4.8 462 CFLAGS: "-m32 " 463 LDFLAGS: "-m32" 464 script: env; rake --verbose all test 465 Test gcc-4.8 32bit_utf8: 466 stage: test 467 image: registry.gitlab.com/dabroz/mruby:gcc48_0.7 468 variables: 469 CC: gcc-4.8 470 CXX: g++-4.8 471 LD: gcc-4.8 472 CFLAGS: "-m32 -DMRB_UTF8_STRING=1" 473 LDFLAGS: "-m32" 474 script: env; rake --verbose all test 475 Test gcc-4.8 32bit_nan: 476 stage: test 477 image: registry.gitlab.com/dabroz/mruby:gcc48_0.7 478 variables: 479 CC: gcc-4.8 480 CXX: g++-4.8 481 LD: gcc-4.8 482 CFLAGS: "-m32 -DMRB_NAN_BOXING=1" 483 LDFLAGS: "-m32" 484 script: env; rake --verbose all test 485 Test gcc-4.8 32bit_nan_utf8: 486 stage: test 487 image: registry.gitlab.com/dabroz/mruby:gcc48_0.7 488 variables: 489 CC: gcc-4.8 490 CXX: g++-4.8 491 LD: gcc-4.8 492 CFLAGS: "-m32 -DMRB_NAN_BOXING=1 -DMRB_UTF8_STRING=1" 493 LDFLAGS: "-m32" 494 script: env; rake --verbose all test 495 Test gcc-4.8 32bit_word: 336 496 stage: test 337 497 image: registry.gitlab.com/dabroz/mruby:gcc48_0.7 … … 342 502 CFLAGS: "-m32 -DMRB_WORD_BOXING=1" 343 503 LDFLAGS: "-m32" 344 script: env; ./minirake --verbose all test345 Test gcc-4.8 32bit_ utf8:504 script: env; rake --verbose all test 505 Test gcc-4.8 32bit_word_utf8: 346 506 stage: test 347 507 image: registry.gitlab.com/dabroz/mruby:gcc48_0.7 … … 352 512 CFLAGS: "-m32 -DMRB_WORD_BOXING=1 -DMRB_UTF8_STRING=1" 353 513 LDFLAGS: "-m32" 354 script: env; ./minirake --verbose all test 355 Test gcc-4.8 32bit_nan: 356 stage: test 357 image: registry.gitlab.com/dabroz/mruby:gcc48_0.7 358 variables: 359 CC: gcc-4.8 360 CXX: g++-4.8 361 LD: gcc-4.8 362 CFLAGS: "-m32 -DMRB_NAN_BOXING=1" 363 LDFLAGS: "-m32" 364 script: env; ./minirake --verbose all test 365 Test gcc-4.8 32bit_nan_utf8: 366 stage: test 367 image: registry.gitlab.com/dabroz/mruby:gcc48_0.7 368 variables: 369 CC: gcc-4.8 370 CXX: g++-4.8 371 LD: gcc-4.8 372 CFLAGS: "-m32 -DMRB_NAN_BOXING=1 -DMRB_UTF8_STRING=1" 373 LDFLAGS: "-m32" 374 script: env; ./minirake --verbose all test 514 script: env; rake --verbose all test 375 515 Test gcc-4.8 32bit_int16: 376 516 stage: test … … 382 522 CFLAGS: "-m32 -DMRB_INT16=1" 383 523 LDFLAGS: "-m32" 384 script: env; ./minirake --verbose all test524 script: env; rake --verbose all test 385 525 Test gcc-4.8 32bit_int16_utf8: 386 526 stage: test … … 392 532 CFLAGS: "-m32 -DMRB_INT16=1 -DMRB_UTF8_STRING=1" 393 533 LDFLAGS: "-m32" 394 script: env; ./minirake --verbose all test534 script: env; rake --verbose all test 395 535 Test gcc-4.8 32bit_int16_nan: 396 536 stage: test … … 402 542 CFLAGS: "-m32 -DMRB_INT16=1 -DMRB_NAN_BOXING=1" 403 543 LDFLAGS: "-m32" 404 script: env; ./minirake --verbose all test544 script: env; rake --verbose all test 405 545 Test gcc-4.8 32bit_int16_nan_utf8: 406 546 stage: test … … 412 552 CFLAGS: "-m32 -DMRB_INT16=1 -DMRB_NAN_BOXING=1 -DMRB_UTF8_STRING=1" 413 553 LDFLAGS: "-m32" 414 script: env; ./minirake --verbose all test554 script: env; rake --verbose all test 415 555 Test gcc-4.8 32bit_int64: 416 556 stage: test … … 422 562 CFLAGS: "-m32 -DMRB_INT64=1" 423 563 LDFLAGS: "-m32" 424 script: env; ./minirake --verbose all test564 script: env; rake --verbose all test 425 565 Test gcc-4.8 32bit_int64_utf8: 426 566 stage: test … … 432 572 CFLAGS: "-m32 -DMRB_INT64=1 -DMRB_UTF8_STRING=1" 433 573 LDFLAGS: "-m32" 434 script: env; ./minirake --verbose all test574 script: env; rake --verbose all test 435 575 Test gcc-4.8 32bit_float: 576 stage: test 577 image: registry.gitlab.com/dabroz/mruby:gcc48_0.7 578 variables: 579 CC: gcc-4.8 580 CXX: g++-4.8 581 LD: gcc-4.8 582 CFLAGS: "-m32 -DMRB_USE_FLOAT=1" 583 LDFLAGS: "-m32" 584 script: env; rake --verbose all test 585 Test gcc-4.8 32bit_float_utf8: 586 stage: test 587 image: registry.gitlab.com/dabroz/mruby:gcc48_0.7 588 variables: 589 CC: gcc-4.8 590 CXX: g++-4.8 591 LD: gcc-4.8 592 CFLAGS: "-m32 -DMRB_USE_FLOAT=1 -DMRB_UTF8_STRING=1" 593 LDFLAGS: "-m32" 594 script: env; rake --verbose all test 595 Test gcc-4.8 32bit_float_word: 436 596 stage: test 437 597 image: registry.gitlab.com/dabroz/mruby:gcc48_0.7 … … 442 602 CFLAGS: "-m32 -DMRB_USE_FLOAT=1 -DMRB_WORD_BOXING=1" 443 603 LDFLAGS: "-m32" 444 script: env; ./minirake --verbose all test445 Test gcc-4.8 32bit_float_ utf8:604 script: env; rake --verbose all test 605 Test gcc-4.8 32bit_float_word_utf8: 446 606 stage: test 447 607 image: registry.gitlab.com/dabroz/mruby:gcc48_0.7 … … 452 612 CFLAGS: "-m32 -DMRB_USE_FLOAT=1 -DMRB_WORD_BOXING=1 -DMRB_UTF8_STRING=1" 453 613 LDFLAGS: "-m32" 454 script: env; ./minirake --verbose all test614 script: env; rake --verbose all test 455 615 Test gcc-4.8 32bit_float_int16: 456 616 stage: test … … 462 622 CFLAGS: "-m32 -DMRB_USE_FLOAT=1 -DMRB_INT16=1" 463 623 LDFLAGS: "-m32" 464 script: env; ./minirake --verbose all test624 script: env; rake --verbose all test 465 625 Test gcc-4.8 32bit_float_int16_utf8: 466 626 stage: test … … 472 632 CFLAGS: "-m32 -DMRB_USE_FLOAT=1 -DMRB_INT16=1 -DMRB_UTF8_STRING=1" 473 633 LDFLAGS: "-m32" 474 script: env; ./minirake --verbose all test634 script: env; rake --verbose all test 475 635 Test gcc-4.8 32bit_float_int64: 476 636 stage: test … … 482 642 CFLAGS: "-m32 -DMRB_USE_FLOAT=1 -DMRB_INT64=1" 483 643 LDFLAGS: "-m32" 484 script: env; ./minirake --verbose all test644 script: env; rake --verbose all test 485 645 Test gcc-4.8 32bit_float_int64_utf8: 486 646 stage: test … … 492 652 CFLAGS: "-m32 -DMRB_USE_FLOAT=1 -DMRB_INT64=1 -DMRB_UTF8_STRING=1" 493 653 LDFLAGS: "-m32" 494 script: env; ./minirake --verbose all test654 script: env; rake --verbose all test 495 655 Test gcc-4.8 64bit: 656 stage: test 657 image: registry.gitlab.com/dabroz/mruby:gcc48_0.7 658 variables: 659 CC: gcc-4.8 660 CXX: g++-4.8 661 LD: gcc-4.8 662 CFLAGS: '' 663 LDFLAGS: '' 664 script: env; rake --verbose all test 665 Test gcc-4.8 64bit_utf8: 666 stage: test 667 image: registry.gitlab.com/dabroz/mruby:gcc48_0.7 668 variables: 669 CC: gcc-4.8 670 CXX: g++-4.8 671 LD: gcc-4.8 672 CFLAGS: "-DMRB_UTF8_STRING=1" 673 LDFLAGS: '' 674 script: env; rake --verbose all test 675 Test gcc-4.8 64bit_nan: 676 stage: test 677 image: registry.gitlab.com/dabroz/mruby:gcc48_0.7 678 variables: 679 CC: gcc-4.8 680 CXX: g++-4.8 681 LD: gcc-4.8 682 CFLAGS: "-DMRB_NAN_BOXING=1" 683 LDFLAGS: '' 684 script: env; rake --verbose all test 685 Test gcc-4.8 64bit_nan_utf8: 686 stage: test 687 image: registry.gitlab.com/dabroz/mruby:gcc48_0.7 688 variables: 689 CC: gcc-4.8 690 CXX: g++-4.8 691 LD: gcc-4.8 692 CFLAGS: "-DMRB_NAN_BOXING=1 -DMRB_UTF8_STRING=1" 693 LDFLAGS: '' 694 script: env; rake --verbose all test 695 Test gcc-4.8 64bit_word: 496 696 stage: test 497 697 image: registry.gitlab.com/dabroz/mruby:gcc48_0.7 … … 502 702 CFLAGS: "-DMRB_WORD_BOXING=1" 503 703 LDFLAGS: '' 504 script: env; ./minirake --verbose all test505 Test gcc-4.8 64bit_ utf8:704 script: env; rake --verbose all test 705 Test gcc-4.8 64bit_word_utf8: 506 706 stage: test 507 707 image: registry.gitlab.com/dabroz/mruby:gcc48_0.7 … … 512 712 CFLAGS: "-DMRB_WORD_BOXING=1 -DMRB_UTF8_STRING=1" 513 713 LDFLAGS: '' 514 script: env; ./minirake --verbose all test 515 Test gcc-4.8 64bit_nan: 516 stage: test 517 image: registry.gitlab.com/dabroz/mruby:gcc48_0.7 518 variables: 519 CC: gcc-4.8 520 CXX: g++-4.8 521 LD: gcc-4.8 522 CFLAGS: "-DMRB_NAN_BOXING=1" 523 LDFLAGS: '' 524 script: env; ./minirake --verbose all test 525 Test gcc-4.8 64bit_nan_utf8: 526 stage: test 527 image: registry.gitlab.com/dabroz/mruby:gcc48_0.7 528 variables: 529 CC: gcc-4.8 530 CXX: g++-4.8 531 LD: gcc-4.8 532 CFLAGS: "-DMRB_NAN_BOXING=1 -DMRB_UTF8_STRING=1" 533 LDFLAGS: '' 534 script: env; ./minirake --verbose all test 714 script: env; rake --verbose all test 535 715 Test gcc-4.8 64bit_int16: 536 716 stage: test … … 542 722 CFLAGS: "-DMRB_INT16=1" 543 723 LDFLAGS: '' 544 script: env; ./minirake --verbose all test724 script: env; rake --verbose all test 545 725 Test gcc-4.8 64bit_int16_utf8: 546 726 stage: test … … 552 732 CFLAGS: "-DMRB_INT16=1 -DMRB_UTF8_STRING=1" 553 733 LDFLAGS: '' 554 script: env; ./minirake --verbose all test734 script: env; rake --verbose all test 555 735 Test gcc-4.8 64bit_int16_nan: 556 736 stage: test … … 562 742 CFLAGS: "-DMRB_INT16=1 -DMRB_NAN_BOXING=1" 563 743 LDFLAGS: '' 564 script: env; ./minirake --verbose all test744 script: env; rake --verbose all test 565 745 Test gcc-4.8 64bit_int16_nan_utf8: 566 746 stage: test … … 572 752 CFLAGS: "-DMRB_INT16=1 -DMRB_NAN_BOXING=1 -DMRB_UTF8_STRING=1" 573 753 LDFLAGS: '' 574 script: env; ./minirake --verbose all test754 script: env; rake --verbose all test 575 755 Test gcc-4.8 64bit_int64: 756 stage: test 757 image: registry.gitlab.com/dabroz/mruby:gcc48_0.7 758 variables: 759 CC: gcc-4.8 760 CXX: g++-4.8 761 LD: gcc-4.8 762 CFLAGS: "-DMRB_INT64=1" 763 LDFLAGS: '' 764 script: env; rake --verbose all test 765 Test gcc-4.8 64bit_int64_utf8: 766 stage: test 767 image: registry.gitlab.com/dabroz/mruby:gcc48_0.7 768 variables: 769 CC: gcc-4.8 770 CXX: g++-4.8 771 LD: gcc-4.8 772 CFLAGS: "-DMRB_INT64=1 -DMRB_UTF8_STRING=1" 773 LDFLAGS: '' 774 script: env; rake --verbose all test 775 Test gcc-4.8 64bit_int64_word: 576 776 stage: test 577 777 image: registry.gitlab.com/dabroz/mruby:gcc48_0.7 … … 582 782 CFLAGS: "-DMRB_INT64=1 -DMRB_WORD_BOXING=1" 583 783 LDFLAGS: '' 584 script: env; ./minirake --verbose all test585 Test gcc-4.8 64bit_int64_ utf8:784 script: env; rake --verbose all test 785 Test gcc-4.8 64bit_int64_word_utf8: 586 786 stage: test 587 787 image: registry.gitlab.com/dabroz/mruby:gcc48_0.7 … … 592 792 CFLAGS: "-DMRB_INT64=1 -DMRB_WORD_BOXING=1 -DMRB_UTF8_STRING=1" 593 793 LDFLAGS: '' 594 script: env; ./minirake --verbose all test794 script: env; rake --verbose all test 595 795 Test gcc-4.8 64bit_float: 796 stage: test 797 image: registry.gitlab.com/dabroz/mruby:gcc48_0.7 798 variables: 799 CC: gcc-4.8 800 CXX: g++-4.8 801 LD: gcc-4.8 802 CFLAGS: "-DMRB_USE_FLOAT=1" 803 LDFLAGS: '' 804 script: env; rake --verbose all test 805 Test gcc-4.8 64bit_float_utf8: 806 stage: test 807 image: registry.gitlab.com/dabroz/mruby:gcc48_0.7 808 variables: 809 CC: gcc-4.8 810 CXX: g++-4.8 811 LD: gcc-4.8 812 CFLAGS: "-DMRB_USE_FLOAT=1 -DMRB_UTF8_STRING=1" 813 LDFLAGS: '' 814 script: env; rake --verbose all test 815 Test gcc-4.8 64bit_float_word: 596 816 stage: test 597 817 image: registry.gitlab.com/dabroz/mruby:gcc48_0.7 … … 602 822 CFLAGS: "-DMRB_USE_FLOAT=1 -DMRB_WORD_BOXING=1" 603 823 LDFLAGS: '' 604 script: env; ./minirake --verbose all test605 Test gcc-4.8 64bit_float_ utf8:824 script: env; rake --verbose all test 825 Test gcc-4.8 64bit_float_word_utf8: 606 826 stage: test 607 827 image: registry.gitlab.com/dabroz/mruby:gcc48_0.7 … … 612 832 CFLAGS: "-DMRB_USE_FLOAT=1 -DMRB_WORD_BOXING=1 -DMRB_UTF8_STRING=1" 613 833 LDFLAGS: '' 614 script: env; ./minirake --verbose all test834 script: env; rake --verbose all test 615 835 Test gcc-4.8 64bit_float_int16: 616 836 stage: test … … 622 842 CFLAGS: "-DMRB_USE_FLOAT=1 -DMRB_INT16=1" 623 843 LDFLAGS: '' 624 script: env; ./minirake --verbose all test844 script: env; rake --verbose all test 625 845 Test gcc-4.8 64bit_float_int16_utf8: 626 846 stage: test … … 632 852 CFLAGS: "-DMRB_USE_FLOAT=1 -DMRB_INT16=1 -DMRB_UTF8_STRING=1" 633 853 LDFLAGS: '' 634 script: env; ./minirake --verbose all test854 script: env; rake --verbose all test 635 855 Test gcc-4.8 64bit_float_int64: 856 stage: test 857 image: registry.gitlab.com/dabroz/mruby:gcc48_0.7 858 variables: 859 CC: gcc-4.8 860 CXX: g++-4.8 861 LD: gcc-4.8 862 CFLAGS: "-DMRB_USE_FLOAT=1 -DMRB_INT64=1" 863 LDFLAGS: '' 864 script: env; rake --verbose all test 865 Test gcc-4.8 64bit_float_int64_utf8: 866 stage: test 867 image: registry.gitlab.com/dabroz/mruby:gcc48_0.7 868 variables: 869 CC: gcc-4.8 870 CXX: g++-4.8 871 LD: gcc-4.8 872 CFLAGS: "-DMRB_USE_FLOAT=1 -DMRB_INT64=1 -DMRB_UTF8_STRING=1" 873 LDFLAGS: '' 874 script: env; rake --verbose all test 875 Test gcc-4.8 64bit_float_int64_word: 636 876 stage: test 637 877 image: registry.gitlab.com/dabroz/mruby:gcc48_0.7 … … 642 882 CFLAGS: "-DMRB_USE_FLOAT=1 -DMRB_INT64=1 -DMRB_WORD_BOXING=1" 643 883 LDFLAGS: '' 644 script: env; ./minirake --verbose all test645 Test gcc-4.8 64bit_float_int64_ utf8:884 script: env; rake --verbose all test 885 Test gcc-4.8 64bit_float_int64_word_utf8: 646 886 stage: test 647 887 image: registry.gitlab.com/dabroz/mruby:gcc48_0.7 … … 652 892 CFLAGS: "-DMRB_USE_FLOAT=1 -DMRB_INT64=1 -DMRB_WORD_BOXING=1 -DMRB_UTF8_STRING=1" 653 893 LDFLAGS: '' 654 script: env; ./minirake --verbose all test894 script: env; rake --verbose all test 655 895 Test gcc-4.9 32bit: 896 stage: test 897 image: registry.gitlab.com/dabroz/mruby:gcc49_0.7 898 variables: 899 CC: gcc-4.9 900 CXX: g++-4.9 901 LD: gcc-4.9 902 CFLAGS: "-m32 " 903 LDFLAGS: "-m32" 904 script: env; rake --verbose all test 905 Test gcc-4.9 32bit_utf8: 906 stage: test 907 image: registry.gitlab.com/dabroz/mruby:gcc49_0.7 908 variables: 909 CC: gcc-4.9 910 CXX: g++-4.9 911 LD: gcc-4.9 912 CFLAGS: "-m32 -DMRB_UTF8_STRING=1" 913 LDFLAGS: "-m32" 914 script: env; rake --verbose all test 915 Test gcc-4.9 32bit_nan: 916 stage: test 917 image: registry.gitlab.com/dabroz/mruby:gcc49_0.7 918 variables: 919 CC: gcc-4.9 920 CXX: g++-4.9 921 LD: gcc-4.9 922 CFLAGS: "-m32 -DMRB_NAN_BOXING=1" 923 LDFLAGS: "-m32" 924 script: env; rake --verbose all test 925 Test gcc-4.9 32bit_nan_utf8: 926 stage: test 927 image: registry.gitlab.com/dabroz/mruby:gcc49_0.7 928 variables: 929 CC: gcc-4.9 930 CXX: g++-4.9 931 LD: gcc-4.9 932 CFLAGS: "-m32 -DMRB_NAN_BOXING=1 -DMRB_UTF8_STRING=1" 933 LDFLAGS: "-m32" 934 script: env; rake --verbose all test 935 Test gcc-4.9 32bit_word: 656 936 stage: test 657 937 image: registry.gitlab.com/dabroz/mruby:gcc49_0.7 … … 662 942 CFLAGS: "-m32 -DMRB_WORD_BOXING=1" 663 943 LDFLAGS: "-m32" 664 script: env; ./minirake --verbose all test665 Test gcc-4.9 32bit_ utf8:944 script: env; rake --verbose all test 945 Test gcc-4.9 32bit_word_utf8: 666 946 stage: test 667 947 image: registry.gitlab.com/dabroz/mruby:gcc49_0.7 … … 672 952 CFLAGS: "-m32 -DMRB_WORD_BOXING=1 -DMRB_UTF8_STRING=1" 673 953 LDFLAGS: "-m32" 674 script: env; ./minirake --verbose all test 675 Test gcc-4.9 32bit_nan: 676 stage: test 677 image: registry.gitlab.com/dabroz/mruby:gcc49_0.7 678 variables: 679 CC: gcc-4.9 680 CXX: g++-4.9 681 LD: gcc-4.9 682 CFLAGS: "-m32 -DMRB_NAN_BOXING=1" 683 LDFLAGS: "-m32" 684 script: env; ./minirake --verbose all test 685 Test gcc-4.9 32bit_nan_utf8: 686 stage: test 687 image: registry.gitlab.com/dabroz/mruby:gcc49_0.7 688 variables: 689 CC: gcc-4.9 690 CXX: g++-4.9 691 LD: gcc-4.9 692 CFLAGS: "-m32 -DMRB_NAN_BOXING=1 -DMRB_UTF8_STRING=1" 693 LDFLAGS: "-m32" 694 script: env; ./minirake --verbose all test 954 script: env; rake --verbose all test 695 955 Test gcc-4.9 32bit_int16: 696 956 stage: test … … 702 962 CFLAGS: "-m32 -DMRB_INT16=1" 703 963 LDFLAGS: "-m32" 704 script: env; ./minirake --verbose all test964 script: env; rake --verbose all test 705 965 Test gcc-4.9 32bit_int16_utf8: 706 966 stage: test … … 712 972 CFLAGS: "-m32 -DMRB_INT16=1 -DMRB_UTF8_STRING=1" 713 973 LDFLAGS: "-m32" 714 script: env; ./minirake --verbose all test974 script: env; rake --verbose all test 715 975 Test gcc-4.9 32bit_int16_nan: 716 976 stage: test … … 722 982 CFLAGS: "-m32 -DMRB_INT16=1 -DMRB_NAN_BOXING=1" 723 983 LDFLAGS: "-m32" 724 script: env; ./minirake --verbose all test984 script: env; rake --verbose all test 725 985 Test gcc-4.9 32bit_int16_nan_utf8: 726 986 stage: test … … 732 992 CFLAGS: "-m32 -DMRB_INT16=1 -DMRB_NAN_BOXING=1 -DMRB_UTF8_STRING=1" 733 993 LDFLAGS: "-m32" 734 script: env; ./minirake --verbose all test994 script: env; rake --verbose all test 735 995 Test gcc-4.9 32bit_int64: 736 996 stage: test … … 742 1002 CFLAGS: "-m32 -DMRB_INT64=1" 743 1003 LDFLAGS: "-m32" 744 script: env; ./minirake --verbose all test1004 script: env; rake --verbose all test 745 1005 Test gcc-4.9 32bit_int64_utf8: 746 1006 stage: test … … 752 1012 CFLAGS: "-m32 -DMRB_INT64=1 -DMRB_UTF8_STRING=1" 753 1013 LDFLAGS: "-m32" 754 script: env; ./minirake --verbose all test1014 script: env; rake --verbose all test 755 1015 Test gcc-4.9 32bit_float: 1016 stage: test 1017 image: registry.gitlab.com/dabroz/mruby:gcc49_0.7 1018 variables: 1019 CC: gcc-4.9 1020 CXX: g++-4.9 1021 LD: gcc-4.9 1022 CFLAGS: "-m32 -DMRB_USE_FLOAT=1" 1023 LDFLAGS: "-m32" 1024 script: env; rake --verbose all test 1025 Test gcc-4.9 32bit_float_utf8: 1026 stage: test 1027 image: registry.gitlab.com/dabroz/mruby:gcc49_0.7 1028 variables: 1029 CC: gcc-4.9 1030 CXX: g++-4.9 1031 LD: gcc-4.9 1032 CFLAGS: "-m32 -DMRB_USE_FLOAT=1 -DMRB_UTF8_STRING=1" 1033 LDFLAGS: "-m32" 1034 script: env; rake --verbose all test 1035 Test gcc-4.9 32bit_float_word: 756 1036 stage: test 757 1037 image: registry.gitlab.com/dabroz/mruby:gcc49_0.7 … … 762 1042 CFLAGS: "-m32 -DMRB_USE_FLOAT=1 -DMRB_WORD_BOXING=1" 763 1043 LDFLAGS: "-m32" 764 script: env; ./minirake --verbose all test765 Test gcc-4.9 32bit_float_ utf8:1044 script: env; rake --verbose all test 1045 Test gcc-4.9 32bit_float_word_utf8: 766 1046 stage: test 767 1047 image: registry.gitlab.com/dabroz/mruby:gcc49_0.7 … … 772 1052 CFLAGS: "-m32 -DMRB_USE_FLOAT=1 -DMRB_WORD_BOXING=1 -DMRB_UTF8_STRING=1" 773 1053 LDFLAGS: "-m32" 774 script: env; ./minirake --verbose all test1054 script: env; rake --verbose all test 775 1055 Test gcc-4.9 32bit_float_int16: 776 1056 stage: test … … 782 1062 CFLAGS: "-m32 -DMRB_USE_FLOAT=1 -DMRB_INT16=1" 783 1063 LDFLAGS: "-m32" 784 script: env; ./minirake --verbose all test1064 script: env; rake --verbose all test 785 1065 Test gcc-4.9 32bit_float_int16_utf8: 786 1066 stage: test … … 792 1072 CFLAGS: "-m32 -DMRB_USE_FLOAT=1 -DMRB_INT16=1 -DMRB_UTF8_STRING=1" 793 1073 LDFLAGS: "-m32" 794 script: env; ./minirake --verbose all test1074 script: env; rake --verbose all test 795 1075 Test gcc-4.9 32bit_float_int64: 796 1076 stage: test … … 802 1082 CFLAGS: "-m32 -DMRB_USE_FLOAT=1 -DMRB_INT64=1" 803 1083 LDFLAGS: "-m32" 804 script: env; ./minirake --verbose all test1084 script: env; rake --verbose all test 805 1085 Test gcc-4.9 32bit_float_int64_utf8: 806 1086 stage: test … … 812 1092 CFLAGS: "-m32 -DMRB_USE_FLOAT=1 -DMRB_INT64=1 -DMRB_UTF8_STRING=1" 813 1093 LDFLAGS: "-m32" 814 script: env; ./minirake --verbose all test1094 script: env; rake --verbose all test 815 1095 Test gcc-4.9 64bit: 1096 stage: test 1097 image: registry.gitlab.com/dabroz/mruby:gcc49_0.7 1098 variables: 1099 CC: gcc-4.9 1100 CXX: g++-4.9 1101 LD: gcc-4.9 1102 CFLAGS: '' 1103 LDFLAGS: '' 1104 script: env; rake --verbose all test 1105 Test gcc-4.9 64bit_utf8: 1106 stage: test 1107 image: registry.gitlab.com/dabroz/mruby:gcc49_0.7 1108 variables: 1109 CC: gcc-4.9 1110 CXX: g++-4.9 1111 LD: gcc-4.9 1112 CFLAGS: "-DMRB_UTF8_STRING=1" 1113 LDFLAGS: '' 1114 script: env; rake --verbose all test 1115 Test gcc-4.9 64bit_nan: 1116 stage: test 1117 image: registry.gitlab.com/dabroz/mruby:gcc49_0.7 1118 variables: 1119 CC: gcc-4.9 1120 CXX: g++-4.9 1121 LD: gcc-4.9 1122 CFLAGS: "-DMRB_NAN_BOXING=1" 1123 LDFLAGS: '' 1124 script: env; rake --verbose all test 1125 Test gcc-4.9 64bit_nan_utf8: 1126 stage: test 1127 image: registry.gitlab.com/dabroz/mruby:gcc49_0.7 1128 variables: 1129 CC: gcc-4.9 1130 CXX: g++-4.9 1131 LD: gcc-4.9 1132 CFLAGS: "-DMRB_NAN_BOXING=1 -DMRB_UTF8_STRING=1" 1133 LDFLAGS: '' 1134 script: env; rake --verbose all test 1135 Test gcc-4.9 64bit_word: 816 1136 stage: test 817 1137 image: registry.gitlab.com/dabroz/mruby:gcc49_0.7 … … 822 1142 CFLAGS: "-DMRB_WORD_BOXING=1" 823 1143 LDFLAGS: '' 824 script: env; ./minirake --verbose all test825 Test gcc-4.9 64bit_ utf8:1144 script: env; rake --verbose all test 1145 Test gcc-4.9 64bit_word_utf8: 826 1146 stage: test 827 1147 image: registry.gitlab.com/dabroz/mruby:gcc49_0.7 … … 832 1152 CFLAGS: "-DMRB_WORD_BOXING=1 -DMRB_UTF8_STRING=1" 833 1153 LDFLAGS: '' 834 script: env; ./minirake --verbose all test 835 Test gcc-4.9 64bit_nan: 836 stage: test 837 image: registry.gitlab.com/dabroz/mruby:gcc49_0.7 838 variables: 839 CC: gcc-4.9 840 CXX: g++-4.9 841 LD: gcc-4.9 842 CFLAGS: "-DMRB_NAN_BOXING=1" 843 LDFLAGS: '' 844 script: env; ./minirake --verbose all test 845 Test gcc-4.9 64bit_nan_utf8: 846 stage: test 847 image: registry.gitlab.com/dabroz/mruby:gcc49_0.7 848 variables: 849 CC: gcc-4.9 850 CXX: g++-4.9 851 LD: gcc-4.9 852 CFLAGS: "-DMRB_NAN_BOXING=1 -DMRB_UTF8_STRING=1" 853 LDFLAGS: '' 854 script: env; ./minirake --verbose all test 1154 script: env; rake --verbose all test 855 1155 Test gcc-4.9 64bit_int16: 856 1156 stage: test … … 862 1162 CFLAGS: "-DMRB_INT16=1" 863 1163 LDFLAGS: '' 864 script: env; ./minirake --verbose all test1164 script: env; rake --verbose all test 865 1165 Test gcc-4.9 64bit_int16_utf8: 866 1166 stage: test … … 872 1172 CFLAGS: "-DMRB_INT16=1 -DMRB_UTF8_STRING=1" 873 1173 LDFLAGS: '' 874 script: env; ./minirake --verbose all test1174 script: env; rake --verbose all test 875 1175 Test gcc-4.9 64bit_int16_nan: 876 1176 stage: test … … 882 1182 CFLAGS: "-DMRB_INT16=1 -DMRB_NAN_BOXING=1" 883 1183 LDFLAGS: '' 884 script: env; ./minirake --verbose all test1184 script: env; rake --verbose all test 885 1185 Test gcc-4.9 64bit_int16_nan_utf8: 886 1186 stage: test … … 892 1192 CFLAGS: "-DMRB_INT16=1 -DMRB_NAN_BOXING=1 -DMRB_UTF8_STRING=1" 893 1193 LDFLAGS: '' 894 script: env; ./minirake --verbose all test1194 script: env; rake --verbose all test 895 1195 Test gcc-4.9 64bit_int64: 1196 stage: test 1197 image: registry.gitlab.com/dabroz/mruby:gcc49_0.7 1198 variables: 1199 CC: gcc-4.9 1200 CXX: g++-4.9 1201 LD: gcc-4.9 1202 CFLAGS: "-DMRB_INT64=1" 1203 LDFLAGS: '' 1204 script: env; rake --verbose all test 1205 Test gcc-4.9 64bit_int64_utf8: 1206 stage: test 1207 image: registry.gitlab.com/dabroz/mruby:gcc49_0.7 1208 variables: 1209 CC: gcc-4.9 1210 CXX: g++-4.9 1211 LD: gcc-4.9 1212 CFLAGS: "-DMRB_INT64=1 -DMRB_UTF8_STRING=1" 1213 LDFLAGS: '' 1214 script: env; rake --verbose all test 1215 Test gcc-4.9 64bit_int64_word: 896 1216 stage: test 897 1217 image: registry.gitlab.com/dabroz/mruby:gcc49_0.7 … … 902 1222 CFLAGS: "-DMRB_INT64=1 -DMRB_WORD_BOXING=1" 903 1223 LDFLAGS: '' 904 script: env; ./minirake --verbose all test905 Test gcc-4.9 64bit_int64_ utf8:1224 script: env; rake --verbose all test 1225 Test gcc-4.9 64bit_int64_word_utf8: 906 1226 stage: test 907 1227 image: registry.gitlab.com/dabroz/mruby:gcc49_0.7 … … 912 1232 CFLAGS: "-DMRB_INT64=1 -DMRB_WORD_BOXING=1 -DMRB_UTF8_STRING=1" 913 1233 LDFLAGS: '' 914 script: env; ./minirake --verbose all test1234 script: env; rake --verbose all test 915 1235 Test gcc-4.9 64bit_float: 1236 stage: test 1237 image: registry.gitlab.com/dabroz/mruby:gcc49_0.7 1238 variables: 1239 CC: gcc-4.9 1240 CXX: g++-4.9 1241 LD: gcc-4.9 1242 CFLAGS: "-DMRB_USE_FLOAT=1" 1243 LDFLAGS: '' 1244 script: env; rake --verbose all test 1245 Test gcc-4.9 64bit_float_utf8: 1246 stage: test 1247 image: registry.gitlab.com/dabroz/mruby:gcc49_0.7 1248 variables: 1249 CC: gcc-4.9 1250 CXX: g++-4.9 1251 LD: gcc-4.9 1252 CFLAGS: "-DMRB_USE_FLOAT=1 -DMRB_UTF8_STRING=1" 1253 LDFLAGS: '' 1254 script: env; rake --verbose all test 1255 Test gcc-4.9 64bit_float_word: 916 1256 stage: test 917 1257 image: registry.gitlab.com/dabroz/mruby:gcc49_0.7 … … 922 1262 CFLAGS: "-DMRB_USE_FLOAT=1 -DMRB_WORD_BOXING=1" 923 1263 LDFLAGS: '' 924 script: env; ./minirake --verbose all test925 Test gcc-4.9 64bit_float_ utf8:1264 script: env; rake --verbose all test 1265 Test gcc-4.9 64bit_float_word_utf8: 926 1266 stage: test 927 1267 image: registry.gitlab.com/dabroz/mruby:gcc49_0.7 … … 932 1272 CFLAGS: "-DMRB_USE_FLOAT=1 -DMRB_WORD_BOXING=1 -DMRB_UTF8_STRING=1" 933 1273 LDFLAGS: '' 934 script: env; ./minirake --verbose all test1274 script: env; rake --verbose all test 935 1275 Test gcc-4.9 64bit_float_int16: 936 1276 stage: test … … 942 1282 CFLAGS: "-DMRB_USE_FLOAT=1 -DMRB_INT16=1" 943 1283 LDFLAGS: '' 944 script: env; ./minirake --verbose all test1284 script: env; rake --verbose all test 945 1285 Test gcc-4.9 64bit_float_int16_utf8: 946 1286 stage: test … … 952 1292 CFLAGS: "-DMRB_USE_FLOAT=1 -DMRB_INT16=1 -DMRB_UTF8_STRING=1" 953 1293 LDFLAGS: '' 954 script: env; ./minirake --verbose all test1294 script: env; rake --verbose all test 955 1295 Test gcc-4.9 64bit_float_int64: 1296 stage: test 1297 image: registry.gitlab.com/dabroz/mruby:gcc49_0.7 1298 variables: 1299 CC: gcc-4.9 1300 CXX: g++-4.9 1301 LD: gcc-4.9 1302 CFLAGS: "-DMRB_USE_FLOAT=1 -DMRB_INT64=1" 1303 LDFLAGS: '' 1304 script: env; rake --verbose all test 1305 Test gcc-4.9 64bit_float_int64_utf8: 1306 stage: test 1307 image: registry.gitlab.com/dabroz/mruby:gcc49_0.7 1308 variables: 1309 CC: gcc-4.9 1310 CXX: g++-4.9 1311 LD: gcc-4.9 1312 CFLAGS: "-DMRB_USE_FLOAT=1 -DMRB_INT64=1 -DMRB_UTF8_STRING=1" 1313 LDFLAGS: '' 1314 script: env; rake --verbose all test 1315 Test gcc-4.9 64bit_float_int64_word: 956 1316 stage: test 957 1317 image: registry.gitlab.com/dabroz/mruby:gcc49_0.7 … … 962 1322 CFLAGS: "-DMRB_USE_FLOAT=1 -DMRB_INT64=1 -DMRB_WORD_BOXING=1" 963 1323 LDFLAGS: '' 964 script: env; ./minirake --verbose all test965 Test gcc-4.9 64bit_float_int64_ utf8:1324 script: env; rake --verbose all test 1325 Test gcc-4.9 64bit_float_int64_word_utf8: 966 1326 stage: test 967 1327 image: registry.gitlab.com/dabroz/mruby:gcc49_0.7 … … 972 1332 CFLAGS: "-DMRB_USE_FLOAT=1 -DMRB_INT64=1 -DMRB_WORD_BOXING=1 -DMRB_UTF8_STRING=1" 973 1333 LDFLAGS: '' 974 script: env; ./minirake --verbose all test1334 script: env; rake --verbose all test 975 1335 Test gcc-5 32bit: 1336 stage: test 1337 image: registry.gitlab.com/dabroz/mruby:gcc5_0.7 1338 variables: 1339 CC: gcc-5 1340 CXX: g++-5 1341 LD: gcc-5 1342 CFLAGS: "-m32 " 1343 LDFLAGS: "-m32" 1344 script: env; rake --verbose all test 1345 Test gcc-5 32bit_utf8: 1346 stage: test 1347 image: registry.gitlab.com/dabroz/mruby:gcc5_0.7 1348 variables: 1349 CC: gcc-5 1350 CXX: g++-5 1351 LD: gcc-5 1352 CFLAGS: "-m32 -DMRB_UTF8_STRING=1" 1353 LDFLAGS: "-m32" 1354 script: env; rake --verbose all test 1355 Test gcc-5 32bit_nan: 1356 stage: test 1357 image: registry.gitlab.com/dabroz/mruby:gcc5_0.7 1358 variables: 1359 CC: gcc-5 1360 CXX: g++-5 1361 LD: gcc-5 1362 CFLAGS: "-m32 -DMRB_NAN_BOXING=1" 1363 LDFLAGS: "-m32" 1364 script: env; rake --verbose all test 1365 Test gcc-5 32bit_nan_utf8: 1366 stage: test 1367 image: registry.gitlab.com/dabroz/mruby:gcc5_0.7 1368 variables: 1369 CC: gcc-5 1370 CXX: g++-5 1371 LD: gcc-5 1372 CFLAGS: "-m32 -DMRB_NAN_BOXING=1 -DMRB_UTF8_STRING=1" 1373 LDFLAGS: "-m32" 1374 script: env; rake --verbose all test 1375 Test gcc-5 32bit_word: 976 1376 stage: test 977 1377 image: registry.gitlab.com/dabroz/mruby:gcc5_0.7 … … 982 1382 CFLAGS: "-m32 -DMRB_WORD_BOXING=1" 983 1383 LDFLAGS: "-m32" 984 script: env; ./minirake --verbose all test985 Test gcc-5 32bit_ utf8:1384 script: env; rake --verbose all test 1385 Test gcc-5 32bit_word_utf8: 986 1386 stage: test 987 1387 image: registry.gitlab.com/dabroz/mruby:gcc5_0.7 … … 992 1392 CFLAGS: "-m32 -DMRB_WORD_BOXING=1 -DMRB_UTF8_STRING=1" 993 1393 LDFLAGS: "-m32" 994 script: env; ./minirake --verbose all test 995 Test gcc-5 32bit_nan: 996 stage: test 997 image: registry.gitlab.com/dabroz/mruby:gcc5_0.7 998 variables: 999 CC: gcc-5 1000 CXX: g++-5 1001 LD: gcc-5 1002 CFLAGS: "-m32 -DMRB_NAN_BOXING=1" 1003 LDFLAGS: "-m32" 1004 script: env; ./minirake --verbose all test 1005 Test gcc-5 32bit_nan_utf8: 1006 stage: test 1007 image: registry.gitlab.com/dabroz/mruby:gcc5_0.7 1008 variables: 1009 CC: gcc-5 1010 CXX: g++-5 1011 LD: gcc-5 1012 CFLAGS: "-m32 -DMRB_NAN_BOXING=1 -DMRB_UTF8_STRING=1" 1013 LDFLAGS: "-m32" 1014 script: env; ./minirake --verbose all test 1394 script: env; rake --verbose all test 1015 1395 Test gcc-5 32bit_int16: 1016 1396 stage: test … … 1022 1402 CFLAGS: "-m32 -DMRB_INT16=1" 1023 1403 LDFLAGS: "-m32" 1024 script: env; ./minirake --verbose all test1404 script: env; rake --verbose all test 1025 1405 Test gcc-5 32bit_int16_utf8: 1026 1406 stage: test … … 1032 1412 CFLAGS: "-m32 -DMRB_INT16=1 -DMRB_UTF8_STRING=1" 1033 1413 LDFLAGS: "-m32" 1034 script: env; ./minirake --verbose all test1414 script: env; rake --verbose all test 1035 1415 Test gcc-5 32bit_int16_nan: 1036 1416 stage: test … … 1042 1422 CFLAGS: "-m32 -DMRB_INT16=1 -DMRB_NAN_BOXING=1" 1043 1423 LDFLAGS: "-m32" 1044 script: env; ./minirake --verbose all test1424 script: env; rake --verbose all test 1045 1425 Test gcc-5 32bit_int16_nan_utf8: 1046 1426 stage: test … … 1052 1432 CFLAGS: "-m32 -DMRB_INT16=1 -DMRB_NAN_BOXING=1 -DMRB_UTF8_STRING=1" 1053 1433 LDFLAGS: "-m32" 1054 script: env; ./minirake --verbose all test1434 script: env; rake --verbose all test 1055 1435 Test gcc-5 32bit_int64: 1056 1436 stage: test … … 1062 1442 CFLAGS: "-m32 -DMRB_INT64=1" 1063 1443 LDFLAGS: "-m32" 1064 script: env; ./minirake --verbose all test1444 script: env; rake --verbose all test 1065 1445 Test gcc-5 32bit_int64_utf8: 1066 1446 stage: test … … 1072 1452 CFLAGS: "-m32 -DMRB_INT64=1 -DMRB_UTF8_STRING=1" 1073 1453 LDFLAGS: "-m32" 1074 script: env; ./minirake --verbose all test1454 script: env; rake --verbose all test 1075 1455 Test gcc-5 32bit_float: 1456 stage: test 1457 image: registry.gitlab.com/dabroz/mruby:gcc5_0.7 1458 variables: 1459 CC: gcc-5 1460 CXX: g++-5 1461 LD: gcc-5 1462 CFLAGS: "-m32 -DMRB_USE_FLOAT=1" 1463 LDFLAGS: "-m32" 1464 script: env; rake --verbose all test 1465 Test gcc-5 32bit_float_utf8: 1466 stage: test 1467 image: registry.gitlab.com/dabroz/mruby:gcc5_0.7 1468 variables: 1469 CC: gcc-5 1470 CXX: g++-5 1471 LD: gcc-5 1472 CFLAGS: "-m32 -DMRB_USE_FLOAT=1 -DMRB_UTF8_STRING=1" 1473 LDFLAGS: "-m32" 1474 script: env; rake --verbose all test 1475 Test gcc-5 32bit_float_word: 1076 1476 stage: test 1077 1477 image: registry.gitlab.com/dabroz/mruby:gcc5_0.7 … … 1082 1482 CFLAGS: "-m32 -DMRB_USE_FLOAT=1 -DMRB_WORD_BOXING=1" 1083 1483 LDFLAGS: "-m32" 1084 script: env; ./minirake --verbose all test1085 Test gcc-5 32bit_float_ utf8:1484 script: env; rake --verbose all test 1485 Test gcc-5 32bit_float_word_utf8: 1086 1486 stage: test 1087 1487 image: registry.gitlab.com/dabroz/mruby:gcc5_0.7 … … 1092 1492 CFLAGS: "-m32 -DMRB_USE_FLOAT=1 -DMRB_WORD_BOXING=1 -DMRB_UTF8_STRING=1" 1093 1493 LDFLAGS: "-m32" 1094 script: env; ./minirake --verbose all test1494 script: env; rake --verbose all test 1095 1495 Test gcc-5 32bit_float_int16: 1096 1496 stage: test … … 1102 1502 CFLAGS: "-m32 -DMRB_USE_FLOAT=1 -DMRB_INT16=1" 1103 1503 LDFLAGS: "-m32" 1104 script: env; ./minirake --verbose all test1504 script: env; rake --verbose all test 1105 1505 Test gcc-5 32bit_float_int16_utf8: 1106 1506 stage: test … … 1112 1512 CFLAGS: "-m32 -DMRB_USE_FLOAT=1 -DMRB_INT16=1 -DMRB_UTF8_STRING=1" 1113 1513 LDFLAGS: "-m32" 1114 script: env; ./minirake --verbose all test1514 script: env; rake --verbose all test 1115 1515 Test gcc-5 32bit_float_int64: 1116 1516 stage: test … … 1122 1522 CFLAGS: "-m32 -DMRB_USE_FLOAT=1 -DMRB_INT64=1" 1123 1523 LDFLAGS: "-m32" 1124 script: env; ./minirake --verbose all test1524 script: env; rake --verbose all test 1125 1525 Test gcc-5 32bit_float_int64_utf8: 1126 1526 stage: test … … 1132 1532 CFLAGS: "-m32 -DMRB_USE_FLOAT=1 -DMRB_INT64=1 -DMRB_UTF8_STRING=1" 1133 1533 LDFLAGS: "-m32" 1134 script: env; ./minirake --verbose all test1534 script: env; rake --verbose all test 1135 1535 Test gcc-5 64bit: 1536 stage: test 1537 image: registry.gitlab.com/dabroz/mruby:gcc5_0.7 1538 variables: 1539 CC: gcc-5 1540 CXX: g++-5 1541 LD: gcc-5 1542 CFLAGS: '' 1543 LDFLAGS: '' 1544 script: env; rake --verbose all test 1545 Test gcc-5 64bit_utf8: 1546 stage: test 1547 image: registry.gitlab.com/dabroz/mruby:gcc5_0.7 1548 variables: 1549 CC: gcc-5 1550 CXX: g++-5 1551 LD: gcc-5 1552 CFLAGS: "-DMRB_UTF8_STRING=1" 1553 LDFLAGS: '' 1554 script: env; rake --verbose all test 1555 Test gcc-5 64bit_nan: 1556 stage: test 1557 image: registry.gitlab.com/dabroz/mruby:gcc5_0.7 1558 variables: 1559 CC: gcc-5 1560 CXX: g++-5 1561 LD: gcc-5 1562 CFLAGS: "-DMRB_NAN_BOXING=1" 1563 LDFLAGS: '' 1564 script: env; rake --verbose all test 1565 Test gcc-5 64bit_nan_utf8: 1566 stage: test 1567 image: registry.gitlab.com/dabroz/mruby:gcc5_0.7 1568 variables: 1569 CC: gcc-5 1570 CXX: g++-5 1571 LD: gcc-5 1572 CFLAGS: "-DMRB_NAN_BOXING=1 -DMRB_UTF8_STRING=1" 1573 LDFLAGS: '' 1574 script: env; rake --verbose all test 1575 Test gcc-5 64bit_word: 1136 1576 stage: test 1137 1577 image: registry.gitlab.com/dabroz/mruby:gcc5_0.7 … … 1142 1582 CFLAGS: "-DMRB_WORD_BOXING=1" 1143 1583 LDFLAGS: '' 1144 script: env; ./minirake --verbose all test1145 Test gcc-5 64bit_ utf8:1584 script: env; rake --verbose all test 1585 Test gcc-5 64bit_word_utf8: 1146 1586 stage: test 1147 1587 image: registry.gitlab.com/dabroz/mruby:gcc5_0.7 … … 1152 1592 CFLAGS: "-DMRB_WORD_BOXING=1 -DMRB_UTF8_STRING=1" 1153 1593 LDFLAGS: '' 1154 script: env; ./minirake --verbose all test 1155 Test gcc-5 64bit_nan: 1156 stage: test 1157 image: registry.gitlab.com/dabroz/mruby:gcc5_0.7 1158 variables: 1159 CC: gcc-5 1160 CXX: g++-5 1161 LD: gcc-5 1162 CFLAGS: "-DMRB_NAN_BOXING=1" 1163 LDFLAGS: '' 1164 script: env; ./minirake --verbose all test 1165 Test gcc-5 64bit_nan_utf8: 1166 stage: test 1167 image: registry.gitlab.com/dabroz/mruby:gcc5_0.7 1168 variables: 1169 CC: gcc-5 1170 CXX: g++-5 1171 LD: gcc-5 1172 CFLAGS: "-DMRB_NAN_BOXING=1 -DMRB_UTF8_STRING=1" 1173 LDFLAGS: '' 1174 script: env; ./minirake --verbose all test 1594 script: env; rake --verbose all test 1175 1595 Test gcc-5 64bit_int16: 1176 1596 stage: test … … 1182 1602 CFLAGS: "-DMRB_INT16=1" 1183 1603 LDFLAGS: '' 1184 script: env; ./minirake --verbose all test1604 script: env; rake --verbose all test 1185 1605 Test gcc-5 64bit_int16_utf8: 1186 1606 stage: test … … 1192 1612 CFLAGS: "-DMRB_INT16=1 -DMRB_UTF8_STRING=1" 1193 1613 LDFLAGS: '' 1194 script: env; ./minirake --verbose all test1614 script: env; rake --verbose all test 1195 1615 Test gcc-5 64bit_int16_nan: 1196 1616 stage: test … … 1202 1622 CFLAGS: "-DMRB_INT16=1 -DMRB_NAN_BOXING=1" 1203 1623 LDFLAGS: '' 1204 script: env; ./minirake --verbose all test1624 script: env; rake --verbose all test 1205 1625 Test gcc-5 64bit_int16_nan_utf8: 1206 1626 stage: test … … 1212 1632 CFLAGS: "-DMRB_INT16=1 -DMRB_NAN_BOXING=1 -DMRB_UTF8_STRING=1" 1213 1633 LDFLAGS: '' 1214 script: env; ./minirake --verbose all test1634 script: env; rake --verbose all test 1215 1635 Test gcc-5 64bit_int64: 1636 stage: test 1637 image: registry.gitlab.com/dabroz/mruby:gcc5_0.7 1638 variables: 1639 CC: gcc-5 1640 CXX: g++-5 1641 LD: gcc-5 1642 CFLAGS: "-DMRB_INT64=1" 1643 LDFLAGS: '' 1644 script: env; rake --verbose all test 1645 Test gcc-5 64bit_int64_utf8: 1646 stage: test 1647 image: registry.gitlab.com/dabroz/mruby:gcc5_0.7 1648 variables: 1649 CC: gcc-5 1650 CXX: g++-5 1651 LD: gcc-5 1652 CFLAGS: "-DMRB_INT64=1 -DMRB_UTF8_STRING=1" 1653 LDFLAGS: '' 1654 script: env; rake --verbose all test 1655 Test gcc-5 64bit_int64_word: 1216 1656 stage: test 1217 1657 image: registry.gitlab.com/dabroz/mruby:gcc5_0.7 … … 1222 1662 CFLAGS: "-DMRB_INT64=1 -DMRB_WORD_BOXING=1" 1223 1663 LDFLAGS: '' 1224 script: env; ./minirake --verbose all test1225 Test gcc-5 64bit_int64_ utf8:1664 script: env; rake --verbose all test 1665 Test gcc-5 64bit_int64_word_utf8: 1226 1666 stage: test 1227 1667 image: registry.gitlab.com/dabroz/mruby:gcc5_0.7 … … 1232 1672 CFLAGS: "-DMRB_INT64=1 -DMRB_WORD_BOXING=1 -DMRB_UTF8_STRING=1" 1233 1673 LDFLAGS: '' 1234 script: env; ./minirake --verbose all test1674 script: env; rake --verbose all test 1235 1675 Test gcc-5 64bit_float: 1676 stage: test 1677 image: registry.gitlab.com/dabroz/mruby:gcc5_0.7 1678 variables: 1679 CC: gcc-5 1680 CXX: g++-5 1681 LD: gcc-5 1682 CFLAGS: "-DMRB_USE_FLOAT=1" 1683 LDFLAGS: '' 1684 script: env; rake --verbose all test 1685 Test gcc-5 64bit_float_utf8: 1686 stage: test 1687 image: registry.gitlab.com/dabroz/mruby:gcc5_0.7 1688 variables: 1689 CC: gcc-5 1690 CXX: g++-5 1691 LD: gcc-5 1692 CFLAGS: "-DMRB_USE_FLOAT=1 -DMRB_UTF8_STRING=1" 1693 LDFLAGS: '' 1694 script: env; rake --verbose all test 1695 Test gcc-5 64bit_float_word: 1236 1696 stage: test 1237 1697 image: registry.gitlab.com/dabroz/mruby:gcc5_0.7 … … 1242 1702 CFLAGS: "-DMRB_USE_FLOAT=1 -DMRB_WORD_BOXING=1" 1243 1703 LDFLAGS: '' 1244 script: env; ./minirake --verbose all test1245 Test gcc-5 64bit_float_ utf8:1704 script: env; rake --verbose all test 1705 Test gcc-5 64bit_float_word_utf8: 1246 1706 stage: test 1247 1707 image: registry.gitlab.com/dabroz/mruby:gcc5_0.7 … … 1252 1712 CFLAGS: "-DMRB_USE_FLOAT=1 -DMRB_WORD_BOXING=1 -DMRB_UTF8_STRING=1" 1253 1713 LDFLAGS: '' 1254 script: env; ./minirake --verbose all test1714 script: env; rake --verbose all test 1255 1715 Test gcc-5 64bit_float_int16: 1256 1716 stage: test … … 1262 1722 CFLAGS: "-DMRB_USE_FLOAT=1 -DMRB_INT16=1" 1263 1723 LDFLAGS: '' 1264 script: env; ./minirake --verbose all test1724 script: env; rake --verbose all test 1265 1725 Test gcc-5 64bit_float_int16_utf8: 1266 1726 stage: test … … 1272 1732 CFLAGS: "-DMRB_USE_FLOAT=1 -DMRB_INT16=1 -DMRB_UTF8_STRING=1" 1273 1733 LDFLAGS: '' 1274 script: env; ./minirake --verbose all test1734 script: env; rake --verbose all test 1275 1735 Test gcc-5 64bit_float_int64: 1736 stage: test 1737 image: registry.gitlab.com/dabroz/mruby:gcc5_0.7 1738 variables: 1739 CC: gcc-5 1740 CXX: g++-5 1741 LD: gcc-5 1742 CFLAGS: "-DMRB_USE_FLOAT=1 -DMRB_INT64=1" 1743 LDFLAGS: '' 1744 script: env; rake --verbose all test 1745 Test gcc-5 64bit_float_int64_utf8: 1746 stage: test 1747 image: registry.gitlab.com/dabroz/mruby:gcc5_0.7 1748 variables: 1749 CC: gcc-5 1750 CXX: g++-5 1751 LD: gcc-5 1752 CFLAGS: "-DMRB_USE_FLOAT=1 -DMRB_INT64=1 -DMRB_UTF8_STRING=1" 1753 LDFLAGS: '' 1754 script: env; rake --verbose all test 1755 Test gcc-5 64bit_float_int64_word: 1276 1756 stage: test 1277 1757 image: registry.gitlab.com/dabroz/mruby:gcc5_0.7 … … 1282 1762 CFLAGS: "-DMRB_USE_FLOAT=1 -DMRB_INT64=1 -DMRB_WORD_BOXING=1" 1283 1763 LDFLAGS: '' 1284 script: env; ./minirake --verbose all test1285 Test gcc-5 64bit_float_int64_ utf8:1764 script: env; rake --verbose all test 1765 Test gcc-5 64bit_float_int64_word_utf8: 1286 1766 stage: test 1287 1767 image: registry.gitlab.com/dabroz/mruby:gcc5_0.7 … … 1292 1772 CFLAGS: "-DMRB_USE_FLOAT=1 -DMRB_INT64=1 -DMRB_WORD_BOXING=1 -DMRB_UTF8_STRING=1" 1293 1773 LDFLAGS: '' 1294 script: env; ./minirake --verbose all test1774 script: env; rake --verbose all test 1295 1775 Test gcc-6 32bit: 1776 stage: test 1777 image: registry.gitlab.com/dabroz/mruby:gcc6_0.7 1778 variables: 1779 CC: gcc-6 1780 CXX: g++-6 1781 LD: gcc-6 1782 CFLAGS: "-m32 " 1783 LDFLAGS: "-m32" 1784 script: env; rake --verbose all test 1785 Test gcc-6 32bit_utf8: 1786 stage: test 1787 image: registry.gitlab.com/dabroz/mruby:gcc6_0.7 1788 variables: 1789 CC: gcc-6 1790 CXX: g++-6 1791 LD: gcc-6 1792 CFLAGS: "-m32 -DMRB_UTF8_STRING=1" 1793 LDFLAGS: "-m32" 1794 script: env; rake --verbose all test 1795 Test gcc-6 32bit_nan: 1796 stage: test 1797 image: registry.gitlab.com/dabroz/mruby:gcc6_0.7 1798 variables: 1799 CC: gcc-6 1800 CXX: g++-6 1801 LD: gcc-6 1802 CFLAGS: "-m32 -DMRB_NAN_BOXING=1" 1803 LDFLAGS: "-m32" 1804 script: env; rake --verbose all test 1805 Test gcc-6 32bit_nan_utf8: 1806 stage: test 1807 image: registry.gitlab.com/dabroz/mruby:gcc6_0.7 1808 variables: 1809 CC: gcc-6 1810 CXX: g++-6 1811 LD: gcc-6 1812 CFLAGS: "-m32 -DMRB_NAN_BOXING=1 -DMRB_UTF8_STRING=1" 1813 LDFLAGS: "-m32" 1814 script: env; rake --verbose all test 1815 Test gcc-6 32bit_word: 1296 1816 stage: test 1297 1817 image: registry.gitlab.com/dabroz/mruby:gcc6_0.7 … … 1302 1822 CFLAGS: "-m32 -DMRB_WORD_BOXING=1" 1303 1823 LDFLAGS: "-m32" 1304 script: env; ./minirake --verbose all test1305 Test gcc-6 32bit_ utf8:1824 script: env; rake --verbose all test 1825 Test gcc-6 32bit_word_utf8: 1306 1826 stage: test 1307 1827 image: registry.gitlab.com/dabroz/mruby:gcc6_0.7 … … 1312 1832 CFLAGS: "-m32 -DMRB_WORD_BOXING=1 -DMRB_UTF8_STRING=1" 1313 1833 LDFLAGS: "-m32" 1314 script: env; ./minirake --verbose all test 1315 Test gcc-6 32bit_nan: 1316 stage: test 1317 image: registry.gitlab.com/dabroz/mruby:gcc6_0.7 1318 variables: 1319 CC: gcc-6 1320 CXX: g++-6 1321 LD: gcc-6 1322 CFLAGS: "-m32 -DMRB_NAN_BOXING=1" 1323 LDFLAGS: "-m32" 1324 script: env; ./minirake --verbose all test 1325 Test gcc-6 32bit_nan_utf8: 1326 stage: test 1327 image: registry.gitlab.com/dabroz/mruby:gcc6_0.7 1328 variables: 1329 CC: gcc-6 1330 CXX: g++-6 1331 LD: gcc-6 1332 CFLAGS: "-m32 -DMRB_NAN_BOXING=1 -DMRB_UTF8_STRING=1" 1333 LDFLAGS: "-m32" 1334 script: env; ./minirake --verbose all test 1834 script: env; rake --verbose all test 1335 1835 Test gcc-6 32bit_int16: 1336 1836 stage: test … … 1342 1842 CFLAGS: "-m32 -DMRB_INT16=1" 1343 1843 LDFLAGS: "-m32" 1344 script: env; ./minirake --verbose all test1844 script: env; rake --verbose all test 1345 1845 Test gcc-6 32bit_int16_utf8: 1346 1846 stage: test … … 1352 1852 CFLAGS: "-m32 -DMRB_INT16=1 -DMRB_UTF8_STRING=1" 1353 1853 LDFLAGS: "-m32" 1354 script: env; ./minirake --verbose all test1854 script: env; rake --verbose all test 1355 1855 Test gcc-6 32bit_int16_nan: 1356 1856 stage: test … … 1362 1862 CFLAGS: "-m32 -DMRB_INT16=1 -DMRB_NAN_BOXING=1" 1363 1863 LDFLAGS: "-m32" 1364 script: env; ./minirake --verbose all test1864 script: env; rake --verbose all test 1365 1865 Test gcc-6 32bit_int16_nan_utf8: 1366 1866 stage: test … … 1372 1872 CFLAGS: "-m32 -DMRB_INT16=1 -DMRB_NAN_BOXING=1 -DMRB_UTF8_STRING=1" 1373 1873 LDFLAGS: "-m32" 1374 script: env; ./minirake --verbose all test1874 script: env; rake --verbose all test 1375 1875 Test gcc-6 32bit_int64: 1376 1876 stage: test … … 1382 1882 CFLAGS: "-m32 -DMRB_INT64=1" 1383 1883 LDFLAGS: "-m32" 1384 script: env; ./minirake --verbose all test1884 script: env; rake --verbose all test 1385 1885 Test gcc-6 32bit_int64_utf8: 1386 1886 stage: test … … 1392 1892 CFLAGS: "-m32 -DMRB_INT64=1 -DMRB_UTF8_STRING=1" 1393 1893 LDFLAGS: "-m32" 1394 script: env; ./minirake --verbose all test1894 script: env; rake --verbose all test 1395 1895 Test gcc-6 32bit_float: 1896 stage: test 1897 image: registry.gitlab.com/dabroz/mruby:gcc6_0.7 1898 variables: 1899 CC: gcc-6 1900 CXX: g++-6 1901 LD: gcc-6 1902 CFLAGS: "-m32 -DMRB_USE_FLOAT=1" 1903 LDFLAGS: "-m32" 1904 script: env; rake --verbose all test 1905 Test gcc-6 32bit_float_utf8: 1906 stage: test 1907 image: registry.gitlab.com/dabroz/mruby:gcc6_0.7 1908 variables: 1909 CC: gcc-6 1910 CXX: g++-6 1911 LD: gcc-6 1912 CFLAGS: "-m32 -DMRB_USE_FLOAT=1 -DMRB_UTF8_STRING=1" 1913 LDFLAGS: "-m32" 1914 script: env; rake --verbose all test 1915 Test gcc-6 32bit_float_word: 1396 1916 stage: test 1397 1917 image: registry.gitlab.com/dabroz/mruby:gcc6_0.7 … … 1402 1922 CFLAGS: "-m32 -DMRB_USE_FLOAT=1 -DMRB_WORD_BOXING=1" 1403 1923 LDFLAGS: "-m32" 1404 script: env; ./minirake --verbose all test1405 Test gcc-6 32bit_float_ utf8:1924 script: env; rake --verbose all test 1925 Test gcc-6 32bit_float_word_utf8: 1406 1926 stage: test 1407 1927 image: registry.gitlab.com/dabroz/mruby:gcc6_0.7 … … 1412 1932 CFLAGS: "-m32 -DMRB_USE_FLOAT=1 -DMRB_WORD_BOXING=1 -DMRB_UTF8_STRING=1" 1413 1933 LDFLAGS: "-m32" 1414 script: env; ./minirake --verbose all test1934 script: env; rake --verbose all test 1415 1935 Test gcc-6 32bit_float_int16: 1416 1936 stage: test … … 1422 1942 CFLAGS: "-m32 -DMRB_USE_FLOAT=1 -DMRB_INT16=1" 1423 1943 LDFLAGS: "-m32" 1424 script: env; ./minirake --verbose all test1944 script: env; rake --verbose all test 1425 1945 Test gcc-6 32bit_float_int16_utf8: 1426 1946 stage: test … … 1432 1952 CFLAGS: "-m32 -DMRB_USE_FLOAT=1 -DMRB_INT16=1 -DMRB_UTF8_STRING=1" 1433 1953 LDFLAGS: "-m32" 1434 script: env; ./minirake --verbose all test1954 script: env; rake --verbose all test 1435 1955 Test gcc-6 32bit_float_int64: 1436 1956 stage: test … … 1442 1962 CFLAGS: "-m32 -DMRB_USE_FLOAT=1 -DMRB_INT64=1" 1443 1963 LDFLAGS: "-m32" 1444 script: env; ./minirake --verbose all test1964 script: env; rake --verbose all test 1445 1965 Test gcc-6 32bit_float_int64_utf8: 1446 1966 stage: test … … 1452 1972 CFLAGS: "-m32 -DMRB_USE_FLOAT=1 -DMRB_INT64=1 -DMRB_UTF8_STRING=1" 1453 1973 LDFLAGS: "-m32" 1454 script: env; ./minirake --verbose all test1974 script: env; rake --verbose all test 1455 1975 Test gcc-6 64bit: 1976 stage: test 1977 image: registry.gitlab.com/dabroz/mruby:gcc6_0.7 1978 variables: 1979 CC: gcc-6 1980 CXX: g++-6 1981 LD: gcc-6 1982 CFLAGS: '' 1983 LDFLAGS: '' 1984 script: env; rake --verbose all test 1985 Test gcc-6 64bit_utf8: 1986 stage: test 1987 image: registry.gitlab.com/dabroz/mruby:gcc6_0.7 1988 variables: 1989 CC: gcc-6 1990 CXX: g++-6 1991 LD: gcc-6 1992 CFLAGS: "-DMRB_UTF8_STRING=1" 1993 LDFLAGS: '' 1994 script: env; rake --verbose all test 1995 Test gcc-6 64bit_nan: 1996 stage: test 1997 image: registry.gitlab.com/dabroz/mruby:gcc6_0.7 1998 variables: 1999 CC: gcc-6 2000 CXX: g++-6 2001 LD: gcc-6 2002 CFLAGS: "-DMRB_NAN_BOXING=1" 2003 LDFLAGS: '' 2004 script: env; rake --verbose all test 2005 Test gcc-6 64bit_nan_utf8: 2006 stage: test 2007 image: registry.gitlab.com/dabroz/mruby:gcc6_0.7 2008 variables: 2009 CC: gcc-6 2010 CXX: g++-6 2011 LD: gcc-6 2012 CFLAGS: "-DMRB_NAN_BOXING=1 -DMRB_UTF8_STRING=1" 2013 LDFLAGS: '' 2014 script: env; rake --verbose all test 2015 Test gcc-6 64bit_word: 1456 2016 stage: test 1457 2017 image: registry.gitlab.com/dabroz/mruby:gcc6_0.7 … … 1462 2022 CFLAGS: "-DMRB_WORD_BOXING=1" 1463 2023 LDFLAGS: '' 1464 script: env; ./minirake --verbose all test1465 Test gcc-6 64bit_ utf8:2024 script: env; rake --verbose all test 2025 Test gcc-6 64bit_word_utf8: 1466 2026 stage: test 1467 2027 image: registry.gitlab.com/dabroz/mruby:gcc6_0.7 … … 1472 2032 CFLAGS: "-DMRB_WORD_BOXING=1 -DMRB_UTF8_STRING=1" 1473 2033 LDFLAGS: '' 1474 script: env; ./minirake --verbose all test 1475 Test gcc-6 64bit_nan: 1476 stage: test 1477 image: registry.gitlab.com/dabroz/mruby:gcc6_0.7 1478 variables: 1479 CC: gcc-6 1480 CXX: g++-6 1481 LD: gcc-6 1482 CFLAGS: "-DMRB_NAN_BOXING=1" 1483 LDFLAGS: '' 1484 script: env; ./minirake --verbose all test 1485 Test gcc-6 64bit_nan_utf8: 1486 stage: test 1487 image: registry.gitlab.com/dabroz/mruby:gcc6_0.7 1488 variables: 1489 CC: gcc-6 1490 CXX: g++-6 1491 LD: gcc-6 1492 CFLAGS: "-DMRB_NAN_BOXING=1 -DMRB_UTF8_STRING=1" 1493 LDFLAGS: '' 1494 script: env; ./minirake --verbose all test 2034 script: env; rake --verbose all test 1495 2035 Test gcc-6 64bit_int16: 1496 2036 stage: test … … 1502 2042 CFLAGS: "-DMRB_INT16=1" 1503 2043 LDFLAGS: '' 1504 script: env; ./minirake --verbose all test2044 script: env; rake --verbose all test 1505 2045 Test gcc-6 64bit_int16_utf8: 1506 2046 stage: test … … 1512 2052 CFLAGS: "-DMRB_INT16=1 -DMRB_UTF8_STRING=1" 1513 2053 LDFLAGS: '' 1514 script: env; ./minirake --verbose all test2054 script: env; rake --verbose all test 1515 2055 Test gcc-6 64bit_int16_nan: 1516 2056 stage: test … … 1522 2062 CFLAGS: "-DMRB_INT16=1 -DMRB_NAN_BOXING=1" 1523 2063 LDFLAGS: '' 1524 script: env; ./minirake --verbose all test2064 script: env; rake --verbose all test 1525 2065 Test gcc-6 64bit_int16_nan_utf8: 1526 2066 stage: test … … 1532 2072 CFLAGS: "-DMRB_INT16=1 -DMRB_NAN_BOXING=1 -DMRB_UTF8_STRING=1" 1533 2073 LDFLAGS: '' 1534 script: env; ./minirake --verbose all test2074 script: env; rake --verbose all test 1535 2075 Test gcc-6 64bit_int64: 2076 stage: test 2077 image: registry.gitlab.com/dabroz/mruby:gcc6_0.7 2078 variables: 2079 CC: gcc-6 2080 CXX: g++-6 2081 LD: gcc-6 2082 CFLAGS: "-DMRB_INT64=1" 2083 LDFLAGS: '' 2084 script: env; rake --verbose all test 2085 Test gcc-6 64bit_int64_utf8: 2086 stage: test 2087 image: registry.gitlab.com/dabroz/mruby:gcc6_0.7 2088 variables: 2089 CC: gcc-6 2090 CXX: g++-6 2091 LD: gcc-6 2092 CFLAGS: "-DMRB_INT64=1 -DMRB_UTF8_STRING=1" 2093 LDFLAGS: '' 2094 script: env; rake --verbose all test 2095 Test gcc-6 64bit_int64_word: 1536 2096 stage: test 1537 2097 image: registry.gitlab.com/dabroz/mruby:gcc6_0.7 … … 1542 2102 CFLAGS: "-DMRB_INT64=1 -DMRB_WORD_BOXING=1" 1543 2103 LDFLAGS: '' 1544 script: env; ./minirake --verbose all test1545 Test gcc-6 64bit_int64_ utf8:2104 script: env; rake --verbose all test 2105 Test gcc-6 64bit_int64_word_utf8: 1546 2106 stage: test 1547 2107 image: registry.gitlab.com/dabroz/mruby:gcc6_0.7 … … 1552 2112 CFLAGS: "-DMRB_INT64=1 -DMRB_WORD_BOXING=1 -DMRB_UTF8_STRING=1" 1553 2113 LDFLAGS: '' 1554 script: env; ./minirake --verbose all test2114 script: env; rake --verbose all test 1555 2115 Test gcc-6 64bit_float: 2116 stage: test 2117 image: registry.gitlab.com/dabroz/mruby:gcc6_0.7 2118 variables: 2119 CC: gcc-6 2120 CXX: g++-6 2121 LD: gcc-6 2122 CFLAGS: "-DMRB_USE_FLOAT=1" 2123 LDFLAGS: '' 2124 script: env; rake --verbose all test 2125 Test gcc-6 64bit_float_utf8: 2126 stage: test 2127 image: registry.gitlab.com/dabroz/mruby:gcc6_0.7 2128 variables: 2129 CC: gcc-6 2130 CXX: g++-6 2131 LD: gcc-6 2132 CFLAGS: "-DMRB_USE_FLOAT=1 -DMRB_UTF8_STRING=1" 2133 LDFLAGS: '' 2134 script: env; rake --verbose all test 2135 Test gcc-6 64bit_float_word: 1556 2136 stage: test 1557 2137 image: registry.gitlab.com/dabroz/mruby:gcc6_0.7 … … 1562 2142 CFLAGS: "-DMRB_USE_FLOAT=1 -DMRB_WORD_BOXING=1" 1563 2143 LDFLAGS: '' 1564 script: env; ./minirake --verbose all test1565 Test gcc-6 64bit_float_ utf8:2144 script: env; rake --verbose all test 2145 Test gcc-6 64bit_float_word_utf8: 1566 2146 stage: test 1567 2147 image: registry.gitlab.com/dabroz/mruby:gcc6_0.7 … … 1572 2152 CFLAGS: "-DMRB_USE_FLOAT=1 -DMRB_WORD_BOXING=1 -DMRB_UTF8_STRING=1" 1573 2153 LDFLAGS: '' 1574 script: env; ./minirake --verbose all test2154 script: env; rake --verbose all test 1575 2155 Test gcc-6 64bit_float_int16: 1576 2156 stage: test … … 1582 2162 CFLAGS: "-DMRB_USE_FLOAT=1 -DMRB_INT16=1" 1583 2163 LDFLAGS: '' 1584 script: env; ./minirake --verbose all test2164 script: env; rake --verbose all test 1585 2165 Test gcc-6 64bit_float_int16_utf8: 1586 2166 stage: test … … 1592 2172 CFLAGS: "-DMRB_USE_FLOAT=1 -DMRB_INT16=1 -DMRB_UTF8_STRING=1" 1593 2173 LDFLAGS: '' 1594 script: env; ./minirake --verbose all test2174 script: env; rake --verbose all test 1595 2175 Test gcc-6 64bit_float_int64: 2176 stage: test 2177 image: registry.gitlab.com/dabroz/mruby:gcc6_0.7 2178 variables: 2179 CC: gcc-6 2180 CXX: g++-6 2181 LD: gcc-6 2182 CFLAGS: "-DMRB_USE_FLOAT=1 -DMRB_INT64=1" 2183 LDFLAGS: '' 2184 script: env; rake --verbose all test 2185 Test gcc-6 64bit_float_int64_utf8: 2186 stage: test 2187 image: registry.gitlab.com/dabroz/mruby:gcc6_0.7 2188 variables: 2189 CC: gcc-6 2190 CXX: g++-6 2191 LD: gcc-6 2192 CFLAGS: "-DMRB_USE_FLOAT=1 -DMRB_INT64=1 -DMRB_UTF8_STRING=1" 2193 LDFLAGS: '' 2194 script: env; rake --verbose all test 2195 Test gcc-6 64bit_float_int64_word: 1596 2196 stage: test 1597 2197 image: registry.gitlab.com/dabroz/mruby:gcc6_0.7 … … 1602 2202 CFLAGS: "-DMRB_USE_FLOAT=1 -DMRB_INT64=1 -DMRB_WORD_BOXING=1" 1603 2203 LDFLAGS: '' 1604 script: env; ./minirake --verbose all test1605 Test gcc-6 64bit_float_int64_ utf8:2204 script: env; rake --verbose all test 2205 Test gcc-6 64bit_float_int64_word_utf8: 1606 2206 stage: test 1607 2207 image: registry.gitlab.com/dabroz/mruby:gcc6_0.7 … … 1612 2212 CFLAGS: "-DMRB_USE_FLOAT=1 -DMRB_INT64=1 -DMRB_WORD_BOXING=1 -DMRB_UTF8_STRING=1" 1613 2213 LDFLAGS: '' 1614 script: env; ./minirake --verbose all test2214 script: env; rake --verbose all test 1615 2215 Test clang-3.5 32bit: 2216 stage: test 2217 image: registry.gitlab.com/dabroz/mruby:clang35_0.7 2218 variables: 2219 CC: clang-3.5 2220 CXX: clang++-3.5 2221 LD: clang-3.5 2222 CFLAGS: "-m32 " 2223 LDFLAGS: "-m32" 2224 script: env; rake --verbose all test 2225 Test clang-3.5 32bit_utf8: 2226 stage: test 2227 image: registry.gitlab.com/dabroz/mruby:clang35_0.7 2228 variables: 2229 CC: clang-3.5 2230 CXX: clang++-3.5 2231 LD: clang-3.5 2232 CFLAGS: "-m32 -DMRB_UTF8_STRING=1" 2233 LDFLAGS: "-m32" 2234 script: env; rake --verbose all test 2235 Test clang-3.5 32bit_nan: 2236 stage: test 2237 image: registry.gitlab.com/dabroz/mruby:clang35_0.7 2238 variables: 2239 CC: clang-3.5 2240 CXX: clang++-3.5 2241 LD: clang-3.5 2242 CFLAGS: "-m32 -DMRB_NAN_BOXING=1" 2243 LDFLAGS: "-m32" 2244 script: env; rake --verbose all test 2245 Test clang-3.5 32bit_nan_utf8: 2246 stage: test 2247 image: registry.gitlab.com/dabroz/mruby:clang35_0.7 2248 variables: 2249 CC: clang-3.5 2250 CXX: clang++-3.5 2251 LD: clang-3.5 2252 CFLAGS: "-m32 -DMRB_NAN_BOXING=1 -DMRB_UTF8_STRING=1" 2253 LDFLAGS: "-m32" 2254 script: env; rake --verbose all test 2255 Test clang-3.5 32bit_word: 1616 2256 stage: test 1617 2257 image: registry.gitlab.com/dabroz/mruby:clang35_0.7 … … 1622 2262 CFLAGS: "-m32 -DMRB_WORD_BOXING=1" 1623 2263 LDFLAGS: "-m32" 1624 script: env; ./minirake --verbose all test1625 Test clang-3.5 32bit_ utf8:2264 script: env; rake --verbose all test 2265 Test clang-3.5 32bit_word_utf8: 1626 2266 stage: test 1627 2267 image: registry.gitlab.com/dabroz/mruby:clang35_0.7 … … 1632 2272 CFLAGS: "-m32 -DMRB_WORD_BOXING=1 -DMRB_UTF8_STRING=1" 1633 2273 LDFLAGS: "-m32" 1634 script: env; ./minirake --verbose all test 1635 Test clang-3.5 32bit_nan: 1636 stage: test 1637 image: registry.gitlab.com/dabroz/mruby:clang35_0.7 1638 variables: 1639 CC: clang-3.5 1640 CXX: clang++-3.5 1641 LD: clang-3.5 1642 CFLAGS: "-m32 -DMRB_NAN_BOXING=1" 1643 LDFLAGS: "-m32" 1644 script: env; ./minirake --verbose all test 1645 Test clang-3.5 32bit_nan_utf8: 1646 stage: test 1647 image: registry.gitlab.com/dabroz/mruby:clang35_0.7 1648 variables: 1649 CC: clang-3.5 1650 CXX: clang++-3.5 1651 LD: clang-3.5 1652 CFLAGS: "-m32 -DMRB_NAN_BOXING=1 -DMRB_UTF8_STRING=1" 1653 LDFLAGS: "-m32" 1654 script: env; ./minirake --verbose all test 2274 script: env; rake --verbose all test 1655 2275 Test clang-3.5 32bit_int16: 1656 2276 stage: test … … 1662 2282 CFLAGS: "-m32 -DMRB_INT16=1" 1663 2283 LDFLAGS: "-m32" 1664 script: env; ./minirake --verbose all test2284 script: env; rake --verbose all test 1665 2285 Test clang-3.5 32bit_int16_utf8: 1666 2286 stage: test … … 1672 2292 CFLAGS: "-m32 -DMRB_INT16=1 -DMRB_UTF8_STRING=1" 1673 2293 LDFLAGS: "-m32" 1674 script: env; ./minirake --verbose all test2294 script: env; rake --verbose all test 1675 2295 Test clang-3.5 32bit_int16_nan: 1676 2296 stage: test … … 1682 2302 CFLAGS: "-m32 -DMRB_INT16=1 -DMRB_NAN_BOXING=1" 1683 2303 LDFLAGS: "-m32" 1684 script: env; ./minirake --verbose all test2304 script: env; rake --verbose all test 1685 2305 Test clang-3.5 32bit_int16_nan_utf8: 1686 2306 stage: test … … 1692 2312 CFLAGS: "-m32 -DMRB_INT16=1 -DMRB_NAN_BOXING=1 -DMRB_UTF8_STRING=1" 1693 2313 LDFLAGS: "-m32" 1694 script: env; ./minirake --verbose all test2314 script: env; rake --verbose all test 1695 2315 Test clang-3.5 32bit_int64: 1696 2316 stage: test … … 1702 2322 CFLAGS: "-m32 -DMRB_INT64=1" 1703 2323 LDFLAGS: "-m32" 1704 script: env; ./minirake --verbose all test2324 script: env; rake --verbose all test 1705 2325 Test clang-3.5 32bit_int64_utf8: 1706 2326 stage: test … … 1712 2332 CFLAGS: "-m32 -DMRB_INT64=1 -DMRB_UTF8_STRING=1" 1713 2333 LDFLAGS: "-m32" 1714 script: env; ./minirake --verbose all test2334 script: env; rake --verbose all test 1715 2335 Test clang-3.5 32bit_float: 2336 stage: test 2337 image: registry.gitlab.com/dabroz/mruby:clang35_0.7 2338 variables: 2339 CC: clang-3.5 2340 CXX: clang++-3.5 2341 LD: clang-3.5 2342 CFLAGS: "-m32 -DMRB_USE_FLOAT=1" 2343 LDFLAGS: "-m32" 2344 script: env; rake --verbose all test 2345 Test clang-3.5 32bit_float_utf8: 2346 stage: test 2347 image: registry.gitlab.com/dabroz/mruby:clang35_0.7 2348 variables: 2349 CC: clang-3.5 2350 CXX: clang++-3.5 2351 LD: clang-3.5 2352 CFLAGS: "-m32 -DMRB_USE_FLOAT=1 -DMRB_UTF8_STRING=1" 2353 LDFLAGS: "-m32" 2354 script: env; rake --verbose all test 2355 Test clang-3.5 32bit_float_word: 1716 2356 stage: test 1717 2357 image: registry.gitlab.com/dabroz/mruby:clang35_0.7 … … 1722 2362 CFLAGS: "-m32 -DMRB_USE_FLOAT=1 -DMRB_WORD_BOXING=1" 1723 2363 LDFLAGS: "-m32" 1724 script: env; ./minirake --verbose all test1725 Test clang-3.5 32bit_float_ utf8:2364 script: env; rake --verbose all test 2365 Test clang-3.5 32bit_float_word_utf8: 1726 2366 stage: test 1727 2367 image: registry.gitlab.com/dabroz/mruby:clang35_0.7 … … 1732 2372 CFLAGS: "-m32 -DMRB_USE_FLOAT=1 -DMRB_WORD_BOXING=1 -DMRB_UTF8_STRING=1" 1733 2373 LDFLAGS: "-m32" 1734 script: env; ./minirake --verbose all test2374 script: env; rake --verbose all test 1735 2375 Test clang-3.5 32bit_float_int16: 1736 2376 stage: test … … 1742 2382 CFLAGS: "-m32 -DMRB_USE_FLOAT=1 -DMRB_INT16=1" 1743 2383 LDFLAGS: "-m32" 1744 script: env; ./minirake --verbose all test2384 script: env; rake --verbose all test 1745 2385 Test clang-3.5 32bit_float_int16_utf8: 1746 2386 stage: test … … 1752 2392 CFLAGS: "-m32 -DMRB_USE_FLOAT=1 -DMRB_INT16=1 -DMRB_UTF8_STRING=1" 1753 2393 LDFLAGS: "-m32" 1754 script: env; ./minirake --verbose all test2394 script: env; rake --verbose all test 1755 2395 Test clang-3.5 32bit_float_int64: 1756 2396 stage: test … … 1762 2402 CFLAGS: "-m32 -DMRB_USE_FLOAT=1 -DMRB_INT64=1" 1763 2403 LDFLAGS: "-m32" 1764 script: env; ./minirake --verbose all test2404 script: env; rake --verbose all test 1765 2405 Test clang-3.5 32bit_float_int64_utf8: 1766 2406 stage: test … … 1772 2412 CFLAGS: "-m32 -DMRB_USE_FLOAT=1 -DMRB_INT64=1 -DMRB_UTF8_STRING=1" 1773 2413 LDFLAGS: "-m32" 1774 script: env; ./minirake --verbose all test2414 script: env; rake --verbose all test 1775 2415 Test clang-3.5 64bit: 2416 stage: test 2417 image: registry.gitlab.com/dabroz/mruby:clang35_0.7 2418 variables: 2419 CC: clang-3.5 2420 CXX: clang++-3.5 2421 LD: clang-3.5 2422 CFLAGS: '' 2423 LDFLAGS: '' 2424 script: env; rake --verbose all test 2425 Test clang-3.5 64bit_utf8: 2426 stage: test 2427 image: registry.gitlab.com/dabroz/mruby:clang35_0.7 2428 variables: 2429 CC: clang-3.5 2430 CXX: clang++-3.5 2431 LD: clang-3.5 2432 CFLAGS: "-DMRB_UTF8_STRING=1" 2433 LDFLAGS: '' 2434 script: env; rake --verbose all test 2435 Test clang-3.5 64bit_nan: 2436 stage: test 2437 image: registry.gitlab.com/dabroz/mruby:clang35_0.7 2438 variables: 2439 CC: clang-3.5 2440 CXX: clang++-3.5 2441 LD: clang-3.5 2442 CFLAGS: "-DMRB_NAN_BOXING=1" 2443 LDFLAGS: '' 2444 script: env; rake --verbose all test 2445 Test clang-3.5 64bit_nan_utf8: 2446 stage: test 2447 image: registry.gitlab.com/dabroz/mruby:clang35_0.7 2448 variables: 2449 CC: clang-3.5 2450 CXX: clang++-3.5 2451 LD: clang-3.5 2452 CFLAGS: "-DMRB_NAN_BOXING=1 -DMRB_UTF8_STRING=1" 2453 LDFLAGS: '' 2454 script: env; rake --verbose all test 2455 Test clang-3.5 64bit_word: 1776 2456 stage: test 1777 2457 image: registry.gitlab.com/dabroz/mruby:clang35_0.7 … … 1782 2462 CFLAGS: "-DMRB_WORD_BOXING=1" 1783 2463 LDFLAGS: '' 1784 script: env; ./minirake --verbose all test1785 Test clang-3.5 64bit_ utf8:2464 script: env; rake --verbose all test 2465 Test clang-3.5 64bit_word_utf8: 1786 2466 stage: test 1787 2467 image: registry.gitlab.com/dabroz/mruby:clang35_0.7 … … 1792 2472 CFLAGS: "-DMRB_WORD_BOXING=1 -DMRB_UTF8_STRING=1" 1793 2473 LDFLAGS: '' 1794 script: env; ./minirake --verbose all test 1795 Test clang-3.5 64bit_nan: 1796 stage: test 1797 image: registry.gitlab.com/dabroz/mruby:clang35_0.7 1798 variables: 1799 CC: clang-3.5 1800 CXX: clang++-3.5 1801 LD: clang-3.5 1802 CFLAGS: "-DMRB_NAN_BOXING=1" 1803 LDFLAGS: '' 1804 script: env; ./minirake --verbose all test 1805 Test clang-3.5 64bit_nan_utf8: 1806 stage: test 1807 image: registry.gitlab.com/dabroz/mruby:clang35_0.7 1808 variables: 1809 CC: clang-3.5 1810 CXX: clang++-3.5 1811 LD: clang-3.5 1812 CFLAGS: "-DMRB_NAN_BOXING=1 -DMRB_UTF8_STRING=1" 1813 LDFLAGS: '' 1814 script: env; ./minirake --verbose all test 2474 script: env; rake --verbose all test 1815 2475 Test clang-3.5 64bit_int16: 1816 2476 stage: test … … 1822 2482 CFLAGS: "-DMRB_INT16=1" 1823 2483 LDFLAGS: '' 1824 script: env; ./minirake --verbose all test2484 script: env; rake --verbose all test 1825 2485 Test clang-3.5 64bit_int16_utf8: 1826 2486 stage: test … … 1832 2492 CFLAGS: "-DMRB_INT16=1 -DMRB_UTF8_STRING=1" 1833 2493 LDFLAGS: '' 1834 script: env; ./minirake --verbose all test2494 script: env; rake --verbose all test 1835 2495 Test clang-3.5 64bit_int16_nan: 1836 2496 stage: test … … 1842 2502 CFLAGS: "-DMRB_INT16=1 -DMRB_NAN_BOXING=1" 1843 2503 LDFLAGS: '' 1844 script: env; ./minirake --verbose all test2504 script: env; rake --verbose all test 1845 2505 Test clang-3.5 64bit_int16_nan_utf8: 1846 2506 stage: test … … 1852 2512 CFLAGS: "-DMRB_INT16=1 -DMRB_NAN_BOXING=1 -DMRB_UTF8_STRING=1" 1853 2513 LDFLAGS: '' 1854 script: env; ./minirake --verbose all test2514 script: env; rake --verbose all test 1855 2515 Test clang-3.5 64bit_int64: 2516 stage: test 2517 image: registry.gitlab.com/dabroz/mruby:clang35_0.7 2518 variables: 2519 CC: clang-3.5 2520 CXX: clang++-3.5 2521 LD: clang-3.5 2522 CFLAGS: "-DMRB_INT64=1" 2523 LDFLAGS: '' 2524 script: env; rake --verbose all test 2525 Test clang-3.5 64bit_int64_utf8: 2526 stage: test 2527 image: registry.gitlab.com/dabroz/mruby:clang35_0.7 2528 variables: 2529 CC: clang-3.5 2530 CXX: clang++-3.5 2531 LD: clang-3.5 2532 CFLAGS: "-DMRB_INT64=1 -DMRB_UTF8_STRING=1" 2533 LDFLAGS: '' 2534 script: env; rake --verbose all test 2535 Test clang-3.5 64bit_int64_word: 1856 2536 stage: test 1857 2537 image: registry.gitlab.com/dabroz/mruby:clang35_0.7 … … 1862 2542 CFLAGS: "-DMRB_INT64=1 -DMRB_WORD_BOXING=1" 1863 2543 LDFLAGS: '' 1864 script: env; ./minirake --verbose all test1865 Test clang-3.5 64bit_int64_ utf8:2544 script: env; rake --verbose all test 2545 Test clang-3.5 64bit_int64_word_utf8: 1866 2546 stage: test 1867 2547 image: registry.gitlab.com/dabroz/mruby:clang35_0.7 … … 1872 2552 CFLAGS: "-DMRB_INT64=1 -DMRB_WORD_BOXING=1 -DMRB_UTF8_STRING=1" 1873 2553 LDFLAGS: '' 1874 script: env; ./minirake --verbose all test2554 script: env; rake --verbose all test 1875 2555 Test clang-3.5 64bit_float: 2556 stage: test 2557 image: registry.gitlab.com/dabroz/mruby:clang35_0.7 2558 variables: 2559 CC: clang-3.5 2560 CXX: clang++-3.5 2561 LD: clang-3.5 2562 CFLAGS: "-DMRB_USE_FLOAT=1" 2563 LDFLAGS: '' 2564 script: env; rake --verbose all test 2565 Test clang-3.5 64bit_float_utf8: 2566 stage: test 2567 image: registry.gitlab.com/dabroz/mruby:clang35_0.7 2568 variables: 2569 CC: clang-3.5 2570 CXX: clang++-3.5 2571 LD: clang-3.5 2572 CFLAGS: "-DMRB_USE_FLOAT=1 -DMRB_UTF8_STRING=1" 2573 LDFLAGS: '' 2574 script: env; rake --verbose all test 2575 Test clang-3.5 64bit_float_word: 1876 2576 stage: test 1877 2577 image: registry.gitlab.com/dabroz/mruby:clang35_0.7 … … 1882 2582 CFLAGS: "-DMRB_USE_FLOAT=1 -DMRB_WORD_BOXING=1" 1883 2583 LDFLAGS: '' 1884 script: env; ./minirake --verbose all test1885 Test clang-3.5 64bit_float_ utf8:2584 script: env; rake --verbose all test 2585 Test clang-3.5 64bit_float_word_utf8: 1886 2586 stage: test 1887 2587 image: registry.gitlab.com/dabroz/mruby:clang35_0.7 … … 1892 2592 CFLAGS: "-DMRB_USE_FLOAT=1 -DMRB_WORD_BOXING=1 -DMRB_UTF8_STRING=1" 1893 2593 LDFLAGS: '' 1894 script: env; ./minirake --verbose all test2594 script: env; rake --verbose all test 1895 2595 Test clang-3.5 64bit_float_int16: 1896 2596 stage: test … … 1902 2602 CFLAGS: "-DMRB_USE_FLOAT=1 -DMRB_INT16=1" 1903 2603 LDFLAGS: '' 1904 script: env; ./minirake --verbose all test2604 script: env; rake --verbose all test 1905 2605 Test clang-3.5 64bit_float_int16_utf8: 1906 2606 stage: test … … 1912 2612 CFLAGS: "-DMRB_USE_FLOAT=1 -DMRB_INT16=1 -DMRB_UTF8_STRING=1" 1913 2613 LDFLAGS: '' 1914 script: env; ./minirake --verbose all test2614 script: env; rake --verbose all test 1915 2615 Test clang-3.5 64bit_float_int64: 2616 stage: test 2617 image: registry.gitlab.com/dabroz/mruby:clang35_0.7 2618 variables: 2619 CC: clang-3.5 2620 CXX: clang++-3.5 2621 LD: clang-3.5 2622 CFLAGS: "-DMRB_USE_FLOAT=1 -DMRB_INT64=1" 2623 LDFLAGS: '' 2624 script: env; rake --verbose all test 2625 Test clang-3.5 64bit_float_int64_utf8: 2626 stage: test 2627 image: registry.gitlab.com/dabroz/mruby:clang35_0.7 2628 variables: 2629 CC: clang-3.5 2630 CXX: clang++-3.5 2631 LD: clang-3.5 2632 CFLAGS: "-DMRB_USE_FLOAT=1 -DMRB_INT64=1 -DMRB_UTF8_STRING=1" 2633 LDFLAGS: '' 2634 script: env; rake --verbose all test 2635 Test clang-3.5 64bit_float_int64_word: 1916 2636 stage: test 1917 2637 image: registry.gitlab.com/dabroz/mruby:clang35_0.7 … … 1922 2642 CFLAGS: "-DMRB_USE_FLOAT=1 -DMRB_INT64=1 -DMRB_WORD_BOXING=1" 1923 2643 LDFLAGS: '' 1924 script: env; ./minirake --verbose all test1925 Test clang-3.5 64bit_float_int64_ utf8:2644 script: env; rake --verbose all test 2645 Test clang-3.5 64bit_float_int64_word_utf8: 1926 2646 stage: test 1927 2647 image: registry.gitlab.com/dabroz/mruby:clang35_0.7 … … 1932 2652 CFLAGS: "-DMRB_USE_FLOAT=1 -DMRB_INT64=1 -DMRB_WORD_BOXING=1 -DMRB_UTF8_STRING=1" 1933 2653 LDFLAGS: '' 1934 script: env; ./minirake --verbose all test2654 script: env; rake --verbose all test 1935 2655 Test clang-3.6 32bit: 2656 stage: test 2657 image: registry.gitlab.com/dabroz/mruby:clang36_0.7 2658 variables: 2659 CC: clang-3.6 2660 CXX: clang++-3.6 2661 LD: clang-3.6 2662 CFLAGS: "-m32 " 2663 LDFLAGS: "-m32" 2664 script: env; rake --verbose all test 2665 Test clang-3.6 32bit_utf8: 2666 stage: test 2667 image: registry.gitlab.com/dabroz/mruby:clang36_0.7 2668 variables: 2669 CC: clang-3.6 2670 CXX: clang++-3.6 2671 LD: clang-3.6 2672 CFLAGS: "-m32 -DMRB_UTF8_STRING=1" 2673 LDFLAGS: "-m32" 2674 script: env; rake --verbose all test 2675 Test clang-3.6 32bit_nan: 2676 stage: test 2677 image: registry.gitlab.com/dabroz/mruby:clang36_0.7 2678 variables: 2679 CC: clang-3.6 2680 CXX: clang++-3.6 2681 LD: clang-3.6 2682 CFLAGS: "-m32 -DMRB_NAN_BOXING=1" 2683 LDFLAGS: "-m32" 2684 script: env; rake --verbose all test 2685 Test clang-3.6 32bit_nan_utf8: 2686 stage: test 2687 image: registry.gitlab.com/dabroz/mruby:clang36_0.7 2688 variables: 2689 CC: clang-3.6 2690 CXX: clang++-3.6 2691 LD: clang-3.6 2692 CFLAGS: "-m32 -DMRB_NAN_BOXING=1 -DMRB_UTF8_STRING=1" 2693 LDFLAGS: "-m32" 2694 script: env; rake --verbose all test 2695 Test clang-3.6 32bit_word: 1936 2696 stage: test 1937 2697 image: registry.gitlab.com/dabroz/mruby:clang36_0.7 … … 1942 2702 CFLAGS: "-m32 -DMRB_WORD_BOXING=1" 1943 2703 LDFLAGS: "-m32" 1944 script: env; ./minirake --verbose all test1945 Test clang-3.6 32bit_ utf8:2704 script: env; rake --verbose all test 2705 Test clang-3.6 32bit_word_utf8: 1946 2706 stage: test 1947 2707 image: registry.gitlab.com/dabroz/mruby:clang36_0.7 … … 1952 2712 CFLAGS: "-m32 -DMRB_WORD_BOXING=1 -DMRB_UTF8_STRING=1" 1953 2713 LDFLAGS: "-m32" 1954 script: env; ./minirake --verbose all test 1955 Test clang-3.6 32bit_nan: 1956 stage: test 1957 image: registry.gitlab.com/dabroz/mruby:clang36_0.7 1958 variables: 1959 CC: clang-3.6 1960 CXX: clang++-3.6 1961 LD: clang-3.6 1962 CFLAGS: "-m32 -DMRB_NAN_BOXING=1" 1963 LDFLAGS: "-m32" 1964 script: env; ./minirake --verbose all test 1965 Test clang-3.6 32bit_nan_utf8: 1966 stage: test 1967 image: registry.gitlab.com/dabroz/mruby:clang36_0.7 1968 variables: 1969 CC: clang-3.6 1970 CXX: clang++-3.6 1971 LD: clang-3.6 1972 CFLAGS: "-m32 -DMRB_NAN_BOXING=1 -DMRB_UTF8_STRING=1" 1973 LDFLAGS: "-m32" 1974 script: env; ./minirake --verbose all test 2714 script: env; rake --verbose all test 1975 2715 Test clang-3.6 32bit_int16: 1976 2716 stage: test … … 1982 2722 CFLAGS: "-m32 -DMRB_INT16=1" 1983 2723 LDFLAGS: "-m32" 1984 script: env; ./minirake --verbose all test2724 script: env; rake --verbose all test 1985 2725 Test clang-3.6 32bit_int16_utf8: 1986 2726 stage: test … … 1992 2732 CFLAGS: "-m32 -DMRB_INT16=1 -DMRB_UTF8_STRING=1" 1993 2733 LDFLAGS: "-m32" 1994 script: env; ./minirake --verbose all test2734 script: env; rake --verbose all test 1995 2735 Test clang-3.6 32bit_int16_nan: 1996 2736 stage: test … … 2002 2742 CFLAGS: "-m32 -DMRB_INT16=1 -DMRB_NAN_BOXING=1" 2003 2743 LDFLAGS: "-m32" 2004 script: env; ./minirake --verbose all test2744 script: env; rake --verbose all test 2005 2745 Test clang-3.6 32bit_int16_nan_utf8: 2006 2746 stage: test … … 2012 2752 CFLAGS: "-m32 -DMRB_INT16=1 -DMRB_NAN_BOXING=1 -DMRB_UTF8_STRING=1" 2013 2753 LDFLAGS: "-m32" 2014 script: env; ./minirake --verbose all test2754 script: env; rake --verbose all test 2015 2755 Test clang-3.6 32bit_int64: 2016 2756 stage: test … … 2022 2762 CFLAGS: "-m32 -DMRB_INT64=1" 2023 2763 LDFLAGS: "-m32" 2024 script: env; ./minirake --verbose all test2764 script: env; rake --verbose all test 2025 2765 Test clang-3.6 32bit_int64_utf8: 2026 2766 stage: test … … 2032 2772 CFLAGS: "-m32 -DMRB_INT64=1 -DMRB_UTF8_STRING=1" 2033 2773 LDFLAGS: "-m32" 2034 script: env; ./minirake --verbose all test2774 script: env; rake --verbose all test 2035 2775 Test clang-3.6 32bit_float: 2776 stage: test 2777 image: registry.gitlab.com/dabroz/mruby:clang36_0.7 2778 variables: 2779 CC: clang-3.6 2780 CXX: clang++-3.6 2781 LD: clang-3.6 2782 CFLAGS: "-m32 -DMRB_USE_FLOAT=1" 2783 LDFLAGS: "-m32" 2784 script: env; rake --verbose all test 2785 Test clang-3.6 32bit_float_utf8: 2786 stage: test 2787 image: registry.gitlab.com/dabroz/mruby:clang36_0.7 2788 variables: 2789 CC: clang-3.6 2790 CXX: clang++-3.6 2791 LD: clang-3.6 2792 CFLAGS: "-m32 -DMRB_USE_FLOAT=1 -DMRB_UTF8_STRING=1" 2793 LDFLAGS: "-m32" 2794 script: env; rake --verbose all test 2795 Test clang-3.6 32bit_float_word: 2036 2796 stage: test 2037 2797 image: registry.gitlab.com/dabroz/mruby:clang36_0.7 … … 2042 2802 CFLAGS: "-m32 -DMRB_USE_FLOAT=1 -DMRB_WORD_BOXING=1" 2043 2803 LDFLAGS: "-m32" 2044 script: env; ./minirake --verbose all test2045 Test clang-3.6 32bit_float_ utf8:2804 script: env; rake --verbose all test 2805 Test clang-3.6 32bit_float_word_utf8: 2046 2806 stage: test 2047 2807 image: registry.gitlab.com/dabroz/mruby:clang36_0.7 … … 2052 2812 CFLAGS: "-m32 -DMRB_USE_FLOAT=1 -DMRB_WORD_BOXING=1 -DMRB_UTF8_STRING=1" 2053 2813 LDFLAGS: "-m32" 2054 script: env; ./minirake --verbose all test2814 script: env; rake --verbose all test 2055 2815 Test clang-3.6 32bit_float_int16: 2056 2816 stage: test … … 2062 2822 CFLAGS: "-m32 -DMRB_USE_FLOAT=1 -DMRB_INT16=1" 2063 2823 LDFLAGS: "-m32" 2064 script: env; ./minirake --verbose all test2824 script: env; rake --verbose all test 2065 2825 Test clang-3.6 32bit_float_int16_utf8: 2066 2826 stage: test … … 2072 2832 CFLAGS: "-m32 -DMRB_USE_FLOAT=1 -DMRB_INT16=1 -DMRB_UTF8_STRING=1" 2073 2833 LDFLAGS: "-m32" 2074 script: env; ./minirake --verbose all test2834 script: env; rake --verbose all test 2075 2835 Test clang-3.6 32bit_float_int64: 2076 2836 stage: test … … 2082 2842 CFLAGS: "-m32 -DMRB_USE_FLOAT=1 -DMRB_INT64=1" 2083 2843 LDFLAGS: "-m32" 2084 script: env; ./minirake --verbose all test2844 script: env; rake --verbose all test 2085 2845 Test clang-3.6 32bit_float_int64_utf8: 2086 2846 stage: test … … 2092 2852 CFLAGS: "-m32 -DMRB_USE_FLOAT=1 -DMRB_INT64=1 -DMRB_UTF8_STRING=1" 2093 2853 LDFLAGS: "-m32" 2094 script: env; ./minirake --verbose all test2854 script: env; rake --verbose all test 2095 2855 Test clang-3.6 64bit: 2856 stage: test 2857 image: registry.gitlab.com/dabroz/mruby:clang36_0.7 2858 variables: 2859 CC: clang-3.6 2860 CXX: clang++-3.6 2861 LD: clang-3.6 2862 CFLAGS: '' 2863 LDFLAGS: '' 2864 script: env; rake --verbose all test 2865 Test clang-3.6 64bit_utf8: 2866 stage: test 2867 image: registry.gitlab.com/dabroz/mruby:clang36_0.7 2868 variables: 2869 CC: clang-3.6 2870 CXX: clang++-3.6 2871 LD: clang-3.6 2872 CFLAGS: "-DMRB_UTF8_STRING=1" 2873 LDFLAGS: '' 2874 script: env; rake --verbose all test 2875 Test clang-3.6 64bit_nan: 2876 stage: test 2877 image: registry.gitlab.com/dabroz/mruby:clang36_0.7 2878 variables: 2879 CC: clang-3.6 2880 CXX: clang++-3.6 2881 LD: clang-3.6 2882 CFLAGS: "-DMRB_NAN_BOXING=1" 2883 LDFLAGS: '' 2884 script: env; rake --verbose all test 2885 Test clang-3.6 64bit_nan_utf8: 2886 stage: test 2887 image: registry.gitlab.com/dabroz/mruby:clang36_0.7 2888 variables: 2889 CC: clang-3.6 2890 CXX: clang++-3.6 2891 LD: clang-3.6 2892 CFLAGS: "-DMRB_NAN_BOXING=1 -DMRB_UTF8_STRING=1" 2893 LDFLAGS: '' 2894 script: env; rake --verbose all test 2895 Test clang-3.6 64bit_word: 2096 2896 stage: test 2097 2897 image: registry.gitlab.com/dabroz/mruby:clang36_0.7 … … 2102 2902 CFLAGS: "-DMRB_WORD_BOXING=1" 2103 2903 LDFLAGS: '' 2104 script: env; ./minirake --verbose all test2105 Test clang-3.6 64bit_ utf8:2904 script: env; rake --verbose all test 2905 Test clang-3.6 64bit_word_utf8: 2106 2906 stage: test 2107 2907 image: registry.gitlab.com/dabroz/mruby:clang36_0.7 … … 2112 2912 CFLAGS: "-DMRB_WORD_BOXING=1 -DMRB_UTF8_STRING=1" 2113 2913 LDFLAGS: '' 2114 script: env; ./minirake --verbose all test 2115 Test clang-3.6 64bit_nan: 2116 stage: test 2117 image: registry.gitlab.com/dabroz/mruby:clang36_0.7 2118 variables: 2119 CC: clang-3.6 2120 CXX: clang++-3.6 2121 LD: clang-3.6 2122 CFLAGS: "-DMRB_NAN_BOXING=1" 2123 LDFLAGS: '' 2124 script: env; ./minirake --verbose all test 2125 Test clang-3.6 64bit_nan_utf8: 2126 stage: test 2127 image: registry.gitlab.com/dabroz/mruby:clang36_0.7 2128 variables: 2129 CC: clang-3.6 2130 CXX: clang++-3.6 2131 LD: clang-3.6 2132 CFLAGS: "-DMRB_NAN_BOXING=1 -DMRB_UTF8_STRING=1" 2133 LDFLAGS: '' 2134 script: env; ./minirake --verbose all test 2914 script: env; rake --verbose all test 2135 2915 Test clang-3.6 64bit_int16: 2136 2916 stage: test … … 2142 2922 CFLAGS: "-DMRB_INT16=1" 2143 2923 LDFLAGS: '' 2144 script: env; ./minirake --verbose all test2924 script: env; rake --verbose all test 2145 2925 Test clang-3.6 64bit_int16_utf8: 2146 2926 stage: test … … 2152 2932 CFLAGS: "-DMRB_INT16=1 -DMRB_UTF8_STRING=1" 2153 2933 LDFLAGS: '' 2154 script: env; ./minirake --verbose all test2934 script: env; rake --verbose all test 2155 2935 Test clang-3.6 64bit_int16_nan: 2156 2936 stage: test … … 2162 2942 CFLAGS: "-DMRB_INT16=1 -DMRB_NAN_BOXING=1" 2163 2943 LDFLAGS: '' 2164 script: env; ./minirake --verbose all test2944 script: env; rake --verbose all test 2165 2945 Test clang-3.6 64bit_int16_nan_utf8: 2166 2946 stage: test … … 2172 2952 CFLAGS: "-DMRB_INT16=1 -DMRB_NAN_BOXING=1 -DMRB_UTF8_STRING=1" 2173 2953 LDFLAGS: '' 2174 script: env; ./minirake --verbose all test2954 script: env; rake --verbose all test 2175 2955 Test clang-3.6 64bit_int64: 2956 stage: test 2957 image: registry.gitlab.com/dabroz/mruby:clang36_0.7 2958 variables: 2959 CC: clang-3.6 2960 CXX: clang++-3.6 2961 LD: clang-3.6 2962 CFLAGS: "-DMRB_INT64=1" 2963 LDFLAGS: '' 2964 script: env; rake --verbose all test 2965 Test clang-3.6 64bit_int64_utf8: 2966 stage: test 2967 image: registry.gitlab.com/dabroz/mruby:clang36_0.7 2968 variables: 2969 CC: clang-3.6 2970 CXX: clang++-3.6 2971 LD: clang-3.6 2972 CFLAGS: "-DMRB_INT64=1 -DMRB_UTF8_STRING=1" 2973 LDFLAGS: '' 2974 script: env; rake --verbose all test 2975 Test clang-3.6 64bit_int64_word: 2176 2976 stage: test 2177 2977 image: registry.gitlab.com/dabroz/mruby:clang36_0.7 … … 2182 2982 CFLAGS: "-DMRB_INT64=1 -DMRB_WORD_BOXING=1" 2183 2983 LDFLAGS: '' 2184 script: env; ./minirake --verbose all test2185 Test clang-3.6 64bit_int64_ utf8:2984 script: env; rake --verbose all test 2985 Test clang-3.6 64bit_int64_word_utf8: 2186 2986 stage: test 2187 2987 image: registry.gitlab.com/dabroz/mruby:clang36_0.7 … … 2192 2992 CFLAGS: "-DMRB_INT64=1 -DMRB_WORD_BOXING=1 -DMRB_UTF8_STRING=1" 2193 2993 LDFLAGS: '' 2194 script: env; ./minirake --verbose all test2994 script: env; rake --verbose all test 2195 2995 Test clang-3.6 64bit_float: 2996 stage: test 2997 image: registry.gitlab.com/dabroz/mruby:clang36_0.7 2998 variables: 2999 CC: clang-3.6 3000 CXX: clang++-3.6 3001 LD: clang-3.6 3002 CFLAGS: "-DMRB_USE_FLOAT=1" 3003 LDFLAGS: '' 3004 script: env; rake --verbose all test 3005 Test clang-3.6 64bit_float_utf8: 3006 stage: test 3007 image: registry.gitlab.com/dabroz/mruby:clang36_0.7 3008 variables: 3009 CC: clang-3.6 3010 CXX: clang++-3.6 3011 LD: clang-3.6 3012 CFLAGS: "-DMRB_USE_FLOAT=1 -DMRB_UTF8_STRING=1" 3013 LDFLAGS: '' 3014 script: env; rake --verbose all test 3015 Test clang-3.6 64bit_float_word: 2196 3016 stage: test 2197 3017 image: registry.gitlab.com/dabroz/mruby:clang36_0.7 … … 2202 3022 CFLAGS: "-DMRB_USE_FLOAT=1 -DMRB_WORD_BOXING=1" 2203 3023 LDFLAGS: '' 2204 script: env; ./minirake --verbose all test2205 Test clang-3.6 64bit_float_ utf8:3024 script: env; rake --verbose all test 3025 Test clang-3.6 64bit_float_word_utf8: 2206 3026 stage: test 2207 3027 image: registry.gitlab.com/dabroz/mruby:clang36_0.7 … … 2212 3032 CFLAGS: "-DMRB_USE_FLOAT=1 -DMRB_WORD_BOXING=1 -DMRB_UTF8_STRING=1" 2213 3033 LDFLAGS: '' 2214 script: env; ./minirake --verbose all test3034 script: env; rake --verbose all test 2215 3035 Test clang-3.6 64bit_float_int16: 2216 3036 stage: test … … 2222 3042 CFLAGS: "-DMRB_USE_FLOAT=1 -DMRB_INT16=1" 2223 3043 LDFLAGS: '' 2224 script: env; ./minirake --verbose all test3044 script: env; rake --verbose all test 2225 3045 Test clang-3.6 64bit_float_int16_utf8: 2226 3046 stage: test … … 2232 3052 CFLAGS: "-DMRB_USE_FLOAT=1 -DMRB_INT16=1 -DMRB_UTF8_STRING=1" 2233 3053 LDFLAGS: '' 2234 script: env; ./minirake --verbose all test3054 script: env; rake --verbose all test 2235 3055 Test clang-3.6 64bit_float_int64: 3056 stage: test 3057 image: registry.gitlab.com/dabroz/mruby:clang36_0.7 3058 variables: 3059 CC: clang-3.6 3060 CXX: clang++-3.6 3061 LD: clang-3.6 3062 CFLAGS: "-DMRB_USE_FLOAT=1 -DMRB_INT64=1" 3063 LDFLAGS: '' 3064 script: env; rake --verbose all test 3065 Test clang-3.6 64bit_float_int64_utf8: 3066 stage: test 3067 image: registry.gitlab.com/dabroz/mruby:clang36_0.7 3068 variables: 3069 CC: clang-3.6 3070 CXX: clang++-3.6 3071 LD: clang-3.6 3072 CFLAGS: "-DMRB_USE_FLOAT=1 -DMRB_INT64=1 -DMRB_UTF8_STRING=1" 3073 LDFLAGS: '' 3074 script: env; rake --verbose all test 3075 Test clang-3.6 64bit_float_int64_word: 2236 3076 stage: test 2237 3077 image: registry.gitlab.com/dabroz/mruby:clang36_0.7 … … 2242 3082 CFLAGS: "-DMRB_USE_FLOAT=1 -DMRB_INT64=1 -DMRB_WORD_BOXING=1" 2243 3083 LDFLAGS: '' 2244 script: env; ./minirake --verbose all test2245 Test clang-3.6 64bit_float_int64_ utf8:3084 script: env; rake --verbose all test 3085 Test clang-3.6 64bit_float_int64_word_utf8: 2246 3086 stage: test 2247 3087 image: registry.gitlab.com/dabroz/mruby:clang36_0.7 … … 2252 3092 CFLAGS: "-DMRB_USE_FLOAT=1 -DMRB_INT64=1 -DMRB_WORD_BOXING=1 -DMRB_UTF8_STRING=1" 2253 3093 LDFLAGS: '' 2254 script: env; ./minirake --verbose all test3094 script: env; rake --verbose all test 2255 3095 Test clang-3.7 32bit: 3096 stage: test 3097 image: registry.gitlab.com/dabroz/mruby:clang37_0.7 3098 variables: 3099 CC: clang-3.7 3100 CXX: clang++-3.7 3101 LD: clang-3.7 3102 CFLAGS: "-m32 " 3103 LDFLAGS: "-m32" 3104 script: env; rake --verbose all test 3105 Test clang-3.7 32bit_utf8: 3106 stage: test 3107 image: registry.gitlab.com/dabroz/mruby:clang37_0.7 3108 variables: 3109 CC: clang-3.7 3110 CXX: clang++-3.7 3111 LD: clang-3.7 3112 CFLAGS: "-m32 -DMRB_UTF8_STRING=1" 3113 LDFLAGS: "-m32" 3114 script: env; rake --verbose all test 3115 Test clang-3.7 32bit_nan: 3116 stage: test 3117 image: registry.gitlab.com/dabroz/mruby:clang37_0.7 3118 variables: 3119 CC: clang-3.7 3120 CXX: clang++-3.7 3121 LD: clang-3.7 3122 CFLAGS: "-m32 -DMRB_NAN_BOXING=1" 3123 LDFLAGS: "-m32" 3124 script: env; rake --verbose all test 3125 Test clang-3.7 32bit_nan_utf8: 3126 stage: test 3127 image: registry.gitlab.com/dabroz/mruby:clang37_0.7 3128 variables: 3129 CC: clang-3.7 3130 CXX: clang++-3.7 3131 LD: clang-3.7 3132 CFLAGS: "-m32 -DMRB_NAN_BOXING=1 -DMRB_UTF8_STRING=1" 3133 LDFLAGS: "-m32" 3134 script: env; rake --verbose all test 3135 Test clang-3.7 32bit_word: 2256 3136 stage: test 2257 3137 image: registry.gitlab.com/dabroz/mruby:clang37_0.7 … … 2262 3142 CFLAGS: "-m32 -DMRB_WORD_BOXING=1" 2263 3143 LDFLAGS: "-m32" 2264 script: env; ./minirake --verbose all test2265 Test clang-3.7 32bit_ utf8:3144 script: env; rake --verbose all test 3145 Test clang-3.7 32bit_word_utf8: 2266 3146 stage: test 2267 3147 image: registry.gitlab.com/dabroz/mruby:clang37_0.7 … … 2272 3152 CFLAGS: "-m32 -DMRB_WORD_BOXING=1 -DMRB_UTF8_STRING=1" 2273 3153 LDFLAGS: "-m32" 2274 script: env; ./minirake --verbose all test 2275 Test clang-3.7 32bit_nan: 2276 stage: test 2277 image: registry.gitlab.com/dabroz/mruby:clang37_0.7 2278 variables: 2279 CC: clang-3.7 2280 CXX: clang++-3.7 2281 LD: clang-3.7 2282 CFLAGS: "-m32 -DMRB_NAN_BOXING=1" 2283 LDFLAGS: "-m32" 2284 script: env; ./minirake --verbose all test 2285 Test clang-3.7 32bit_nan_utf8: 2286 stage: test 2287 image: registry.gitlab.com/dabroz/mruby:clang37_0.7 2288 variables: 2289 CC: clang-3.7 2290 CXX: clang++-3.7 2291 LD: clang-3.7 2292 CFLAGS: "-m32 -DMRB_NAN_BOXING=1 -DMRB_UTF8_STRING=1" 2293 LDFLAGS: "-m32" 2294 script: env; ./minirake --verbose all test 3154 script: env; rake --verbose all test 2295 3155 Test clang-3.7 32bit_int16: 2296 3156 stage: test … … 2302 3162 CFLAGS: "-m32 -DMRB_INT16=1" 2303 3163 LDFLAGS: "-m32" 2304 script: env; ./minirake --verbose all test3164 script: env; rake --verbose all test 2305 3165 Test clang-3.7 32bit_int16_utf8: 2306 3166 stage: test … … 2312 3172 CFLAGS: "-m32 -DMRB_INT16=1 -DMRB_UTF8_STRING=1" 2313 3173 LDFLAGS: "-m32" 2314 script: env; ./minirake --verbose all test3174 script: env; rake --verbose all test 2315 3175 Test clang-3.7 32bit_int16_nan: 2316 3176 stage: test … … 2322 3182 CFLAGS: "-m32 -DMRB_INT16=1 -DMRB_NAN_BOXING=1" 2323 3183 LDFLAGS: "-m32" 2324 script: env; ./minirake --verbose all test3184 script: env; rake --verbose all test 2325 3185 Test clang-3.7 32bit_int16_nan_utf8: 2326 3186 stage: test … … 2332 3192 CFLAGS: "-m32 -DMRB_INT16=1 -DMRB_NAN_BOXING=1 -DMRB_UTF8_STRING=1" 2333 3193 LDFLAGS: "-m32" 2334 script: env; ./minirake --verbose all test3194 script: env; rake --verbose all test 2335 3195 Test clang-3.7 32bit_int64: 2336 3196 stage: test … … 2342 3202 CFLAGS: "-m32 -DMRB_INT64=1" 2343 3203 LDFLAGS: "-m32" 2344 script: env; ./minirake --verbose all test3204 script: env; rake --verbose all test 2345 3205 Test clang-3.7 32bit_int64_utf8: 2346 3206 stage: test … … 2352 3212 CFLAGS: "-m32 -DMRB_INT64=1 -DMRB_UTF8_STRING=1" 2353 3213 LDFLAGS: "-m32" 2354 script: env; ./minirake --verbose all test3214 script: env; rake --verbose all test 2355 3215 Test clang-3.7 32bit_float: 3216 stage: test 3217 image: registry.gitlab.com/dabroz/mruby:clang37_0.7 3218 variables: 3219 CC: clang-3.7 3220 CXX: clang++-3.7 3221 LD: clang-3.7 3222 CFLAGS: "-m32 -DMRB_USE_FLOAT=1" 3223 LDFLAGS: "-m32" 3224 script: env; rake --verbose all test 3225 Test clang-3.7 32bit_float_utf8: 3226 stage: test 3227 image: registry.gitlab.com/dabroz/mruby:clang37_0.7 3228 variables: 3229 CC: clang-3.7 3230 CXX: clang++-3.7 3231 LD: clang-3.7 3232 CFLAGS: "-m32 -DMRB_USE_FLOAT=1 -DMRB_UTF8_STRING=1" 3233 LDFLAGS: "-m32" 3234 script: env; rake --verbose all test 3235 Test clang-3.7 32bit_float_word: 2356 3236 stage: test 2357 3237 image: registry.gitlab.com/dabroz/mruby:clang37_0.7 … … 2362 3242 CFLAGS: "-m32 -DMRB_USE_FLOAT=1 -DMRB_WORD_BOXING=1" 2363 3243 LDFLAGS: "-m32" 2364 script: env; ./minirake --verbose all test2365 Test clang-3.7 32bit_float_ utf8:3244 script: env; rake --verbose all test 3245 Test clang-3.7 32bit_float_word_utf8: 2366 3246 stage: test 2367 3247 image: registry.gitlab.com/dabroz/mruby:clang37_0.7 … … 2372 3252 CFLAGS: "-m32 -DMRB_USE_FLOAT=1 -DMRB_WORD_BOXING=1 -DMRB_UTF8_STRING=1" 2373 3253 LDFLAGS: "-m32" 2374 script: env; ./minirake --verbose all test3254 script: env; rake --verbose all test 2375 3255 Test clang-3.7 32bit_float_int16: 2376 3256 stage: test … … 2382 3262 CFLAGS: "-m32 -DMRB_USE_FLOAT=1 -DMRB_INT16=1" 2383 3263 LDFLAGS: "-m32" 2384 script: env; ./minirake --verbose all test3264 script: env; rake --verbose all test 2385 3265 Test clang-3.7 32bit_float_int16_utf8: 2386 3266 stage: test … … 2392 3272 CFLAGS: "-m32 -DMRB_USE_FLOAT=1 -DMRB_INT16=1 -DMRB_UTF8_STRING=1" 2393 3273 LDFLAGS: "-m32" 2394 script: env; ./minirake --verbose all test3274 script: env; rake --verbose all test 2395 3275 Test clang-3.7 32bit_float_int64: 2396 3276 stage: test … … 2402 3282 CFLAGS: "-m32 -DMRB_USE_FLOAT=1 -DMRB_INT64=1" 2403 3283 LDFLAGS: "-m32" 2404 script: env; ./minirake --verbose all test3284 script: env; rake --verbose all test 2405 3285 Test clang-3.7 32bit_float_int64_utf8: 2406 3286 stage: test … … 2412 3292 CFLAGS: "-m32 -DMRB_USE_FLOAT=1 -DMRB_INT64=1 -DMRB_UTF8_STRING=1" 2413 3293 LDFLAGS: "-m32" 2414 script: env; ./minirake --verbose all test3294 script: env; rake --verbose all test 2415 3295 Test clang-3.7 64bit: 3296 stage: test 3297 image: registry.gitlab.com/dabroz/mruby:clang37_0.7 3298 variables: 3299 CC: clang-3.7 3300 CXX: clang++-3.7 3301 LD: clang-3.7 3302 CFLAGS: '' 3303 LDFLAGS: '' 3304 script: env; rake --verbose all test 3305 Test clang-3.7 64bit_utf8: 3306 stage: test 3307 image: registry.gitlab.com/dabroz/mruby:clang37_0.7 3308 variables: 3309 CC: clang-3.7 3310 CXX: clang++-3.7 3311 LD: clang-3.7 3312 CFLAGS: "-DMRB_UTF8_STRING=1" 3313 LDFLAGS: '' 3314 script: env; rake --verbose all test 3315 Test clang-3.7 64bit_nan: 3316 stage: test 3317 image: registry.gitlab.com/dabroz/mruby:clang37_0.7 3318 variables: 3319 CC: clang-3.7 3320 CXX: clang++-3.7 3321 LD: clang-3.7 3322 CFLAGS: "-DMRB_NAN_BOXING=1" 3323 LDFLAGS: '' 3324 script: env; rake --verbose all test 3325 Test clang-3.7 64bit_nan_utf8: 3326 stage: test 3327 image: registry.gitlab.com/dabroz/mruby:clang37_0.7 3328 variables: 3329 CC: clang-3.7 3330 CXX: clang++-3.7 3331 LD: clang-3.7 3332 CFLAGS: "-DMRB_NAN_BOXING=1 -DMRB_UTF8_STRING=1" 3333 LDFLAGS: '' 3334 script: env; rake --verbose all test 3335 Test clang-3.7 64bit_word: 2416 3336 stage: test 2417 3337 image: registry.gitlab.com/dabroz/mruby:clang37_0.7 … … 2422 3342 CFLAGS: "-DMRB_WORD_BOXING=1" 2423 3343 LDFLAGS: '' 2424 script: env; ./minirake --verbose all test2425 Test clang-3.7 64bit_ utf8:3344 script: env; rake --verbose all test 3345 Test clang-3.7 64bit_word_utf8: 2426 3346 stage: test 2427 3347 image: registry.gitlab.com/dabroz/mruby:clang37_0.7 … … 2432 3352 CFLAGS: "-DMRB_WORD_BOXING=1 -DMRB_UTF8_STRING=1" 2433 3353 LDFLAGS: '' 2434 script: env; ./minirake --verbose all test 2435 Test clang-3.7 64bit_nan: 2436 stage: test 2437 image: registry.gitlab.com/dabroz/mruby:clang37_0.7 2438 variables: 2439 CC: clang-3.7 2440 CXX: clang++-3.7 2441 LD: clang-3.7 2442 CFLAGS: "-DMRB_NAN_BOXING=1" 2443 LDFLAGS: '' 2444 script: env; ./minirake --verbose all test 2445 Test clang-3.7 64bit_nan_utf8: 2446 stage: test 2447 image: registry.gitlab.com/dabroz/mruby:clang37_0.7 2448 variables: 2449 CC: clang-3.7 2450 CXX: clang++-3.7 2451 LD: clang-3.7 2452 CFLAGS: "-DMRB_NAN_BOXING=1 -DMRB_UTF8_STRING=1" 2453 LDFLAGS: '' 2454 script: env; ./minirake --verbose all test 3354 script: env; rake --verbose all test 2455 3355 Test clang-3.7 64bit_int16: 2456 3356 stage: test … … 2462 3362 CFLAGS: "-DMRB_INT16=1" 2463 3363 LDFLAGS: '' 2464 script: env; ./minirake --verbose all test3364 script: env; rake --verbose all test 2465 3365 Test clang-3.7 64bit_int16_utf8: 2466 3366 stage: test … … 2472 3372 CFLAGS: "-DMRB_INT16=1 -DMRB_UTF8_STRING=1" 2473 3373 LDFLAGS: '' 2474 script: env; ./minirake --verbose all test3374 script: env; rake --verbose all test 2475 3375 Test clang-3.7 64bit_int16_nan: 2476 3376 stage: test … … 2482 3382 CFLAGS: "-DMRB_INT16=1 -DMRB_NAN_BOXING=1" 2483 3383 LDFLAGS: '' 2484 script: env; ./minirake --verbose all test3384 script: env; rake --verbose all test 2485 3385 Test clang-3.7 64bit_int16_nan_utf8: 2486 3386 stage: test … … 2492 3392 CFLAGS: "-DMRB_INT16=1 -DMRB_NAN_BOXING=1 -DMRB_UTF8_STRING=1" 2493 3393 LDFLAGS: '' 2494 script: env; ./minirake --verbose all test3394 script: env; rake --verbose all test 2495 3395 Test clang-3.7 64bit_int64: 3396 stage: test 3397 image: registry.gitlab.com/dabroz/mruby:clang37_0.7 3398 variables: 3399 CC: clang-3.7 3400 CXX: clang++-3.7 3401 LD: clang-3.7 3402 CFLAGS: "-DMRB_INT64=1" 3403 LDFLAGS: '' 3404 script: env; rake --verbose all test 3405 Test clang-3.7 64bit_int64_utf8: 3406 stage: test 3407 image: registry.gitlab.com/dabroz/mruby:clang37_0.7 3408 variables: 3409 CC: clang-3.7 3410 CXX: clang++-3.7 3411 LD: clang-3.7 3412 CFLAGS: "-DMRB_INT64=1 -DMRB_UTF8_STRING=1" 3413 LDFLAGS: '' 3414 script: env; rake --verbose all test 3415 Test clang-3.7 64bit_int64_word: 2496 3416 stage: test 2497 3417 image: registry.gitlab.com/dabroz/mruby:clang37_0.7 … … 2502 3422 CFLAGS: "-DMRB_INT64=1 -DMRB_WORD_BOXING=1" 2503 3423 LDFLAGS: '' 2504 script: env; ./minirake --verbose all test2505 Test clang-3.7 64bit_int64_ utf8:3424 script: env; rake --verbose all test 3425 Test clang-3.7 64bit_int64_word_utf8: 2506 3426 stage: test 2507 3427 image: registry.gitlab.com/dabroz/mruby:clang37_0.7 … … 2512 3432 CFLAGS: "-DMRB_INT64=1 -DMRB_WORD_BOXING=1 -DMRB_UTF8_STRING=1" 2513 3433 LDFLAGS: '' 2514 script: env; ./minirake --verbose all test3434 script: env; rake --verbose all test 2515 3435 Test clang-3.7 64bit_float: 3436 stage: test 3437 image: registry.gitlab.com/dabroz/mruby:clang37_0.7 3438 variables: 3439 CC: clang-3.7 3440 CXX: clang++-3.7 3441 LD: clang-3.7 3442 CFLAGS: "-DMRB_USE_FLOAT=1" 3443 LDFLAGS: '' 3444 script: env; rake --verbose all test 3445 Test clang-3.7 64bit_float_utf8: 3446 stage: test 3447 image: registry.gitlab.com/dabroz/mruby:clang37_0.7 3448 variables: 3449 CC: clang-3.7 3450 CXX: clang++-3.7 3451 LD: clang-3.7 3452 CFLAGS: "-DMRB_USE_FLOAT=1 -DMRB_UTF8_STRING=1" 3453 LDFLAGS: '' 3454 script: env; rake --verbose all test 3455 Test clang-3.7 64bit_float_word: 2516 3456 stage: test 2517 3457 image: registry.gitlab.com/dabroz/mruby:clang37_0.7 … … 2522 3462 CFLAGS: "-DMRB_USE_FLOAT=1 -DMRB_WORD_BOXING=1" 2523 3463 LDFLAGS: '' 2524 script: env; ./minirake --verbose all test2525 Test clang-3.7 64bit_float_ utf8:3464 script: env; rake --verbose all test 3465 Test clang-3.7 64bit_float_word_utf8: 2526 3466 stage: test 2527 3467 image: registry.gitlab.com/dabroz/mruby:clang37_0.7 … … 2532 3472 CFLAGS: "-DMRB_USE_FLOAT=1 -DMRB_WORD_BOXING=1 -DMRB_UTF8_STRING=1" 2533 3473 LDFLAGS: '' 2534 script: env; ./minirake --verbose all test3474 script: env; rake --verbose all test 2535 3475 Test clang-3.7 64bit_float_int16: 2536 3476 stage: test … … 2542 3482 CFLAGS: "-DMRB_USE_FLOAT=1 -DMRB_INT16=1" 2543 3483 LDFLAGS: '' 2544 script: env; ./minirake --verbose all test3484 script: env; rake --verbose all test 2545 3485 Test clang-3.7 64bit_float_int16_utf8: 2546 3486 stage: test … … 2552 3492 CFLAGS: "-DMRB_USE_FLOAT=1 -DMRB_INT16=1 -DMRB_UTF8_STRING=1" 2553 3493 LDFLAGS: '' 2554 script: env; ./minirake --verbose all test3494 script: env; rake --verbose all test 2555 3495 Test clang-3.7 64bit_float_int64: 3496 stage: test 3497 image: registry.gitlab.com/dabroz/mruby:clang37_0.7 3498 variables: 3499 CC: clang-3.7 3500 CXX: clang++-3.7 3501 LD: clang-3.7 3502 CFLAGS: "-DMRB_USE_FLOAT=1 -DMRB_INT64=1" 3503 LDFLAGS: '' 3504 script: env; rake --verbose all test 3505 Test clang-3.7 64bit_float_int64_utf8: 3506 stage: test 3507 image: registry.gitlab.com/dabroz/mruby:clang37_0.7 3508 variables: 3509 CC: clang-3.7 3510 CXX: clang++-3.7 3511 LD: clang-3.7 3512 CFLAGS: "-DMRB_USE_FLOAT=1 -DMRB_INT64=1 -DMRB_UTF8_STRING=1" 3513 LDFLAGS: '' 3514 script: env; rake --verbose all test 3515 Test clang-3.7 64bit_float_int64_word: 2556 3516 stage: test 2557 3517 image: registry.gitlab.com/dabroz/mruby:clang37_0.7 … … 2562 3522 CFLAGS: "-DMRB_USE_FLOAT=1 -DMRB_INT64=1 -DMRB_WORD_BOXING=1" 2563 3523 LDFLAGS: '' 2564 script: env; ./minirake --verbose all test2565 Test clang-3.7 64bit_float_int64_ utf8:3524 script: env; rake --verbose all test 3525 Test clang-3.7 64bit_float_int64_word_utf8: 2566 3526 stage: test 2567 3527 image: registry.gitlab.com/dabroz/mruby:clang37_0.7 … … 2572 3532 CFLAGS: "-DMRB_USE_FLOAT=1 -DMRB_INT64=1 -DMRB_WORD_BOXING=1 -DMRB_UTF8_STRING=1" 2573 3533 LDFLAGS: '' 2574 script: env; ./minirake --verbose all test3534 script: env; rake --verbose all test 2575 3535 Test clang-3.8 32bit: 3536 stage: test 3537 image: registry.gitlab.com/dabroz/mruby:clang38_0.7 3538 variables: 3539 CC: clang-3.8 3540 CXX: clang++-3.8 3541 LD: clang-3.8 3542 CFLAGS: "-m32 " 3543 LDFLAGS: "-m32" 3544 script: env; rake --verbose all test 3545 Test clang-3.8 32bit_utf8: 3546 stage: test 3547 image: registry.gitlab.com/dabroz/mruby:clang38_0.7 3548 variables: 3549 CC: clang-3.8 3550 CXX: clang++-3.8 3551 LD: clang-3.8 3552 CFLAGS: "-m32 -DMRB_UTF8_STRING=1" 3553 LDFLAGS: "-m32" 3554 script: env; rake --verbose all test 3555 Test clang-3.8 32bit_nan: 3556 stage: test 3557 image: registry.gitlab.com/dabroz/mruby:clang38_0.7 3558 variables: 3559 CC: clang-3.8 3560 CXX: clang++-3.8 3561 LD: clang-3.8 3562 CFLAGS: "-m32 -DMRB_NAN_BOXING=1" 3563 LDFLAGS: "-m32" 3564 script: env; rake --verbose all test 3565 Test clang-3.8 32bit_nan_utf8: 3566 stage: test 3567 image: registry.gitlab.com/dabroz/mruby:clang38_0.7 3568 variables: 3569 CC: clang-3.8 3570 CXX: clang++-3.8 3571 LD: clang-3.8 3572 CFLAGS: "-m32 -DMRB_NAN_BOXING=1 -DMRB_UTF8_STRING=1" 3573 LDFLAGS: "-m32" 3574 script: env; rake --verbose all test 3575 Test clang-3.8 32bit_word: 2576 3576 stage: test 2577 3577 image: registry.gitlab.com/dabroz/mruby:clang38_0.7 … … 2582 3582 CFLAGS: "-m32 -DMRB_WORD_BOXING=1" 2583 3583 LDFLAGS: "-m32" 2584 script: env; ./minirake --verbose all test2585 Test clang-3.8 32bit_ utf8:3584 script: env; rake --verbose all test 3585 Test clang-3.8 32bit_word_utf8: 2586 3586 stage: test 2587 3587 image: registry.gitlab.com/dabroz/mruby:clang38_0.7 … … 2592 3592 CFLAGS: "-m32 -DMRB_WORD_BOXING=1 -DMRB_UTF8_STRING=1" 2593 3593 LDFLAGS: "-m32" 2594 script: env; ./minirake --verbose all test 2595 Test clang-3.8 32bit_nan: 2596 stage: test 2597 image: registry.gitlab.com/dabroz/mruby:clang38_0.7 2598 variables: 2599 CC: clang-3.8 2600 CXX: clang++-3.8 2601 LD: clang-3.8 2602 CFLAGS: "-m32 -DMRB_NAN_BOXING=1" 2603 LDFLAGS: "-m32" 2604 script: env; ./minirake --verbose all test 2605 Test clang-3.8 32bit_nan_utf8: 2606 stage: test 2607 image: registry.gitlab.com/dabroz/mruby:clang38_0.7 2608 variables: 2609 CC: clang-3.8 2610 CXX: clang++-3.8 2611 LD: clang-3.8 2612 CFLAGS: "-m32 -DMRB_NAN_BOXING=1 -DMRB_UTF8_STRING=1" 2613 LDFLAGS: "-m32" 2614 script: env; ./minirake --verbose all test 3594 script: env; rake --verbose all test 2615 3595 Test clang-3.8 32bit_int16: 2616 3596 stage: test … … 2622 3602 CFLAGS: "-m32 -DMRB_INT16=1" 2623 3603 LDFLAGS: "-m32" 2624 script: env; ./minirake --verbose all test3604 script: env; rake --verbose all test 2625 3605 Test clang-3.8 32bit_int16_utf8: 2626 3606 stage: test … … 2632 3612 CFLAGS: "-m32 -DMRB_INT16=1 -DMRB_UTF8_STRING=1" 2633 3613 LDFLAGS: "-m32" 2634 script: env; ./minirake --verbose all test3614 script: env; rake --verbose all test 2635 3615 Test clang-3.8 32bit_int16_nan: 2636 3616 stage: test … … 2642 3622 CFLAGS: "-m32 -DMRB_INT16=1 -DMRB_NAN_BOXING=1" 2643 3623 LDFLAGS: "-m32" 2644 script: env; ./minirake --verbose all test3624 script: env; rake --verbose all test 2645 3625 Test clang-3.8 32bit_int16_nan_utf8: 2646 3626 stage: test … … 2652 3632 CFLAGS: "-m32 -DMRB_INT16=1 -DMRB_NAN_BOXING=1 -DMRB_UTF8_STRING=1" 2653 3633 LDFLAGS: "-m32" 2654 script: env; ./minirake --verbose all test3634 script: env; rake --verbose all test 2655 3635 Test clang-3.8 32bit_int64: 2656 3636 stage: test … … 2662 3642 CFLAGS: "-m32 -DMRB_INT64=1" 2663 3643 LDFLAGS: "-m32" 2664 script: env; ./minirake --verbose all test3644 script: env; rake --verbose all test 2665 3645 Test clang-3.8 32bit_int64_utf8: 2666 3646 stage: test … … 2672 3652 CFLAGS: "-m32 -DMRB_INT64=1 -DMRB_UTF8_STRING=1" 2673 3653 LDFLAGS: "-m32" 2674 script: env; ./minirake --verbose all test3654 script: env; rake --verbose all test 2675 3655 Test clang-3.8 32bit_float: 3656 stage: test 3657 image: registry.gitlab.com/dabroz/mruby:clang38_0.7 3658 variables: 3659 CC: clang-3.8 3660 CXX: clang++-3.8 3661 LD: clang-3.8 3662 CFLAGS: "-m32 -DMRB_USE_FLOAT=1" 3663 LDFLAGS: "-m32" 3664 script: env; rake --verbose all test 3665 Test clang-3.8 32bit_float_utf8: 3666 stage: test 3667 image: registry.gitlab.com/dabroz/mruby:clang38_0.7 3668 variables: 3669 CC: clang-3.8 3670 CXX: clang++-3.8 3671 LD: clang-3.8 3672 CFLAGS: "-m32 -DMRB_USE_FLOAT=1 -DMRB_UTF8_STRING=1" 3673 LDFLAGS: "-m32" 3674 script: env; rake --verbose all test 3675 Test clang-3.8 32bit_float_word: 2676 3676 stage: test 2677 3677 image: registry.gitlab.com/dabroz/mruby:clang38_0.7 … … 2682 3682 CFLAGS: "-m32 -DMRB_USE_FLOAT=1 -DMRB_WORD_BOXING=1" 2683 3683 LDFLAGS: "-m32" 2684 script: env; ./minirake --verbose all test2685 Test clang-3.8 32bit_float_ utf8:3684 script: env; rake --verbose all test 3685 Test clang-3.8 32bit_float_word_utf8: 2686 3686 stage: test 2687 3687 image: registry.gitlab.com/dabroz/mruby:clang38_0.7 … … 2692 3692 CFLAGS: "-m32 -DMRB_USE_FLOAT=1 -DMRB_WORD_BOXING=1 -DMRB_UTF8_STRING=1" 2693 3693 LDFLAGS: "-m32" 2694 script: env; ./minirake --verbose all test3694 script: env; rake --verbose all test 2695 3695 Test clang-3.8 32bit_float_int16: 2696 3696 stage: test … … 2702 3702 CFLAGS: "-m32 -DMRB_USE_FLOAT=1 -DMRB_INT16=1" 2703 3703 LDFLAGS: "-m32" 2704 script: env; ./minirake --verbose all test3704 script: env; rake --verbose all test 2705 3705 Test clang-3.8 32bit_float_int16_utf8: 2706 3706 stage: test … … 2712 3712 CFLAGS: "-m32 -DMRB_USE_FLOAT=1 -DMRB_INT16=1 -DMRB_UTF8_STRING=1" 2713 3713 LDFLAGS: "-m32" 2714 script: env; ./minirake --verbose all test3714 script: env; rake --verbose all test 2715 3715 Test clang-3.8 32bit_float_int64: 2716 3716 stage: test … … 2722 3722 CFLAGS: "-m32 -DMRB_USE_FLOAT=1 -DMRB_INT64=1" 2723 3723 LDFLAGS: "-m32" 2724 script: env; ./minirake --verbose all test3724 script: env; rake --verbose all test 2725 3725 Test clang-3.8 32bit_float_int64_utf8: 2726 3726 stage: test … … 2732 3732 CFLAGS: "-m32 -DMRB_USE_FLOAT=1 -DMRB_INT64=1 -DMRB_UTF8_STRING=1" 2733 3733 LDFLAGS: "-m32" 2734 script: env; ./minirake --verbose all test3734 script: env; rake --verbose all test 2735 3735 Test clang-3.8 64bit: 3736 stage: test 3737 image: registry.gitlab.com/dabroz/mruby:clang38_0.7 3738 variables: 3739 CC: clang-3.8 3740 CXX: clang++-3.8 3741 LD: clang-3.8 3742 CFLAGS: '' 3743 LDFLAGS: '' 3744 script: env; rake --verbose all test 3745 Test clang-3.8 64bit_utf8: 3746 stage: test 3747 image: registry.gitlab.com/dabroz/mruby:clang38_0.7 3748 variables: 3749 CC: clang-3.8 3750 CXX: clang++-3.8 3751 LD: clang-3.8 3752 CFLAGS: "-DMRB_UTF8_STRING=1" 3753 LDFLAGS: '' 3754 script: env; rake --verbose all test 3755 Test clang-3.8 64bit_nan: 3756 stage: test 3757 image: registry.gitlab.com/dabroz/mruby:clang38_0.7 3758 variables: 3759 CC: clang-3.8 3760 CXX: clang++-3.8 3761 LD: clang-3.8 3762 CFLAGS: "-DMRB_NAN_BOXING=1" 3763 LDFLAGS: '' 3764 script: env; rake --verbose all test 3765 Test clang-3.8 64bit_nan_utf8: 3766 stage: test 3767 image: registry.gitlab.com/dabroz/mruby:clang38_0.7 3768 variables: 3769 CC: clang-3.8 3770 CXX: clang++-3.8 3771 LD: clang-3.8 3772 CFLAGS: "-DMRB_NAN_BOXING=1 -DMRB_UTF8_STRING=1" 3773 LDFLAGS: '' 3774 script: env; rake --verbose all test 3775 Test clang-3.8 64bit_word: 2736 3776 stage: test 2737 3777 image: registry.gitlab.com/dabroz/mruby:clang38_0.7 … … 2742 3782 CFLAGS: "-DMRB_WORD_BOXING=1" 2743 3783 LDFLAGS: '' 2744 script: env; ./minirake --verbose all test2745 Test clang-3.8 64bit_ utf8:3784 script: env; rake --verbose all test 3785 Test clang-3.8 64bit_word_utf8: 2746 3786 stage: test 2747 3787 image: registry.gitlab.com/dabroz/mruby:clang38_0.7 … … 2752 3792 CFLAGS: "-DMRB_WORD_BOXING=1 -DMRB_UTF8_STRING=1" 2753 3793 LDFLAGS: '' 2754 script: env; ./minirake --verbose all test 2755 Test clang-3.8 64bit_nan: 2756 stage: test 2757 image: registry.gitlab.com/dabroz/mruby:clang38_0.7 2758 variables: 2759 CC: clang-3.8 2760 CXX: clang++-3.8 2761 LD: clang-3.8 2762 CFLAGS: "-DMRB_NAN_BOXING=1" 2763 LDFLAGS: '' 2764 script: env; ./minirake --verbose all test 2765 Test clang-3.8 64bit_nan_utf8: 2766 stage: test 2767 image: registry.gitlab.com/dabroz/mruby:clang38_0.7 2768 variables: 2769 CC: clang-3.8 2770 CXX: clang++-3.8 2771 LD: clang-3.8 2772 CFLAGS: "-DMRB_NAN_BOXING=1 -DMRB_UTF8_STRING=1" 2773 LDFLAGS: '' 2774 script: env; ./minirake --verbose all test 3794 script: env; rake --verbose all test 2775 3795 Test clang-3.8 64bit_int16: 2776 3796 stage: test … … 2782 3802 CFLAGS: "-DMRB_INT16=1" 2783 3803 LDFLAGS: '' 2784 script: env; ./minirake --verbose all test3804 script: env; rake --verbose all test 2785 3805 Test clang-3.8 64bit_int16_utf8: 2786 3806 stage: test … … 2792 3812 CFLAGS: "-DMRB_INT16=1 -DMRB_UTF8_STRING=1" 2793 3813 LDFLAGS: '' 2794 script: env; ./minirake --verbose all test3814 script: env; rake --verbose all test 2795 3815 Test clang-3.8 64bit_int16_nan: 2796 3816 stage: test … … 2802 3822 CFLAGS: "-DMRB_INT16=1 -DMRB_NAN_BOXING=1" 2803 3823 LDFLAGS: '' 2804 script: env; ./minirake --verbose all test3824 script: env; rake --verbose all test 2805 3825 Test clang-3.8 64bit_int16_nan_utf8: 2806 3826 stage: test … … 2812 3832 CFLAGS: "-DMRB_INT16=1 -DMRB_NAN_BOXING=1 -DMRB_UTF8_STRING=1" 2813 3833 LDFLAGS: '' 2814 script: env; ./minirake --verbose all test3834 script: env; rake --verbose all test 2815 3835 Test clang-3.8 64bit_int64: 3836 stage: test 3837 image: registry.gitlab.com/dabroz/mruby:clang38_0.7 3838 variables: 3839 CC: clang-3.8 3840 CXX: clang++-3.8 3841 LD: clang-3.8 3842 CFLAGS: "-DMRB_INT64=1" 3843 LDFLAGS: '' 3844 script: env; rake --verbose all test 3845 Test clang-3.8 64bit_int64_utf8: 3846 stage: test 3847 image: registry.gitlab.com/dabroz/mruby:clang38_0.7 3848 variables: 3849 CC: clang-3.8 3850 CXX: clang++-3.8 3851 LD: clang-3.8 3852 CFLAGS: "-DMRB_INT64=1 -DMRB_UTF8_STRING=1" 3853 LDFLAGS: '' 3854 script: env; rake --verbose all test 3855 Test clang-3.8 64bit_int64_word: 2816 3856 stage: test 2817 3857 image: registry.gitlab.com/dabroz/mruby:clang38_0.7 … … 2822 3862 CFLAGS: "-DMRB_INT64=1 -DMRB_WORD_BOXING=1" 2823 3863 LDFLAGS: '' 2824 script: env; ./minirake --verbose all test2825 Test clang-3.8 64bit_int64_ utf8:3864 script: env; rake --verbose all test 3865 Test clang-3.8 64bit_int64_word_utf8: 2826 3866 stage: test 2827 3867 image: registry.gitlab.com/dabroz/mruby:clang38_0.7 … … 2832 3872 CFLAGS: "-DMRB_INT64=1 -DMRB_WORD_BOXING=1 -DMRB_UTF8_STRING=1" 2833 3873 LDFLAGS: '' 2834 script: env; ./minirake --verbose all test3874 script: env; rake --verbose all test 2835 3875 Test clang-3.8 64bit_float: 3876 stage: test 3877 image: registry.gitlab.com/dabroz/mruby:clang38_0.7 3878 variables: 3879 CC: clang-3.8 3880 CXX: clang++-3.8 3881 LD: clang-3.8 3882 CFLAGS: "-DMRB_USE_FLOAT=1" 3883 LDFLAGS: '' 3884 script: env; rake --verbose all test 3885 Test clang-3.8 64bit_float_utf8: 3886 stage: test 3887 image: registry.gitlab.com/dabroz/mruby:clang38_0.7 3888 variables: 3889 CC: clang-3.8 3890 CXX: clang++-3.8 3891 LD: clang-3.8 3892 CFLAGS: "-DMRB_USE_FLOAT=1 -DMRB_UTF8_STRING=1" 3893 LDFLAGS: '' 3894 script: env; rake --verbose all test 3895 Test clang-3.8 64bit_float_word: 2836 3896 stage: test 2837 3897 image: registry.gitlab.com/dabroz/mruby:clang38_0.7 … … 2842 3902 CFLAGS: "-DMRB_USE_FLOAT=1 -DMRB_WORD_BOXING=1" 2843 3903 LDFLAGS: '' 2844 script: env; ./minirake --verbose all test2845 Test clang-3.8 64bit_float_ utf8:3904 script: env; rake --verbose all test 3905 Test clang-3.8 64bit_float_word_utf8: 2846 3906 stage: test 2847 3907 image: registry.gitlab.com/dabroz/mruby:clang38_0.7 … … 2852 3912 CFLAGS: "-DMRB_USE_FLOAT=1 -DMRB_WORD_BOXING=1 -DMRB_UTF8_STRING=1" 2853 3913 LDFLAGS: '' 2854 script: env; ./minirake --verbose all test3914 script: env; rake --verbose all test 2855 3915 Test clang-3.8 64bit_float_int16: 2856 3916 stage: test … … 2862 3922 CFLAGS: "-DMRB_USE_FLOAT=1 -DMRB_INT16=1" 2863 3923 LDFLAGS: '' 2864 script: env; ./minirake --verbose all test3924 script: env; rake --verbose all test 2865 3925 Test clang-3.8 64bit_float_int16_utf8: 2866 3926 stage: test … … 2872 3932 CFLAGS: "-DMRB_USE_FLOAT=1 -DMRB_INT16=1 -DMRB_UTF8_STRING=1" 2873 3933 LDFLAGS: '' 2874 script: env; ./minirake --verbose all test3934 script: env; rake --verbose all test 2875 3935 Test clang-3.8 64bit_float_int64: 3936 stage: test 3937 image: registry.gitlab.com/dabroz/mruby:clang38_0.7 3938 variables: 3939 CC: clang-3.8 3940 CXX: clang++-3.8 3941 LD: clang-3.8 3942 CFLAGS: "-DMRB_USE_FLOAT=1 -DMRB_INT64=1" 3943 LDFLAGS: '' 3944 script: env; rake --verbose all test 3945 Test clang-3.8 64bit_float_int64_utf8: 3946 stage: test 3947 image: registry.gitlab.com/dabroz/mruby:clang38_0.7 3948 variables: 3949 CC: clang-3.8 3950 CXX: clang++-3.8 3951 LD: clang-3.8 3952 CFLAGS: "-DMRB_USE_FLOAT=1 -DMRB_INT64=1 -DMRB_UTF8_STRING=1" 3953 LDFLAGS: '' 3954 script: env; rake --verbose all test 3955 Test clang-3.8 64bit_float_int64_word: 2876 3956 stage: test 2877 3957 image: registry.gitlab.com/dabroz/mruby:clang38_0.7 … … 2882 3962 CFLAGS: "-DMRB_USE_FLOAT=1 -DMRB_INT64=1 -DMRB_WORD_BOXING=1" 2883 3963 LDFLAGS: '' 2884 script: env; ./minirake --verbose all test2885 Test clang-3.8 64bit_float_int64_ utf8:3964 script: env; rake --verbose all test 3965 Test clang-3.8 64bit_float_int64_word_utf8: 2886 3966 stage: test 2887 3967 image: registry.gitlab.com/dabroz/mruby:clang38_0.7 … … 2892 3972 CFLAGS: "-DMRB_USE_FLOAT=1 -DMRB_INT64=1 -DMRB_WORD_BOXING=1 -DMRB_UTF8_STRING=1" 2893 3973 LDFLAGS: '' 2894 script: env; ./minirake --verbose all test3974 script: env; rake --verbose all test 2895 3975 Test clang-3.9 32bit: 3976 stage: test 3977 image: registry.gitlab.com/dabroz/mruby:clang39_0.7 3978 variables: 3979 CC: clang-3.9 3980 CXX: clang++-3.9 3981 LD: clang-3.9 3982 CFLAGS: "-m32 " 3983 LDFLAGS: "-m32" 3984 script: env; rake --verbose all test 3985 Test clang-3.9 32bit_utf8: 3986 stage: test 3987 image: registry.gitlab.com/dabroz/mruby:clang39_0.7 3988 variables: 3989 CC: clang-3.9 3990 CXX: clang++-3.9 3991 LD: clang-3.9 3992 CFLAGS: "-m32 -DMRB_UTF8_STRING=1" 3993 LDFLAGS: "-m32" 3994 script: env; rake --verbose all test 3995 Test clang-3.9 32bit_nan: 3996 stage: test 3997 image: registry.gitlab.com/dabroz/mruby:clang39_0.7 3998 variables: 3999 CC: clang-3.9 4000 CXX: clang++-3.9 4001 LD: clang-3.9 4002 CFLAGS: "-m32 -DMRB_NAN_BOXING=1" 4003 LDFLAGS: "-m32" 4004 script: env; rake --verbose all test 4005 Test clang-3.9 32bit_nan_utf8: 4006 stage: test 4007 image: registry.gitlab.com/dabroz/mruby:clang39_0.7 4008 variables: 4009 CC: clang-3.9 4010 CXX: clang++-3.9 4011 LD: clang-3.9 4012 CFLAGS: "-m32 -DMRB_NAN_BOXING=1 -DMRB_UTF8_STRING=1" 4013 LDFLAGS: "-m32" 4014 script: env; rake --verbose all test 4015 Test clang-3.9 32bit_word: 2896 4016 stage: test 2897 4017 image: registry.gitlab.com/dabroz/mruby:clang39_0.7 … … 2902 4022 CFLAGS: "-m32 -DMRB_WORD_BOXING=1" 2903 4023 LDFLAGS: "-m32" 2904 script: env; ./minirake --verbose all test2905 Test clang-3.9 32bit_ utf8:4024 script: env; rake --verbose all test 4025 Test clang-3.9 32bit_word_utf8: 2906 4026 stage: test 2907 4027 image: registry.gitlab.com/dabroz/mruby:clang39_0.7 … … 2912 4032 CFLAGS: "-m32 -DMRB_WORD_BOXING=1 -DMRB_UTF8_STRING=1" 2913 4033 LDFLAGS: "-m32" 2914 script: env; ./minirake --verbose all test 2915 Test clang-3.9 32bit_nan: 2916 stage: test 2917 image: registry.gitlab.com/dabroz/mruby:clang39_0.7 2918 variables: 2919 CC: clang-3.9 2920 CXX: clang++-3.9 2921 LD: clang-3.9 2922 CFLAGS: "-m32 -DMRB_NAN_BOXING=1" 2923 LDFLAGS: "-m32" 2924 script: env; ./minirake --verbose all test 2925 Test clang-3.9 32bit_nan_utf8: 2926 stage: test 2927 image: registry.gitlab.com/dabroz/mruby:clang39_0.7 2928 variables: 2929 CC: clang-3.9 2930 CXX: clang++-3.9 2931 LD: clang-3.9 2932 CFLAGS: "-m32 -DMRB_NAN_BOXING=1 -DMRB_UTF8_STRING=1" 2933 LDFLAGS: "-m32" 2934 script: env; ./minirake --verbose all test 4034 script: env; rake --verbose all test 2935 4035 Test clang-3.9 32bit_int16: 2936 4036 stage: test … … 2942 4042 CFLAGS: "-m32 -DMRB_INT16=1" 2943 4043 LDFLAGS: "-m32" 2944 script: env; ./minirake --verbose all test4044 script: env; rake --verbose all test 2945 4045 Test clang-3.9 32bit_int16_utf8: 2946 4046 stage: test … … 2952 4052 CFLAGS: "-m32 -DMRB_INT16=1 -DMRB_UTF8_STRING=1" 2953 4053 LDFLAGS: "-m32" 2954 script: env; ./minirake --verbose all test4054 script: env; rake --verbose all test 2955 4055 Test clang-3.9 32bit_int16_nan: 2956 4056 stage: test … … 2962 4062 CFLAGS: "-m32 -DMRB_INT16=1 -DMRB_NAN_BOXING=1" 2963 4063 LDFLAGS: "-m32" 2964 script: env; ./minirake --verbose all test4064 script: env; rake --verbose all test 2965 4065 Test clang-3.9 32bit_int16_nan_utf8: 2966 4066 stage: test … … 2972 4072 CFLAGS: "-m32 -DMRB_INT16=1 -DMRB_NAN_BOXING=1 -DMRB_UTF8_STRING=1" 2973 4073 LDFLAGS: "-m32" 2974 script: env; ./minirake --verbose all test4074 script: env; rake --verbose all test 2975 4075 Test clang-3.9 32bit_int64: 2976 4076 stage: test … … 2982 4082 CFLAGS: "-m32 -DMRB_INT64=1" 2983 4083 LDFLAGS: "-m32" 2984 script: env; ./minirake --verbose all test4084 script: env; rake --verbose all test 2985 4085 Test clang-3.9 32bit_int64_utf8: 2986 4086 stage: test … … 2992 4092 CFLAGS: "-m32 -DMRB_INT64=1 -DMRB_UTF8_STRING=1" 2993 4093 LDFLAGS: "-m32" 2994 script: env; ./minirake --verbose all test4094 script: env; rake --verbose all test 2995 4095 Test clang-3.9 32bit_float: 4096 stage: test 4097 image: registry.gitlab.com/dabroz/mruby:clang39_0.7 4098 variables: 4099 CC: clang-3.9 4100 CXX: clang++-3.9 4101 LD: clang-3.9 4102 CFLAGS: "-m32 -DMRB_USE_FLOAT=1" 4103 LDFLAGS: "-m32" 4104 script: env; rake --verbose all test 4105 Test clang-3.9 32bit_float_utf8: 4106 stage: test 4107 image: registry.gitlab.com/dabroz/mruby:clang39_0.7 4108 variables: 4109 CC: clang-3.9 4110 CXX: clang++-3.9 4111 LD: clang-3.9 4112 CFLAGS: "-m32 -DMRB_USE_FLOAT=1 -DMRB_UTF8_STRING=1" 4113 LDFLAGS: "-m32" 4114 script: env; rake --verbose all test 4115 Test clang-3.9 32bit_float_word: 2996 4116 stage: test 2997 4117 image: registry.gitlab.com/dabroz/mruby:clang39_0.7 … … 3002 4122 CFLAGS: "-m32 -DMRB_USE_FLOAT=1 -DMRB_WORD_BOXING=1" 3003 4123 LDFLAGS: "-m32" 3004 script: env; ./minirake --verbose all test3005 Test clang-3.9 32bit_float_ utf8:4124 script: env; rake --verbose all test 4125 Test clang-3.9 32bit_float_word_utf8: 3006 4126 stage: test 3007 4127 image: registry.gitlab.com/dabroz/mruby:clang39_0.7 … … 3012 4132 CFLAGS: "-m32 -DMRB_USE_FLOAT=1 -DMRB_WORD_BOXING=1 -DMRB_UTF8_STRING=1" 3013 4133 LDFLAGS: "-m32" 3014 script: env; ./minirake --verbose all test4134 script: env; rake --verbose all test 3015 4135 Test clang-3.9 32bit_float_int16: 3016 4136 stage: test … … 3022 4142 CFLAGS: "-m32 -DMRB_USE_FLOAT=1 -DMRB_INT16=1" 3023 4143 LDFLAGS: "-m32" 3024 script: env; ./minirake --verbose all test4144 script: env; rake --verbose all test 3025 4145 Test clang-3.9 32bit_float_int16_utf8: 3026 4146 stage: test … … 3032 4152 CFLAGS: "-m32 -DMRB_USE_FLOAT=1 -DMRB_INT16=1 -DMRB_UTF8_STRING=1" 3033 4153 LDFLAGS: "-m32" 3034 script: env; ./minirake --verbose all test4154 script: env; rake --verbose all test 3035 4155 Test clang-3.9 32bit_float_int64: 3036 4156 stage: test … … 3042 4162 CFLAGS: "-m32 -DMRB_USE_FLOAT=1 -DMRB_INT64=1" 3043 4163 LDFLAGS: "-m32" 3044 script: env; ./minirake --verbose all test4164 script: env; rake --verbose all test 3045 4165 Test clang-3.9 32bit_float_int64_utf8: 3046 4166 stage: test … … 3052 4172 CFLAGS: "-m32 -DMRB_USE_FLOAT=1 -DMRB_INT64=1 -DMRB_UTF8_STRING=1" 3053 4173 LDFLAGS: "-m32" 3054 script: env; ./minirake --verbose all test4174 script: env; rake --verbose all test 3055 4175 Test clang-3.9 64bit: 4176 stage: test 4177 image: registry.gitlab.com/dabroz/mruby:clang39_0.7 4178 variables: 4179 CC: clang-3.9 4180 CXX: clang++-3.9 4181 LD: clang-3.9 4182 CFLAGS: '' 4183 LDFLAGS: '' 4184 script: env; rake --verbose all test 4185 Test clang-3.9 64bit_utf8: 4186 stage: test 4187 image: registry.gitlab.com/dabroz/mruby:clang39_0.7 4188 variables: 4189 CC: clang-3.9 4190 CXX: clang++-3.9 4191 LD: clang-3.9 4192 CFLAGS: "-DMRB_UTF8_STRING=1" 4193 LDFLAGS: '' 4194 script: env; rake --verbose all test 4195 Test clang-3.9 64bit_nan: 4196 stage: test 4197 image: registry.gitlab.com/dabroz/mruby:clang39_0.7 4198 variables: 4199 CC: clang-3.9 4200 CXX: clang++-3.9 4201 LD: clang-3.9 4202 CFLAGS: "-DMRB_NAN_BOXING=1" 4203 LDFLAGS: '' 4204 script: env; rake --verbose all test 4205 Test clang-3.9 64bit_nan_utf8: 4206 stage: test 4207 image: registry.gitlab.com/dabroz/mruby:clang39_0.7 4208 variables: 4209 CC: clang-3.9 4210 CXX: clang++-3.9 4211 LD: clang-3.9 4212 CFLAGS: "-DMRB_NAN_BOXING=1 -DMRB_UTF8_STRING=1" 4213 LDFLAGS: '' 4214 script: env; rake --verbose all test 4215 Test clang-3.9 64bit_word: 3056 4216 stage: test 3057 4217 image: registry.gitlab.com/dabroz/mruby:clang39_0.7 … … 3062 4222 CFLAGS: "-DMRB_WORD_BOXING=1" 3063 4223 LDFLAGS: '' 3064 script: env; ./minirake --verbose all test3065 Test clang-3.9 64bit_ utf8:4224 script: env; rake --verbose all test 4225 Test clang-3.9 64bit_word_utf8: 3066 4226 stage: test 3067 4227 image: registry.gitlab.com/dabroz/mruby:clang39_0.7 … … 3072 4232 CFLAGS: "-DMRB_WORD_BOXING=1 -DMRB_UTF8_STRING=1" 3073 4233 LDFLAGS: '' 3074 script: env; ./minirake --verbose all test 3075 Test clang-3.9 64bit_nan: 3076 stage: test 3077 image: registry.gitlab.com/dabroz/mruby:clang39_0.7 3078 variables: 3079 CC: clang-3.9 3080 CXX: clang++-3.9 3081 LD: clang-3.9 3082 CFLAGS: "-DMRB_NAN_BOXING=1" 3083 LDFLAGS: '' 3084 script: env; ./minirake --verbose all test 3085 Test clang-3.9 64bit_nan_utf8: 3086 stage: test 3087 image: registry.gitlab.com/dabroz/mruby:clang39_0.7 3088 variables: 3089 CC: clang-3.9 3090 CXX: clang++-3.9 3091 LD: clang-3.9 3092 CFLAGS: "-DMRB_NAN_BOXING=1 -DMRB_UTF8_STRING=1" 3093 LDFLAGS: '' 3094 script: env; ./minirake --verbose all test 4234 script: env; rake --verbose all test 3095 4235 Test clang-3.9 64bit_int16: 3096 4236 stage: test … … 3102 4242 CFLAGS: "-DMRB_INT16=1" 3103 4243 LDFLAGS: '' 3104 script: env; ./minirake --verbose all test4244 script: env; rake --verbose all test 3105 4245 Test clang-3.9 64bit_int16_utf8: 3106 4246 stage: test … … 3112 4252 CFLAGS: "-DMRB_INT16=1 -DMRB_UTF8_STRING=1" 3113 4253 LDFLAGS: '' 3114 script: env; ./minirake --verbose all test4254 script: env; rake --verbose all test 3115 4255 Test clang-3.9 64bit_int16_nan: 3116 4256 stage: test … … 3122 4262 CFLAGS: "-DMRB_INT16=1 -DMRB_NAN_BOXING=1" 3123 4263 LDFLAGS: '' 3124 script: env; ./minirake --verbose all test4264 script: env; rake --verbose all test 3125 4265 Test clang-3.9 64bit_int16_nan_utf8: 3126 4266 stage: test … … 3132 4272 CFLAGS: "-DMRB_INT16=1 -DMRB_NAN_BOXING=1 -DMRB_UTF8_STRING=1" 3133 4273 LDFLAGS: '' 3134 script: env; ./minirake --verbose all test4274 script: env; rake --verbose all test 3135 4275 Test clang-3.9 64bit_int64: 4276 stage: test 4277 image: registry.gitlab.com/dabroz/mruby:clang39_0.7 4278 variables: 4279 CC: clang-3.9 4280 CXX: clang++-3.9 4281 LD: clang-3.9 4282 CFLAGS: "-DMRB_INT64=1" 4283 LDFLAGS: '' 4284 script: env; rake --verbose all test 4285 Test clang-3.9 64bit_int64_utf8: 4286 stage: test 4287 image: registry.gitlab.com/dabroz/mruby:clang39_0.7 4288 variables: 4289 CC: clang-3.9 4290 CXX: clang++-3.9 4291 LD: clang-3.9 4292 CFLAGS: "-DMRB_INT64=1 -DMRB_UTF8_STRING=1" 4293 LDFLAGS: '' 4294 script: env; rake --verbose all test 4295 Test clang-3.9 64bit_int64_word: 3136 4296 stage: test 3137 4297 image: registry.gitlab.com/dabroz/mruby:clang39_0.7 … … 3142 4302 CFLAGS: "-DMRB_INT64=1 -DMRB_WORD_BOXING=1" 3143 4303 LDFLAGS: '' 3144 script: env; ./minirake --verbose all test3145 Test clang-3.9 64bit_int64_ utf8:4304 script: env; rake --verbose all test 4305 Test clang-3.9 64bit_int64_word_utf8: 3146 4306 stage: test 3147 4307 image: registry.gitlab.com/dabroz/mruby:clang39_0.7 … … 3152 4312 CFLAGS: "-DMRB_INT64=1 -DMRB_WORD_BOXING=1 -DMRB_UTF8_STRING=1" 3153 4313 LDFLAGS: '' 3154 script: env; ./minirake --verbose all test4314 script: env; rake --verbose all test 3155 4315 Test clang-3.9 64bit_float: 4316 stage: test 4317 image: registry.gitlab.com/dabroz/mruby:clang39_0.7 4318 variables: 4319 CC: clang-3.9 4320 CXX: clang++-3.9 4321 LD: clang-3.9 4322 CFLAGS: "-DMRB_USE_FLOAT=1" 4323 LDFLAGS: '' 4324 script: env; rake --verbose all test 4325 Test clang-3.9 64bit_float_utf8: 4326 stage: test 4327 image: registry.gitlab.com/dabroz/mruby:clang39_0.7 4328 variables: 4329 CC: clang-3.9 4330 CXX: clang++-3.9 4331 LD: clang-3.9 4332 CFLAGS: "-DMRB_USE_FLOAT=1 -DMRB_UTF8_STRING=1" 4333 LDFLAGS: '' 4334 script: env; rake --verbose all test 4335 Test clang-3.9 64bit_float_word: 3156 4336 stage: test 3157 4337 image: registry.gitlab.com/dabroz/mruby:clang39_0.7 … … 3162 4342 CFLAGS: "-DMRB_USE_FLOAT=1 -DMRB_WORD_BOXING=1" 3163 4343 LDFLAGS: '' 3164 script: env; ./minirake --verbose all test3165 Test clang-3.9 64bit_float_ utf8:4344 script: env; rake --verbose all test 4345 Test clang-3.9 64bit_float_word_utf8: 3166 4346 stage: test 3167 4347 image: registry.gitlab.com/dabroz/mruby:clang39_0.7 … … 3172 4352 CFLAGS: "-DMRB_USE_FLOAT=1 -DMRB_WORD_BOXING=1 -DMRB_UTF8_STRING=1" 3173 4353 LDFLAGS: '' 3174 script: env; ./minirake --verbose all test4354 script: env; rake --verbose all test 3175 4355 Test clang-3.9 64bit_float_int16: 3176 4356 stage: test … … 3182 4362 CFLAGS: "-DMRB_USE_FLOAT=1 -DMRB_INT16=1" 3183 4363 LDFLAGS: '' 3184 script: env; ./minirake --verbose all test4364 script: env; rake --verbose all test 3185 4365 Test clang-3.9 64bit_float_int16_utf8: 3186 4366 stage: test … … 3192 4372 CFLAGS: "-DMRB_USE_FLOAT=1 -DMRB_INT16=1 -DMRB_UTF8_STRING=1" 3193 4373 LDFLAGS: '' 3194 script: env; ./minirake --verbose all test4374 script: env; rake --verbose all test 3195 4375 Test clang-3.9 64bit_float_int64: 4376 stage: test 4377 image: registry.gitlab.com/dabroz/mruby:clang39_0.7 4378 variables: 4379 CC: clang-3.9 4380 CXX: clang++-3.9 4381 LD: clang-3.9 4382 CFLAGS: "-DMRB_USE_FLOAT=1 -DMRB_INT64=1" 4383 LDFLAGS: '' 4384 script: env; rake --verbose all test 4385 Test clang-3.9 64bit_float_int64_utf8: 4386 stage: test 4387 image: registry.gitlab.com/dabroz/mruby:clang39_0.7 4388 variables: 4389 CC: clang-3.9 4390 CXX: clang++-3.9 4391 LD: clang-3.9 4392 CFLAGS: "-DMRB_USE_FLOAT=1 -DMRB_INT64=1 -DMRB_UTF8_STRING=1" 4393 LDFLAGS: '' 4394 script: env; rake --verbose all test 4395 Test clang-3.9 64bit_float_int64_word: 3196 4396 stage: test 3197 4397 image: registry.gitlab.com/dabroz/mruby:clang39_0.7 … … 3202 4402 CFLAGS: "-DMRB_USE_FLOAT=1 -DMRB_INT64=1 -DMRB_WORD_BOXING=1" 3203 4403 LDFLAGS: '' 3204 script: env; ./minirake --verbose all test3205 Test clang-3.9 64bit_float_int64_ utf8:4404 script: env; rake --verbose all test 4405 Test clang-3.9 64bit_float_int64_word_utf8: 3206 4406 stage: test 3207 4407 image: registry.gitlab.com/dabroz/mruby:clang39_0.7 … … 3212 4412 CFLAGS: "-DMRB_USE_FLOAT=1 -DMRB_INT64=1 -DMRB_WORD_BOXING=1 -DMRB_UTF8_STRING=1" 3213 4413 LDFLAGS: '' 3214 script: env; ./minirake --verbose all test4414 script: env; rake --verbose all test -
EcnlProtoTool/trunk/mruby-2.1.1/.project
r331 r439 1 1 <?xml version="1.0" encoding="UTF-8"?> 2 2 <projectDescription> 3 <name>mruby- 1.3.0</name>3 <name>mruby-2.1.1</name> 4 4 <comment></comment> 5 5 <projects> -
EcnlProtoTool/trunk/mruby-2.1.1/.travis.yml
r331 r439 6 6 include: 7 7 - os: linux 8 sudo: 90008 sudo: false 9 9 - os: osx 10 10 osx_image: xcode7.1 11 11 12 addons: 13 apt: 14 packages: 15 - gperf 16 17 env: MRUBY_CONFIG=travis_config.rb 18 script: "./minirake all test" 12 env: 13 - MRUBY_CONFIG=travis_config.rb 14 script: "rake -m && rake test" -
EcnlProtoTool/trunk/mruby-2.1.1/.yardopts
r270 r439 13 13 - 14 14 AUTHORS 15 MITL 15 LICENSE 16 16 CONTRIBUTING.md 17 17 doc/guides/*.md -
EcnlProtoTool/trunk/mruby-2.1.1/AUTHORS
r331 r439 1 Original Authors "mruby developers" are: 2 Yukihiro Matsumoto 1 This is the (likely incomplete) list of "mruby developers". 2 If you submit a patch to mruby, please add your name to the end 3 of this list. 4 5 Yukihiro Matsumoto (Matz) 3 6 SCSK KYUSHU CORPORATION 4 7 Kyushu Institute of Technology … … 37 40 Tomasz DÄ 38 41 browski 42 Christopher Aue 43 Masahiro Wakame 44 YAMAMOTO Masaya 45 KOBAYASHI Shuji 46 RIZAL Reckordp -
EcnlProtoTool/trunk/mruby-2.1.1/CONTRIBUTING.md
r270 r439 10 10 * Work on the latest possible state of **mruby/master** 11 11 * Create a branch which is dedicated to your change 12 * Test your changes before creating a pull request (``` ./minirake test```)12 * Test your changes before creating a pull request (```rake test```) 13 13 * If possible write a test case which confirms your change 14 14 * Don't mix several features or bug-fixes in one pull request … … 34 34 (http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf). 35 35 36 Although we target C99, Visual C++ is also an important target for mruby. For 37 this reason a declaration of a local variable has to be at the beginning of a 38 scope block. 36 Although we target C99, we've heard some compilers in the embedded environment 37 still requires declarations of local variables to be at the beginning of a 38 scope. Until we confirm the situation has changed, we use the old-style 39 variable declaration. 40 41 Visual C++ is also an important target for mruby (supported version is 2013 or 42 later). For this reason features that are not supported by Visual C++ may not 43 be used (e.g. `%z` of `strftime()`). 44 45 NOTE: Old GCC requires `-std=gnu99` option to enable C99 support. 39 46 40 47 #### Reduce library dependencies to a minimum -
EcnlProtoTool/trunk/mruby-2.1.1/LEGAL
r270 r439 3 3 4 4 All the files in this distribution are covered under the MIT license 5 (see the file MITL) except some files mentioned below:5 (see the file LICENSE) except some files mentioned below: 6 6 -
EcnlProtoTool/trunk/mruby-2.1.1/Makefile
r298 r439 1 1 # mruby is using Rake (http://rake.rubyforge.org) as a build tool. 2 # We provide a minimalistic version called minirake inside of our3 # codebase.4 2 5 3 RAKE = build.bat -
EcnlProtoTool/trunk/mruby-2.1.1/README.md
r331 r439 4 4 5 5 mruby is the lightweight implementation of the Ruby language complying to (part 6 of) the [ISO standard][ISO-standard]. Its syntax is Ruby 1.9compatible.6 of) the [ISO standard][ISO-standard]. Its syntax is Ruby 2.x compatible. 7 7 8 8 mruby can be linked and embedded within your application. We provide the … … 18 18 ## How to get mruby 19 19 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)20 The stable version 2.1.1 of mruby can be downloaded via the following URL: [https://github.com/mruby/mruby/archive/2.1.1.zip](https://github.com/mruby/mruby/archive/2.1.1.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) … … 31 31 ## mruby home-page 32 32 33 The URL of the mruby home-page is: [http://www.mruby.org](http://www.mruby.org).33 The URL of the mruby home-page is: https://mruby.org. 34 34 35 35 ## Mailing list 36 36 37 We don't have a 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/issues). 38 38 39 39 ## How to compile and install (mruby and gems) 40 40 41 See the [ doc/guides/compile.md](doc/guides/compile.md) file.41 See the [compile.md](https://github.com/mruby/mruby/blob/master/doc/guides/compile.md) file. 42 42 43 43 ## Running Tests … … 45 45 To run the tests, execute the following from the project's root directory. 46 46 47 $ make test47 $ rake test 48 48 49 Or 49 ## Building documentation 50 50 51 $ ruby ./minirake test 51 There are two sets of documentation in mruby: the mruby API (generated by yard) and C API (Doxygen) 52 53 To build both of them, simply go 54 55 rake doc 56 57 You can also view them in your browser 58 59 rake view_api 60 rake view_capi 52 61 53 62 ## How to customize mruby (mrbgems) … … 55 64 mruby contains a package manager called *mrbgems*. To create extensions 56 65 in C and/or Ruby you should create a *GEM*. For a documentation of how to 57 use mrbgems consult the file [ doc/guides/mrbgems.md](doc/guides/mrbgems.md). For example code of58 how to use mrbgems look into the folder *examples/mrbgems/*.66 use mrbgems consult the file [mrbgems.md](https://github.com/mruby/mruby/blob/master/doc/guides/mrbgems.md). 67 For example code of how to use mrbgems look into the folder *examples/mrbgems/*. 59 68 60 69 ## License 61 70 62 mruby is released under the [MIT License]( MITL).71 mruby is released under the [MIT License](https://github.com/mruby/mruby/blob/master/LICENSE). 63 72 64 73 ## Note for License … … 89 98 [ISO-standard]: http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=59579 90 99 [build-status-img]: https://travis-ci.org/mruby/mruby.svg?branch=master 91 [contribution-guidelines]: CONTRIBUTING.md100 [contribution-guidelines]: https://github.com/mruby/mruby/blob/master/CONTRIBUTING.md 92 101 [travis-ci]: https://travis-ci.org/mruby/mruby -
EcnlProtoTool/trunk/mruby-2.1.1/Rakefile
r331 r439 6 6 MRUBY_BUILD_HOST_IS_OPENBSD = RUBY_PLATFORM.include?('openbsd') 7 7 8 Rake.verbose(false) if Rake.verbose == Rake::DSL::DEFAULT 9 10 $LOAD_PATH << File.join(MRUBY_ROOT, "lib") 11 8 12 # load build systems 9 load "#{MRUBY_ROOT}/tasks/ruby_ext.rake" 10 load "#{MRUBY_ROOT}/tasks/mruby_build.rake" 11 load "#{MRUBY_ROOT}/tasks/mrbgem_spec.rake" 13 require "mruby-core-ext" 14 require "mruby/build" 12 15 13 16 # load configuration file … … 30 33 31 34 load "#{MRUBY_ROOT}/tasks/gitlab.rake" 35 load "#{MRUBY_ROOT}/tasks/doc.rake" 36 37 def install_D(src, dst) 38 rm_f dst 39 mkdir_p File.dirname(dst) 40 cp src, dst 41 end 32 42 33 43 ############################## … … 36 46 37 47 bin_path = ENV['INSTALL_DIR'] || "#{MRUBY_ROOT}/bin" 38 FileUtils.mkdir_p bin_path, { :verbose => $verbose }39 48 40 49 depfiles = MRuby.targets['host'].bins.map do |bin| … … 43 52 44 53 file install_path => source_path do |t| 45 FileUtils.rm_f t.name, { :verbose => $verbose } 46 FileUtils.cp t.prerequisites.first, t.name, { :verbose => $verbose } 54 install_D t.prerequisites.first, t.name 47 55 end 48 56 … … 56 64 current_build_dir = File.expand_path "#{build_dir}/#{relative_from_root}" 57 65 58 if current_build_dir !~ /^#{ build_dir}/66 if current_build_dir !~ /^#{Regexp.escape(build_dir)}/ 59 67 current_build_dir = "#{build_dir}/mrbgems/#{gem.name}" 60 68 end … … 64 72 objs = Dir.glob("#{current_dir}/tools/#{bin}/*.{c,cpp,cxx,cc}").map { |f| objfile(f.pathmap("#{current_build_dir}/tools/#{bin}/%n")) } 65 73 66 file exec => objs + [libfile("#{build_dir}/lib/libmruby")]do |t|74 file exec => objs + target.libraries do |t| 67 75 gem_flags = gems.map { |g| g.linker.flags } 68 76 gem_flags_before_libraries = gems.map { |g| g.linker.flags_before_libraries } … … 71 79 gem_library_paths = gems.map { |g| g.linker.library_paths } 72 80 linker.run t.name, t.prerequisites, gem_libraries, gem_library_paths, gem_flags, gem_flags_before_libraries, gem_flags_after_libraries 81 82 gem.call_post_build_event target 73 83 end 74 84 … … 77 87 78 88 file install_path => exec do |t| 79 FileUtils.rm_f t.name, { :verbose => $verbose } 80 FileUtils.cp t.prerequisites.first, t.name, { :verbose => $verbose } 89 install_D t.prerequisites.first, t.name 81 90 end 82 91 depfiles += [ install_path ] … … 86 95 87 96 file install_path => exec do |t| 88 FileUtils.rm_f t.name, { :verbose => $verbose } 89 FileUtils.cp t.prerequisites.first, t.name, { :verbose => $verbose } 97 install_D t.prerequisites.first, t.name 90 98 end 91 99 depfiles += [ install_path ] … … 99 107 100 108 depfiles += MRuby.targets.map { |n, t| 101 [t.libfile("#{t.build_dir}/lib/libmruby")]109 t.libraries 102 110 }.flatten 103 111 … … 114 122 print_build_summary 115 123 end 124 MRuby::Lockfile.write 116 125 end 117 126 118 127 desc "run all mruby tests" 119 task :test => ["all"] do 120 MRuby.each_target do 121 run_test if test_enabled? 128 task :test 129 MRuby.each_target do 130 if test_enabled? 131 t = :"test_#{self.name}" 132 task t => ["all"] do 133 run_test 134 end 135 task :test => t 136 end 137 138 if bintest_enabled? 139 t = :"bintest_#{self.name}" 140 task t => ["all"] do 141 run_bintest 142 end 143 task :test => t 122 144 end 123 145 end … … 126 148 task :clean do 127 149 MRuby.each_target do |t| 128 FileUtils.rm_rf t.build_dir, { :verbose => $verbose }150 rm_rf t.build_dir 129 151 end 130 FileUtils.rm_f depfiles, { :verbose => $verbose }152 rm_f depfiles 131 153 puts "Cleaned up target build folder" 132 154 end 133 155 134 156 desc "clean everything!" 135 task :deep_clean => ["clean" ] do157 task :deep_clean => ["clean", "clean_doc"] do 136 158 MRuby.each_target do |t| 137 FileUtils.rm_rf t.gem_clone_dir, { :verbose => $verbose }159 rm_rf t.gem_clone_dir 138 160 end 139 161 puts "Cleaned up mrbgems build folder" 140 162 end 141 142 desc 'generate document'143 task :doc do144 begin145 sh "mrbdoc"146 rescue147 puts "ERROR: To generate documents, you should install yard-mruby gem."148 puts " $ gem install yard-mruby"149 end150 end -
EcnlProtoTool/trunk/mruby-2.1.1/TODO
r270 r439 3 3 * special variables ($1,$2..) 4 4 * super in aliased methods 5 * multi-assignment decomposing6 * keyword arguments in def statement7 5 8 6 Things to improve (Done but things to fix) -
EcnlProtoTool/trunk/mruby-2.1.1/appveyor.yml
r331 r439 1 1 version: "{build}" 2 2 3 os: Visual Studio 201 53 os: Visual Studio 2017 4 4 5 clone_depth: 50 5 shallow_clone: true 6 7 8 cache: 9 - win_flex_bison 6 10 7 11 8 12 environment: 9 13 matrix: 14 # Visual Studio 2017 64bit 15 - visualcpp: C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvars64.bat 16 17 # Visual Studio 2017 32bit 18 - visualcpp: C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvarsall.bat 19 machine: x86 20 10 21 # Visual Studio 2015 64bit 11 22 - visualcpp: C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat 12 23 machine: amd64 24 25 # Visual Studio 2015 32bit 26 - visualcpp: C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat 27 machine: x86 13 28 14 29 # Visual Studio 2013 64bit … … 19 34 init: 20 35 - call "%visualcpp%" %machine% 21 # For using bison.exe 22 - set PATH=%PATH%;C:\cygwin\bin; 36 # For using Rubyinstaller's Ruby 2.4 64bit 37 - set PATH=C:\Ruby24-x64\bin;%PATH% 38 - ruby --version 23 39 24 40 41 install: 42 - if not exist win_flex_bison ( 43 appveyor DownloadFile "https://github.com/lexxmark/winflexbison/releases/download/v.2.5.10/win_flex_bison-2.5.10.zip" & 44 7z x -y -owin_flex_bison win_flex_bison-2.5.10.zip 45 ) 46 25 47 build_script: 48 - set YACC=.\win_flex_bison\win_bison.exe 26 49 - set MRUBY_CONFIG=appveyor_config.rb 27 - r uby .\minirake test50 - rake -E $stdout.sync=true test -
EcnlProtoTool/trunk/mruby-2.1.1/appveyor_config.rb
r331 r439 1 MRuby::Build.new('debug') do |conf|2 toolchain :visualcpp3 enable_debug4 5 # include all core GEMs6 conf.gembox 'full-core'7 conf.compilers.each do |c|8 c.defines += %w(MRB_GC_STRESS MRB_GC_FIXED_ARENA)9 end10 11 build_mrbc_exec12 end13 14 1 MRuby::Build.new('full-debug') do |conf| 15 2 toolchain :visualcpp … … 18 5 # include all core GEMs 19 6 conf.gembox 'full-core' 20 conf.cc.defines = %w(MRB_ENABLE_DEBUG_HOOK)7 conf.cc.defines += %w(MRB_GC_STRESS MRB_METHOD_CACHE MRB_ENABLE_DEBUG_HOOK) 21 8 22 9 conf.enable_test -
EcnlProtoTool/trunk/mruby-2.1.1/benchmark/bm_ao_render.rb
r321 r439 69 69 len = vlength 70 70 v = Vec.new(@x, @y, @z) 71 if len > 1.0e-17 then71 if len > 1.0e-17 72 72 v.x = v.x / len 73 73 v.y = v.y / len … … 93 93 c = rs.vdot(rs) - (@radius * @radius) 94 94 d = b * b - c 95 if d > 0.0 then95 if d > 0.0 96 96 t = - b - Math.sqrt(d) 97 97 98 if t > 0.0 and t < isect.t then98 if t > 0.0 and t < isect.t 99 99 isect.t = t 100 100 isect.hit = true … … 119 119 v = ray.dir.vdot(@n) 120 120 v0 = v 121 if v < 0.0 then121 if v < 0.0 122 122 v0 = -v 123 123 end 124 if v0 < 1.0e-17 then124 if v0 < 1.0e-17 125 125 return 126 126 end … … 128 128 t = -(ray.org.vdot(@n) + d) / v 129 129 130 if t > 0.0 and t < isect.t then130 if t > 0.0 and t < isect.t 131 131 isect.hit = true 132 132 isect.t = t … … 171 171 def clamp(f) 172 172 i = f * 255.5 173 if i > 255.0 then173 if i > 255.0 174 174 i = 255.0 175 175 end 176 if i < 0.0 then176 if i < 0.0 177 177 i = 0.0 178 178 end … … 184 184 basis[1] = Vec.new(0.0, 0.0, 0.0) 185 185 186 if n.x < 0.6 and n.x > -0.6 then186 if n.x < 0.6 and n.x > -0.6 187 187 basis[1].x = 1.0 188 elsif n.y < 0.6 and n.y > -0.6 then188 elsif n.y < 0.6 and n.y > -0.6 189 189 basis[1].y = 1.0 190 elsif n.z < 0.6 and n.z > -0.6 then190 elsif n.z < 0.6 and n.z > -0.6 191 191 basis[1].z = 1.0 192 192 else … … 222 222 isect.pl.y + eps * isect.n.y, 223 223 isect.pl.z + eps * isect.n.z) 224 nphi.times do |j|225 ntheta.times do |i|224 nphi.times do 225 ntheta.times do 226 226 r = Rand::rand 227 227 phi = 2.0 * 3.14159265 * Rand::rand … … 242 242 @spheres[2].intersect(ray, occisect) 243 243 @plane.intersect(ray, occisect) 244 if occisect.hit then244 if occisect.hit 245 245 occlusion = occlusion + 1.0 246 246 else … … 284 284 @spheres[2].intersect(ray, isect) 285 285 @plane.intersect(ray, isect) 286 if isect.hit then286 if isect.hit 287 287 col = ambient_occlusion(isect) 288 288 rad.x = rad.x + col.x -
EcnlProtoTool/trunk/mruby-2.1.1/benchmark/bm_app_lc_fizzbuzz.rb
r321 r439 49 49 end 50 50 51 answer_str = answer.to_a 52 # puts answer_str 51 # puts answer -
EcnlProtoTool/trunk/mruby-2.1.1/benchmark/bm_so_lists.rb
r321 r439 18 18 # remove each individual item from right side of li3 and 19 19 # append to right side of li2 (reversing list) 20 while (not li3.empty?)20 until li3.empty? 21 21 li2.push(li3.pop) 22 22 end … … 25 25 li1.reverse! 26 26 # check that first item is now SIZE 27 if li1[0] != SIZE then27 if li1[0] != SIZE 28 28 p "not SIZE" 29 29 0 30 30 else 31 31 # compare li1 and li2 for equality 32 if li1 != li2 then32 if li1 != li2 33 33 return(0) 34 34 else -
EcnlProtoTool/trunk/mruby-2.1.1/build.bat
r424 r439 7 7 cd /d %DIR% 8 8 9 r uby -Eutf-8 ./minirake %19 rake %1 -
EcnlProtoTool/trunk/mruby-2.1.1/build_config.rb
r424 r439 3 3 4 4 # Gets set by the VS command prompts. 5 #if ENV['VisualStudioVersion'] || ENV['VSINSTALLDIR']5 if ENV['VisualStudioVersion'] || ENV['VSINSTALLDIR'] 6 6 toolchain :visualcpp 7 #else 8 # toolchain :gcc 9 #end 10 11 enable_debug 7 else 8 toolchain :gcc 9 end 10 11 # Turn on `enable_debug` for better debugging 12 # enable_debug 12 13 13 14 # Use mrbgems … … 18 19 # conf.gem 'examples/mrbgems/c_and_ruby_extension_example' 19 20 # 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 # conf.gem :mgem => 'mruby-onig-regexp' 22 # conf.gem :github => 'mattn/mruby-onig-regexp' 23 # conf.gem :git => 'git@github.com:mattn/mruby-onig-regexp.git', :branch => 'master', :options => '-v' 23 24 24 25 # include the default GEMs … … 29 30 # cc.flags = [ENV['CFLAGS'] || %w()] 30 31 # cc.include_paths = ["#{root}/include"] 31 # cc.defines = %w( DISABLE_GEMS)32 # cc.option_include_path = '-I%s'32 # cc.defines = %w() 33 # cc.option_include_path = %q[-I"%s"] 33 34 # cc.option_define = '-D%s' 34 # cc.compile_options = "%{flags} -MMD -o %{outfile} -c %{infile}"35 # cc.compile_options = %Q[%{flags} -MMD -o "%{outfile}" -c "%{infile}"] 35 36 # end 36 37 … … 50 51 # linker.option_library = '-l%s' 51 52 # linker.option_library_path = '-L%s' 52 # linker.link_options = "%{flags} -o %{outfile}%{objs} %{libs}"53 # linker.link_options = "%{flags} -o "%{outfile}" %{objs} %{libs}" 53 54 # end 54 55 … … 56 57 # conf.archiver do |archiver| 57 58 # archiver.command = ENV['AR'] || 'ar' 58 # archiver.archive_options = 'rs %{outfile}%{objs}'59 # archiver.archive_options = 'rs "%{outfile}" %{objs}' 59 60 # end 60 61 … … 62 63 # conf.yacc do |yacc| 63 64 # yacc.command = ENV['YACC'] || 'bison' 64 # yacc.compile_options = '-o %{outfile} %{infile}'65 # yacc.compile_options = %q[-o "%{outfile}" "%{infile}"] 65 66 # end 66 67 … … 68 69 # conf.gperf do |gperf| 69 70 # gperf.command = 'gperf' 70 # gperf.compile_options = '-L ANSI-C -C -p -j1 -i 1 -g -o -t -N mrb_reserved_word -k"1,3,$" %{infile} > %{outfile}'71 # gperf.compile_options = %q[-L ANSI-C -C -p -j1 -i 1 -g -o -t -N mrb_reserved_word -k"1,3,$" "%{infile}" > "%{outfile}"] 71 72 # end 72 73 … … 84 85 # conf.enable_bintest 85 86 end 86 87 =begin 87 88 MRuby::Build.new('host-debug') do |conf| 88 89 # load specific toolchain settings … … 110 111 end 111 112 112 #MRuby::Build.new('test') do |conf| 113 MRuby::Build.new('test') do |conf| 114 # Gets set by the VS command prompts. 115 if ENV['VisualStudioVersion'] || ENV['VSINSTALLDIR'] 116 toolchain :visualcpp 117 else 118 toolchain :gcc 119 end 120 121 enable_debug 122 conf.enable_bintest 123 conf.enable_test 124 125 conf.gembox 'default' 126 end 127 =end 128 #MRuby::Build.new('bench') do |conf| 113 129 # # Gets set by the VS command prompts. 114 130 # if ENV['VisualStudioVersion'] || ENV['VSINSTALLDIR'] … … 116 132 # else 117 133 # toolchain :gcc 134 # conf.cc.flags << '-O3' 118 135 # end 119 #120 # enable_debug121 # conf.enable_bintest122 # conf.enable_test123 136 # 124 137 # conf.gembox 'default' … … 137 150 # 138 151 # conf.test_runner.command = 'env' 139 #140 152 # end 141 153 142 # Define cross build settings154 # Cross build for arm-none-eabi 143 155 MRuby::CrossBuild.new('arm-none-eabi') do |conf| 144 156 toolchain :gcc … … 149 161 conf.archiver.command = "arm-none-eabi-ar" 150 162 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 )163 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 -Wstack-usage=256 -ffunction-sections -fdata-sections) 152 164 conf.cc.include_paths << "../musl-1.1.18/include" 153 165 154 conf.linker.flags << %w(-nostdlib) 155 conf.linker.library_paths << "../musl-1.1.18/lib" 156 conf.linker.libraries << %w(c gcc) 157 158 #configuration for low memory environment 159 conf.cc.defines << %w(MRB_GC_STRESS) 160 #conf.cc.defines << %w(DISABLE_STDIO) 161 conf.cc.defines = %w(MRB_ENABLE_DEBUG_HOOK) 162 163 conf.build_mrbtest_lib_only 166 conf.cc.defines << %w(MRB_USE_CUSTOM_RO_DATA_P MRB_ENABLE_DEBUG_HOOK MRB_CONSTRAINED_BASELINE_PROFILE) 167 168 #conf.build_mrbtest_lib_only 164 169 165 170 conf.gem "#{root}/mrbgems/mruby-compiler" 171 conf.gem "#{root}/mrbgems/mruby-eval" 172 conf.gem "#{root}/mrbgems/mruby-io" 173 conf.gem "#{root}/mrbgems/mruby-math" 174 conf.gem "#{root}/mrbgems/mruby-pack" 175 conf.gem "#{root}/mrbgems/mruby-print" 176 conf.gem "#{root}/mrbgems/mruby-random" 177 conf.gem "#{root}/mrbgems/mruby-socket" 178 conf.gem "#{root}/mrbgems/mruby-sprintf" 179 conf.gem "#{root}/mrbgems/mruby-struct" 180 conf.gem "#{root}/mrbgems/mruby-time" 166 181 conf.gem "#{root}/mrbgems/mruby-numeric-ext" 167 182 conf.gem "#{root}/mrbgems/mruby-string-ext" 168 183 conf.gem '../mrbgems/mruby-onig-regexp' do |g| 184 g.cc.flags << %w(-DHAVE_ONIGMO_H) 169 185 g.cc.include_paths << "../onigmo-6.1.3/src" 170 186 end … … 177 193 conf.gem "#{root}/../mrbgems/mruby-errno" 178 194 conf.gem "#{root}/../mrbgems/mruby-iijson" 179 conf.gem "#{root}/../mrbgems/mruby-io"180 195 conf.gem "#{root}/../mrbgems/mruby-ipaddr" 181 196 conf.gem "#{root}/../mrbgems/mruby-mock" 182 conf.gem "#{root}/../mrbgems/mruby-pack"183 197 #conf.gem "#{root}/../mrbgems/mruby-require" 184 conf.gem "#{root}/../mrbgems/mruby-socket"185 198 conf.gem "#{root}/../mrbgems/mruby-tls-openssl" do |g| 186 199 g.cc.include_paths << "#{g.dir}/../../openssl-1.1.0e/include" … … 202 215 203 216 conf.archiver.command = "llvm-ar" 217 conf.cc.flags << '-ffunction-sections -fdata-sections' 218 conf.linker.flags << '-Wl,--gc-sections' 204 219 conf.linker.flags << '--save-bc %{outfile}.bc --pre-js ../webapp/webmrbc/pre.js --post-js ../webapp/webmrbc/post.js --use-preload-plugins' 205 220 #conf.linker.flags << '-s BINARYEN=1' … … 207 222 208 223 # include the default GEMs 209 conf.gembox 'default'224 #conf.gembox 'default' 210 225 conf.gem :core => 'mruby-bin-mrbc' 211 226 end -
EcnlProtoTool/trunk/mruby-2.1.1/examples/targets/build_config_ArduinoDue.rb
r321 r439 43 43 -Dprintf=iprintf -mcpu=cortex-m3 -DF_CPU=84000000L -DARDUINO=156 -DARDUINO_SAM_DUE -DARDUINO_ARCH_SAM 44 44 -D__SAM3X8E__ -mthumb -DUSB_PID=0x003e -DUSB_VID=0x2341 -DUSBCON -DUSB_MANUFACTURER="Unknown" -DUSB_PRODUCT="Arduino Due") 45 cc.compile_options = "%{flags} -o %{outfile} -c %{infile}"45 cc.compile_options = %Q[%{flags} -o "%{outfile}" -c "%{infile}"] 46 46 47 47 #configuration for low memory environment 48 48 cc.defines << %w(MRB_HEAP_PAGE_SIZE=64) 49 cc.defines << %w(MRB_USE_IV_SEGLIST)50 49 cc.defines << %w(KHASH_DEFAULT_SIZE=8) 51 50 cc.defines << %w(MRB_STR_BUF_MIN_SIZE=20) … … 66 65 conf.archiver do |archiver| 67 66 archiver.command = "#{BIN_PATH}/arm-none-eabi-ar" 68 archiver.archive_options = 'rcs %{outfile}%{objs}'67 archiver.archive_options = 'rcs "%{outfile}" %{objs}' 69 68 end 70 69 -
EcnlProtoTool/trunk/mruby-2.1.1/examples/targets/build_config_IntelEdison.rb
r331 r439 33 33 cc.flags << %w(-O2 -pipe -g -feliminate-unused-debug-types) 34 34 cc.flags << "--sysroot=#{POKY_EDISON_SYSROOT}" 35 cc.compile_options = "%{flags} -o %{outfile} -c %{infile}"35 cc.compile_options = %Q[%{flags} -o "%{outfile}" -c "%{infile}"] 36 36 cc.defines = %w(ENABLE_READLINE) 37 37 end … … 48 48 conf.archiver do |archiver| 49 49 archiver.command = "#{POKY_EDISON_BIN_PATH}/i586-poky-linux-ar" 50 archiver.archive_options = 'rcs %{outfile}%{objs}'50 archiver.archive_options = 'rcs "%{outfile}" %{objs}' 51 51 end 52 52 -
EcnlProtoTool/trunk/mruby-2.1.1/examples/targets/build_config_IntelGalileo.rb
r321 r439 40 40 -ffunction-sections -fdata-sections -MMD -DARDUINO=153) 41 41 cc.flags << "--sysroot=#{GALILEO_SYSROOT}" 42 cc.compile_options = "%{flags} -o %{outfile} -c %{infile}"42 cc.compile_options = %Q[%{flags} -o "%{outfile}" -c "%{infile}"] 43 43 end 44 44 … … 55 55 conf.archiver do |archiver| 56 56 archiver.command = "#{GALILEO_BIN_PATH}/i586-poky-linux-uclibc-ar" 57 archiver.archive_options = 'rcs %{outfile}%{objs}'57 archiver.archive_options = 'rcs "%{outfile}" %{objs}' 58 58 end 59 59 -
EcnlProtoTool/trunk/mruby-2.1.1/examples/targets/build_config_RX630.rb
r331 r439 28 28 cc.command = "#{BIN_PATH}/rx-elf-gcc" 29 29 cc.flags = "-Wall -g -O2 -flto -mcpu=rx600 -m64bit-doubles" 30 cc.compile_options = "%{flags} -o %{outfile} -c %{infile}"30 cc.compile_options = %Q[%{flags} -o "%{outfile}" -c "%{infile}"] 31 31 32 32 #configuration for low memory environment 33 33 cc.defines << %w(MRB_USE_FLOAT) 34 34 cc.defines << %w(MRB_HEAP_PAGE_SIZE=64) 35 cc.defines << %w(MRB_USE_IV_SEGLIST)36 35 cc.defines << %w(KHASH_DEFAULT_SIZE=8) 37 36 cc.defines << %w(MRB_STR_BUF_MIN_SIZE=20) … … 55 54 conf.archiver do |archiver| 56 55 archiver.command = "#{BIN_PATH}/rx-elf-ar" 57 archiver.archive_options = 'rcs %{outfile}%{objs}'56 archiver.archive_options = 'rcs "%{outfile}" %{objs}' 58 57 end 59 58 -
EcnlProtoTool/trunk/mruby-2.1.1/examples/targets/build_config_android_arm64-v8a.rb
r331 r439 16 16 # Requires Android NDK r13 or later. 17 17 MRuby::CrossBuild.new('android-arm64-v8a') do |conf| 18 params = { 19 :arch => 'arm64-v8a', 18 params = { 19 :arch => 'arm64-v8a', 20 20 :platform => 'android-24', 21 21 :toolchain => :clang, -
EcnlProtoTool/trunk/mruby-2.1.1/examples/targets/build_config_android_armeabi.rb
r331 r439 16 16 # Requires Android NDK r13 or later. 17 17 MRuby::CrossBuild.new('android-armeabi') do |conf| 18 params = { 19 :arch => 'armeabi', 18 params = { 19 :arch => 'armeabi', 20 20 :platform => 'android-24', 21 21 :toolchain => :clang, -
EcnlProtoTool/trunk/mruby-2.1.1/examples/targets/build_config_chipKITMax32.rb
r321 r439 40 40 -fno-short-double -mprocessor=32MX795F512L -DF_CPU=80000000L -DARDUINO=23 -D_BOARD_MEGA_ 41 41 -DMPIDEVER=0x01000202 -DMPIDE=23) 42 cc.compile_options = "%{flags} -o %{outfile} -c %{infile}"42 cc.compile_options = %Q[%{flags} -o "%{outfile}" -c "%{infile}"] 43 43 44 44 #configuration for low memory environment 45 45 cc.defines << %w(MRB_HEAP_PAGE_SIZE=64) 46 cc.defines << %w(MRB_USE_IV_SEGLIST)47 46 cc.defines << %w(KHASH_DEFAULT_SIZE=8) 48 47 cc.defines << %w(MRB_STR_BUF_MIN_SIZE=20) … … 62 61 conf.archiver do |archiver| 63 62 archiver.command = "#{PIC32_PATH}/compiler/pic32-tools/bin/pic32-ar" 64 archiver.archive_options = 'rcs %{outfile}%{objs}'63 archiver.archive_options = 'rcs "%{outfile}" %{objs}' 65 64 end 66 65 -
EcnlProtoTool/trunk/mruby-2.1.1/include/mrbconf.h
r331 r439 29 29 //#define MRB_USE_FLOAT 30 30 31 /* add -DMRB_INT16 to use 16bit integer for mrb_int; conflict with MRB_INT64 */ 32 //#define MRB_INT16 33 34 /* add -DMRB_INT64 to use 64bit integer for mrb_int; conflict with MRB_INT16 */ 31 /* exclude floating point numbers */ 32 //#define MRB_WITHOUT_FLOAT 33 34 /* add -DMRB_METHOD_CACHE to use method cache to improve performance */ 35 //#define MRB_METHOD_CACHE 36 /* size of the method cache (need to be the power of 2) */ 37 //#define MRB_METHOD_CACHE_SIZE (1<<7) 38 39 /* add -DMRB_METHOD_T_STRUCT on machines that use higher bits of pointers */ 40 /* no MRB_METHOD_T_STRUCT requires highest 2 bits of function pointers to be zero */ 41 #ifndef MRB_METHOD_T_STRUCT 42 // can't use highest 2 bits of function pointers on 32bit Windows. 43 # if defined(_WIN32) && !defined(_WIN64) 44 # define MRB_METHOD_T_STRUCT 45 # endif 46 #endif 47 48 /* add -DMRB_INT32 to use 32bit integer for mrb_int; conflict with MRB_INT64; 49 Default for 32-bit CPU mode. */ 50 //#define MRB_INT32 51 52 /* add -DMRB_INT64 to use 64bit integer for mrb_int; conflict with MRB_INT32; 53 Default for 64-bit CPU mode. */ 35 54 //#define MRB_INT64 36 55 37 /* represent mrb_value in boxed double; conflict with MRB_USE_FLOAT */ 56 /* if no specific integer type is chosen */ 57 #if !defined(MRB_INT32) && !defined(MRB_INT64) 58 # if defined(MRB_64BIT) && !defined(MRB_NAN_BOXING) 59 /* Use 64bit integers on 64bit architecture (without MRB_NAN_BOXING) */ 60 # define MRB_INT64 61 # else 62 /* Otherwise use 32bit integers */ 63 # define MRB_INT32 64 # endif 65 #endif 66 67 /* define on big endian machines; used by MRB_NAN_BOXING, etc. */ 68 #ifndef MRB_ENDIAN_BIG 69 # if (defined(BYTE_ORDER) && defined(BIG_ENDIAN) && BYTE_ORDER == BIG_ENDIAN) || \ 70 (defined(__BYTE_ORDER__) && defined(__ORDER_BIG_ENDIAN__) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__) 71 # define MRB_ENDIAN_BIG 72 # endif 73 #endif 74 75 /* represent mrb_value in boxed double; conflict with MRB_USE_FLOAT and MRB_WITHOUT_FLOAT */ 38 76 //#define MRB_NAN_BOXING 39 40 /* define on big endian machines; used by MRB_NAN_BOXING */41 //#define MRB_ENDIAN_BIG42 77 43 78 /* represent mrb_value as a word (natural unit of data for the processor) */ … … 53 88 //#define MRB_HEAP_PAGE_SIZE 1024 54 89 55 /* use segmented list for IV table */ 56 //#define MRB_USE_IV_SEGLIST 57 58 /* initial size for IV khash; ignored when MRB_USE_IV_SEGLIST is set */ 59 //#define MRB_IVHASH_INIT_SIZE 8 60 61 /* if _etext and _edata available, mruby can reduce memory used by symbols */ 62 //#define MRB_USE_ETEXT_EDATA 63 64 /* do not use __init_array_start to determine readonly data section; 65 effective only when MRB_USE_ETEXT_EDATA is defined */ 66 //#define MRB_NO_INIT_ARRAY_START 90 /* if __ehdr_start is available, mruby can reduce memory used by symbols */ 91 //#define MRB_USE_LINK_TIME_RO_DATA_P 92 93 /* if MRB_USE_LINK_TIME_RO_DATA_P does not work, 94 you can try mrb_ro_data_p() that you have implemented yourself in any file; 95 prototype is `mrb_bool mrb_ro_data_p(const char *ptr)` */ 96 //#define MRB_USE_CUSTOM_RO_DATA_P 67 97 68 98 /* turn off generational GC by default */ … … 94 124 95 125 /* -DMRB_DISABLE_XXXX to drop following features */ 96 //#define MRB_DISABLE_STDIO 126 //#define MRB_DISABLE_STDIO /* use of stdio */ 97 127 98 128 /* -DMRB_ENABLE_XXXX to enable following features */ 99 //#define MRB_ENABLE_DEBUG_HOOK /* hooks for debugger */ 129 //#define MRB_ENABLE_DEBUG_HOOK /* hooks for debugger */ 130 //#define MRB_ENABLE_ALL_SYMBOLS /* Symbols.all_symbols */ 100 131 101 132 /* end of configuration */ … … 123 154 #endif 124 155 156 /* 157 ** mruby tuning profiles 158 **/ 159 160 /* A profile for micro controllers */ 161 #if defined(MRB_CONSTRAINED_BASELINE_PROFILE) 162 # ifndef KHASH_DEFAULT_SIZE 163 # define KHASH_DEFAULT_SIZE 16 164 # endif 165 166 # ifndef MRB_STR_BUF_MIN_SIZE 167 # define MRB_STR_BUF_MIN_SIZE 32 168 # endif 169 170 # ifndef MRB_HEAP_PAGE_SIZE 171 # define MRB_HEAP_PAGE_SIZE 256 172 # endif 173 174 /* A profile for default mruby */ 175 #elif defined(MRB_BASELINE_PROFILE) 176 177 /* A profile for desktop computers or workstations; rich memory! */ 178 #elif defined(MRB_MAIN_PROFILE) 179 # ifndef MRB_METHOD_CACHE 180 # define MRB_METHOD_CACHE 181 # endif 182 183 # ifndef MRB_METHOD_CACHE_SIZE 184 # define MRB_METHOD_CACHE_SIZE (1<<10) 185 # endif 186 187 # ifndef MRB_IV_SEGMENT_SIZE 188 # define MRB_IV_SEGMENT_SIZE 32 189 # endif 190 191 # ifndef MRB_HEAP_PAGE_SIZE 192 # define MRB_HEAP_PAGE_SIZE 4096 193 # endif 194 195 /* A profile for server; mruby vm is long life */ 196 #elif defined(MRB_HIGH_PROFILE) 197 # ifndef MRB_METHOD_CACHE 198 # define MRB_METHOD_CACHE 199 # endif 200 201 # ifndef MRB_METHOD_CACHE_SIZE 202 # define MRB_METHOD_CACHE_SIZE (1<<12) 203 # endif 204 205 # ifndef MRB_IV_SEGMENT_SIZE 206 # define MRB_IV_SEGMENT_SIZE 64 207 # endif 208 209 # ifndef MRB_HEAP_PAGE_SIZE 210 # define MRB_HEAP_PAGE_SIZE 4096 211 # endif 212 #endif 213 125 214 #endif /* MRUBYCONF_H */ -
EcnlProtoTool/trunk/mruby-2.1.1/include/mruby.h
r331 r439 2 2 ** mruby - An embeddable Ruby implementation 3 3 ** 4 ** Copyright (c) mruby developers 2010-20 174 ** Copyright (c) mruby developers 2010-2020 5 5 ** 6 6 ** Permission is hereby granted, free of charge, to any person obtaining … … 26 26 */ 27 27 28 /** 29 * @file mruby.h 30 */ 31 28 32 #ifndef MRUBY_H 29 33 #define MRUBY_H … … 35 39 #endif 36 40 41 #include <stdarg.h> 37 42 #include <stdint.h> 38 43 #include <stddef.h> … … 58 63 #endif 59 64 60 #if __STDC_VERSION__ >= 201112L65 #if defined __STDC_VERSION__ && __STDC_VERSION__ >= 201112L 61 66 #define mrb_static_assert(exp, str) _Static_assert(exp, str) 62 67 #else … … 65 70 66 71 #include "mrbconf.h" 72 73 #include <mruby/common.h> 74 #include <mruby/value.h> 75 #include <mruby/gc.h> 76 #include <mruby/version.h> 77 78 #ifdef _MSC_VER 79 #include <float.h> 80 #endif 81 82 #ifndef MRB_WITHOUT_FLOAT 83 #ifndef FLT_EPSILON 84 #define FLT_EPSILON (1.19209290e-07f) 85 #endif 86 #ifndef DBL_EPSILON 87 #define DBL_EPSILON ((double)2.22044604925031308085e-16L) 88 #endif 89 #ifndef LDBL_EPSILON 90 #define LDBL_EPSILON (1.08420217248550443401e-19L) 91 #endif 67 92 68 93 #ifdef MRB_USE_FLOAT … … 71 96 #define MRB_FLOAT_EPSILON DBL_EPSILON 72 97 #endif 73 74 #include "mruby/common.h" 75 #include <mruby/value.h> 76 #include <mruby/gc.h> 77 #include <mruby/version.h> 98 #endif 78 99 79 100 /** … … 82 103 MRB_BEGIN_DECL 83 104 84 typedef uint32_t mrb_code; 85 86 /** 87 * Required arguments signature type. 105 typedef uint8_t mrb_code; 106 107 /** 108 * \class mrb_aspec 109 * 110 * Specifies the number of arguments a function takes 111 * 112 * Example: `MRB_ARGS_REQ(2) | MRB_ARGS_OPT(1)` for a method that expects 2..3 arguments 88 113 */ 89 114 typedef uint32_t mrb_aspec; 90 91 115 92 116 struct mrb_irep; … … 112 136 struct RProc *proc; 113 137 mrb_value *stackent; 114 int nregs; 115 int ridx; 116 int epos; 138 uint16_t ridx; 139 uint16_t epos; 117 140 struct REnv *env; 118 mrb_code *pc;/* return address */119 mrb_code *err;/* error position */141 const mrb_code *pc; /* return address */ 142 const mrb_code *err; /* error position */ 120 143 int argc; 121 144 int acc; … … 141 164 mrb_callinfo *cibase, *ciend; 142 165 143 mrb_code **rescue;/* exception handler stack */144 int rsize;166 uint16_t *rescue; /* exception handler stack */ 167 uint16_t rsize; 145 168 struct RProc **ensure; /* ensure handler stack */ 146 int esize, eidx;169 uint16_t esize, eidx; 147 170 148 171 enum mrb_fiber_state status; … … 151 174 }; 152 175 176 #ifdef MRB_METHOD_CACHE_SIZE 177 # define MRB_METHOD_CACHE 178 #else 179 /* default method cache size: 128 */ 180 /* cache size needs to be power of 2 */ 181 # define MRB_METHOD_CACHE_SIZE (1<<7) 182 #endif 183 184 /** 185 * Function pointer type for a function callable by mruby. 186 * 187 * The arguments to the function are stored on the mrb_state. To get them see mrb_get_args 188 * 189 * @param mrb The mruby state 190 * @param self The self object 191 * @return [mrb_value] The function's return value 192 */ 193 typedef mrb_value (*mrb_func_t)(struct mrb_state *mrb, mrb_value self); 194 195 #ifndef MRB_METHOD_T_STRUCT 196 typedef uintptr_t mrb_method_t; 197 #else 198 typedef struct { 199 uint8_t flags; 200 union { 201 struct RProc *proc; 202 mrb_func_t func; 203 }; 204 } mrb_method_t; 205 #endif 206 207 #ifdef MRB_METHOD_CACHE 208 struct mrb_cache_entry { 209 struct RClass *c, *c0; 210 mrb_sym mid; 211 mrb_method_t m; 212 }; 213 #endif 214 153 215 struct mrb_jmpbuf; 154 216 155 217 typedef void (*mrb_atexit_func)(struct mrb_state*); 156 157 #define MRB_STATE_NO_REGEXP 1158 #define MRB_STATE_REGEXP 2159 218 160 219 typedef struct mrb_state { 161 220 struct mrb_jmpbuf *jmp; 162 221 163 uint32_t flags;164 222 mrb_allocf allocf; /* memory allocation function */ 165 223 void *allocf_ud; /* auxiliary data of allocf */ … … 179 237 struct RClass *array_class; 180 238 struct RClass *hash_class; 181 239 struct RClass *range_class; 240 241 #ifndef MRB_WITHOUT_FLOAT 182 242 struct RClass *float_class; 243 #endif 183 244 struct RClass *fixnum_class; 184 245 struct RClass *true_class; … … 188 249 struct RClass *kernel_module; 189 250 190 struct alloca_header *mems;191 251 mrb_gc gc; 192 252 253 #ifdef MRB_METHOD_CACHE 254 struct mrb_cache_entry cache[MRB_METHOD_CACHE_SIZE]; 255 #endif 256 193 257 mrb_sym symidx; 194 struct kh_n2s *name2sym; /* symbol hash */195 258 struct symbol_name *symtbl; /* symbol table */ 259 mrb_sym symhash[256]; 196 260 size_t symcapa; 261 #ifndef MRB_ENABLE_SYMBOLL_ALL 262 char symbuf[8]; /* buffer for small symbol names */ 263 #endif 197 264 198 265 #ifdef MRB_ENABLE_DEBUG_HOOK 199 void (*code_fetch_hook)(struct mrb_state* mrb, struct mrb_irep *irep, mrb_code *pc, mrb_value *regs);200 void (*debug_op_hook)(struct mrb_state* mrb, struct mrb_irep *irep, mrb_code *pc, mrb_value *regs);266 void (*code_fetch_hook)(struct mrb_state* mrb, struct mrb_irep *irep, const mrb_code *pc, mrb_value *regs); 267 void (*debug_op_hook)(struct mrb_state* mrb, struct mrb_irep *irep, const mrb_code *pc, mrb_value *regs); 201 268 #endif 202 269 … … 220 287 mrb_atexit_func *atexit_stack; 221 288 #endif 222 mrb_int atexit_stack_len; 289 uint16_t atexit_stack_len; 290 uint16_t ecall_nest; /* prevent infinite recursive ecall() */ 223 291 } mrb_state; 224 225 226 typedef mrb_value (*mrb_func_t)(mrb_state *mrb, mrb_value);227 292 228 293 /** … … 241 306 * } 242 307 * 243 * @param [mrb_state *]mrb The current mruby state.244 * @param [const char *]name The name of the defined class.245 * @param [struct RClass *]super The new class parent.308 * @param mrb The current mruby state. 309 * @param name The name of the defined class. 310 * @param super The new class parent. 246 311 * @return [struct RClass *] Reference to the newly defined class. 247 312 * @see mrb_define_class_under … … 252 317 * Defines a new module. 253 318 * 254 * @param [mrb_state *] mrb_state*The current mruby state.255 * @param [const char *] char*The name of the module.319 * @param mrb The current mruby state. 320 * @param name The name of the module. 256 321 * @return [struct RClass *] Reference to the newly defined module. 257 322 */ 258 MRB_API struct RClass *mrb_define_module(mrb_state * , const char*);259 MRB_API mrb_value mrb_singleton_class(mrb_state *, mrb_value);323 MRB_API struct RClass *mrb_define_module(mrb_state *mrb, const char *name); 324 MRB_API mrb_value mrb_singleton_class(mrb_state *mrb, mrb_value val); 260 325 261 326 /** … … 266 331 * include A 267 332 * end 268 * @param [mrb_state *] mrb_state*The current mruby state.269 * @param [struct RClass *] RClass*A reference to module or a class.270 * @param [struct RClass *] RClass*A reference to the module to be included.271 */ 272 MRB_API void mrb_include_module(mrb_state *, struct RClass*, struct RClass*);333 * @param mrb The current mruby state. 334 * @param cla A reference to module or a class. 335 * @param included A reference to the module to be included. 336 */ 337 MRB_API void mrb_include_module(mrb_state *mrb, struct RClass *cla, struct RClass *included); 273 338 274 339 /** … … 279 344 * prepend A 280 345 * end 281 * @param [mrb_state *] mrb_state*The current mruby state.282 * @param [struct RClass *] RClass*A reference to module or a class.283 * @param [struct RClass *] RClass*A reference to the module to be prepended.284 */ 285 MRB_API void mrb_prepend_module(mrb_state *, struct RClass*, struct RClass*);346 * @param mrb The current mruby state. 347 * @param cla A reference to module or a class. 348 * @param prepended A reference to the module to be prepended. 349 */ 350 MRB_API void mrb_prepend_module(mrb_state *mrb, struct RClass *cla, struct RClass *prepended); 286 351 287 352 /** … … 292 357 * Example: 293 358 * 294 * !!!c295 359 * mrb_value example_method(mrb_state* mrb, mrb_value self) 296 360 * { … … 304 368 * } 305 369 * 306 * @param [mrb_state *]mrb The MRuby state reference.307 * @param [struct RClass *]cla The class pointer where the method will be defined.308 * @param [const char *]name The name of the method being defined.309 * @param [mrb_func_t]func The function pointer to the method definition.310 * @param [mrb_aspec]aspec The method parameters declaration.370 * @param mrb The MRuby state reference. 371 * @param cla The class pointer where the method will be defined. 372 * @param name The name of the method being defined. 373 * @param func The function pointer to the method definition. 374 * @param aspec The method parameters declaration. 311 375 */ 312 376 MRB_API void mrb_define_method(mrb_state *mrb, struct RClass *cla, const char *name, mrb_func_t func, mrb_aspec aspec); … … 331 395 * mrb_define_class_method(mrb, foo, "bar", bar_method, MRB_ARGS_NONE()); 332 396 * } 333 * @param [mrb_state *] mrb_state* The MRuby state reference. 334 * @param [struct RClass *] RClass* The class where the class method will be defined. 335 * @param [const char *] char* The name of the class method being defined. 336 * @param [mrb_func_t] mrb_func_t The function pointer to the class method definition. 337 * @param [mrb_aspec] mrb_aspec The method parameters declaration. 338 */ 339 MRB_API void mrb_define_class_method(mrb_state *, struct RClass *, const char *, mrb_func_t, mrb_aspec); 340 MRB_API void mrb_define_singleton_method(mrb_state*, struct RObject*, const char*, mrb_func_t, mrb_aspec); 341 342 /** 343 * Defines a module fuction. 397 * @param mrb The MRuby state reference. 398 * @param cla The class where the class method will be defined. 399 * @param name The name of the class method being defined. 400 * @param fun The function pointer to the class method definition. 401 * @param aspec The method parameters declaration. 402 */ 403 MRB_API void mrb_define_class_method(mrb_state *mrb, struct RClass *cla, const char *name, mrb_func_t fun, mrb_aspec aspec); 404 405 /** 406 * Defines a singleton method 407 * 408 * @see mrb_define_class_method 409 */ 410 MRB_API void mrb_define_singleton_method(mrb_state *mrb, struct RObject *cla, const char *name, mrb_func_t fun, mrb_aspec aspec); 411 412 /** 413 * Defines a module function. 344 414 * 345 415 * Example: … … 359 429 * mrb_define_module_function(mrb, foo, "bar", bar_method, MRB_ARGS_NONE()); 360 430 * } 361 * @param [mrb_state *] mrb_state*The MRuby state reference.362 * @param [struct RClass *] RClass*The module where the module function will be defined.363 * @param [const char *] char*The name of the module function being defined.364 * @param [mrb_func_t] mrb_func_tThe function pointer to the module function definition.365 * @param [mrb_aspec] mrb_aspec The method parameters declaration.366 */ 367 MRB_API void mrb_define_module_function(mrb_state *, struct RClass*, const char*, mrb_func_t, mrb_aspec);431 * @param mrb The MRuby state reference. 432 * @param cla The module where the module function will be defined. 433 * @param name The name of the module function being defined. 434 * @param fun The function pointer to the module function definition. 435 * @param aspec The method parameters declaration. 436 */ 437 MRB_API void mrb_define_module_function(mrb_state *mrb, struct RClass *cla, const char *name, mrb_func_t fun, mrb_aspec aspec); 368 438 369 439 /** … … 388 458 * mrb_example_gem_final(mrb_state* mrb){ 389 459 * } 390 * @param [mrb_state *] mrb_state*The MRuby state reference.391 * @param [struct RClass *] RClass*A class or module the constant is defined in.392 * @param [const char *]name The name of the constant being defined.393 * @param [mrb_value] mrb_valueThe value for the constant.394 */ 395 MRB_API void mrb_define_const(mrb_state* , struct RClass*, const char *name, mrb_value);460 * @param mrb The MRuby state reference. 461 * @param cla A class or module the constant is defined in. 462 * @param name The name of the constant being defined. 463 * @param val The value for the constant. 464 */ 465 MRB_API void mrb_define_const(mrb_state* mrb, struct RClass* cla, const char *name, mrb_value val); 396 466 397 467 /** … … 439 509 * mrb_example_gem_final(mrb_state* mrb){ 440 510 * } 441 * @param [mrb_state*] mrb_state* The mruby state reference. 442 * @param [struct RClass*] RClass* A class the method will be undefined from. 443 * @param [const char*] constchar* The name of the method to be undefined. 444 */ 445 MRB_API void mrb_undef_method(mrb_state*, struct RClass*, const char*); 511 * @param mrb The mruby state reference. 512 * @param cla The class the method will be undefined from. 513 * @param name The name of the method to be undefined. 514 */ 515 MRB_API void mrb_undef_method(mrb_state *mrb, struct RClass *cla, const char *name); 516 MRB_API void mrb_undef_method_id(mrb_state*, struct RClass*, mrb_sym); 446 517 447 518 /** … … 478 549 * mrb_example_gem_final(mrb_state* mrb){ 479 550 * } 480 * @param [mrb_state*] mrb_state*The mruby state reference.481 * @param [RClass*] RClass*A class the class method will be undefined from.482 * @param [constchar*] constchar*The name of the class method to be undefined.483 */ 484 MRB_API void mrb_undef_class_method(mrb_state *, struct RClass*, const char*);485 486 /** 487 * Initialize a new object insta ce of c class.551 * @param mrb The mruby state reference. 552 * @param cls A class the class method will be undefined from. 553 * @param name The name of the class method to be undefined. 554 */ 555 MRB_API void mrb_undef_class_method(mrb_state *mrb, struct RClass *cls, const char *name); 556 557 /** 558 * Initialize a new object instance of c class. 488 559 * 489 560 * Example: … … 506 577 * mrb_p(mrb, obj); // => Kernel#p 507 578 * } 508 * @param [mrb_state*]mrb The current mruby state.509 * @param [RClass*]c Reference to the class of the new object.510 * @param [mrb_int]argc Number of arguments in argv511 * @param [const mrb_value *]argv Array of mrb_value to initialize the object579 * @param mrb The current mruby state. 580 * @param c Reference to the class of the new object. 581 * @param argc Number of arguments in argv 582 * @param argv Array of mrb_value to initialize the object 512 583 * @return [mrb_value] The newly initialized object 513 584 */ … … 520 591 } 521 592 522 MRB_API mrb_value mrb_instance_new(mrb_state *mrb, mrb_value cv);523 524 593 /** 525 594 * Creates a new instance of Class, Class. … … 537 606 * } 538 607 * 539 * @param [mrb_state*]mrb The current mruby state.540 * @param [struct RClass *]super The super class or parent.608 * @param mrb The current mruby state. 609 * @param super The super class or parent. 541 610 * @return [struct RClass *] Reference to the new class. 542 611 */ … … 554 623 * } 555 624 * 556 * @param [mrb_state*]mrb The current mruby state.625 * @param mrb The current mruby state. 557 626 * @return [struct RClass *] Reference to the new module. 558 627 */ … … 581 650 * } 582 651 * 583 * @param [mrb_state*]mrb The current mruby state.584 * @param [const char *]name A string representing the name of the class.652 * @param mrb The current mruby state. 653 * @param name A string representing the name of the class. 585 654 * @return [mrb_bool] A boolean value. 586 655 */ … … 589 658 /** 590 659 * Gets a class. 591 * @param [mrb_state*]mrb The current mruby state.592 * @param [const char *]name The name of the class.660 * @param mrb The current mruby state. 661 * @param name The name of the class. 593 662 * @return [struct RClass *] A reference to the class. 594 663 */ … … 597 666 /** 598 667 * Gets a exception class. 599 * @param [mrb_state*]mrb The current mruby state.600 * @param [const char *]name The name of the class.668 * @param mrb The current mruby state. 669 * @param name The name of the class. 601 670 * @return [struct RClass *] A reference to the class. 602 671 */ … … 627 696 * } 628 697 * 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.698 * @param mrb The current mruby state. 699 * @param outer The name of the outer class. 700 * @param name A string representing the name of the inner class. 632 701 * @return [mrb_bool] A boolean value. 633 702 */ … … 636 705 /** 637 706 * Gets a child class. 638 * @param [mrb_state*]mrb The current mruby state.639 * @param [struct RClass *]outer The name of the parent class.640 * @param [const char *]name The name of the class.707 * @param mrb The current mruby state. 708 * @param outer The name of the parent class. 709 * @param name The name of the class. 641 710 * @return [struct RClass *] A reference to the class. 642 711 */ … … 645 714 /** 646 715 * Gets a module. 647 * @param [mrb_state*]mrb The current mruby state.648 * @param [const char *]name The name of the module.716 * @param mrb The current mruby state. 717 * @param name The name of the module. 649 718 * @return [struct RClass *] A reference to the module. 650 719 */ … … 653 722 /** 654 723 * Gets a module defined under another module. 655 * @param [mrb_state*]mrb The current mruby state.656 * @param [struct RClass *]outer The name of the outer module.657 * @param [const char *]name The name of the module.724 * @param mrb The current mruby state. 725 * @param outer The name of the outer module. 726 * @param name The name of the module. 658 727 * @return [struct RClass *] A reference to the module. 659 728 */ 660 729 MRB_API struct RClass * mrb_module_get_under(mrb_state *mrb, struct RClass *outer, const char *name); 730 /* a function to raise NotImplementedError with current method name */ 731 MRB_API void mrb_notimplement(mrb_state*); 732 /* a function to be replacement of unimplemented method */ 661 733 MRB_API mrb_value mrb_notimplement_m(mrb_state*, mrb_value); 662 734 … … 666 738 * Equivalent to: 667 739 * Object#dup 668 * @param [mrb_state*]mrb The current mruby state.669 * @param [mrb_value]obj Object to be duplicate.740 * @param mrb The current mruby state. 741 * @param obj Object to be duplicate. 670 742 * @return [mrb_value] The newly duplicated object. 671 743 */ 672 744 MRB_API mrb_value mrb_obj_dup(mrb_state *mrb, mrb_value obj); 673 MRB_API mrb_value mrb_check_to_integer(mrb_state *mrb, mrb_value val, const char *method);674 745 675 746 /** … … 708 779 * } 709 780 * 710 * @param [mrb_state*]mrb The current mruby state.711 * @param [struct RClass *]c A reference to a class.712 * @param [mrb_sym]mid A symbol referencing a method id.781 * @param mrb The current mruby state. 782 * @param c A reference to a class. 783 * @param mid A symbol referencing a method id. 713 784 * @return [mrb_bool] A boolean value. 714 785 */ … … 718 789 * Defines a new class under a given module 719 790 * 720 * @param [mrb_state*]mrb The current mruby state.721 * @param [struct RClass *]outer Reference to the module under which the new class will be defined722 * @param [const char *]name The name of the defined class723 * @param [struct RClass *]super The new class parent791 * @param mrb The current mruby state. 792 * @param outer Reference to the module under which the new class will be defined 793 * @param name The name of the defined class 794 * @param super The new class parent 724 795 * @return [struct RClass *] Reference to the newly defined class 725 796 * @see mrb_define_class … … 738 809 739 810 /** 740 * Fun tion takes n optional arguments811 * Function takes n optional arguments 741 812 * 742 813 * @param n … … 746 817 747 818 /** 748 * Fun tion takes n1 mandatory arguments and n2 optional arguments819 * Function takes n1 mandatory arguments and n2 optional arguments 749 820 * 750 821 * @param n1 … … 784 855 * Must be a C string composed of the following format specifiers: 785 856 * 786 * | char | Ruby type | C types | Notes 857 * | char | Ruby type | C types | Notes | 787 858 * |:----:|----------------|-------------------|----------------------------------------------------| 788 859 * | `o` | {Object} | {mrb_value} | Could be used to retrieve any type of argument | … … 791 862 * | `A` | {Array} | {mrb_value} | when `!` follows, the value may be `nil` | 792 863 * | `H` | {Hash} | {mrb_value} | when `!` follows, the value may be `nil` | 793 * | `s` | {String} | char *, {mrb_int} | Receive two arguments; `s!` gives (`NULL`,`0`) for `nil`|864 * | `s` | {String} | char *, {mrb_int} | Receive two arguments; `s!` gives (`NULL`,`0`) for `nil` | 794 865 * | `z` | {String} | char * | `NULL` terminated string; `z!` gives `NULL` for `nil` | 795 866 * | `a` | {Array} | {mrb_value} *, {mrb_int} | Receive two arguments; `a!` gives (`NULL`,`0`) for `nil` | 796 * | `f` | {F loat}| {mrb_float} | |797 * | `i` | { Integer}| {mrb_int} | |867 * | `f` | {Fixnum}/{Float} | {mrb_float} | | 868 * | `i` | {Fixnum}/{Float} | {mrb_int} | | 798 869 * | `b` | boolean | {mrb_bool} | | 799 * | `n` | {Symbol} | {mrb_sym} | | 800 * | `&` | block | {mrb_value} | | 801 * | `*` | rest arguments | {mrb_value} *, {mrb_int} | Receive the rest of arguments as an array. | 802 * | | | optional | | After this spec following specs would be optional. | 870 * | `n` | {String}/{Symbol} | {mrb_sym} | | 871 * | `d` | data | void *, {mrb_data_type} const | 2nd argument will be used to check data type so it won't be modified; when `!` follows, the value may be `nil` | 872 * | `I` | inline struct | void * | | 873 * | `&` | block | {mrb_value} | &! raises exception if no block given. | 874 * | `*` | rest arguments | {mrb_value} *, {mrb_int} | Receive the rest of arguments as an array; `*!` avoid copy of the stack. | 875 * | <code>\|</code> | optional | | After this spec following specs would be optional. | 803 876 * | `?` | optional given | {mrb_bool} | `TRUE` if preceding argument is given. Used to check optional argument is given. | 877 * | `:` | keyword args | {mrb_kwargs} const | Get keyword arguments. @see mrb_kwargs | 804 878 * 805 879 * @see mrb_get_args … … 808 882 809 883 /** 884 * Get keyword arguments by `mrb_get_args()` with `:` specifier. 885 * 886 * `mrb_kwargs::num` indicates that the number of keyword values. 887 * 888 * `mrb_kwargs::values` is an object array, and the keyword argument corresponding to the string array is assigned. 889 * Note that `undef` is assigned if there is no keyword argument corresponding to `mrb_kwargs::optional`. 890 * 891 * `mrb_kwargs::table` accepts a string array. 892 * 893 * `mrb_kwargs::required` indicates that the specified number of keywords starting from the beginning of the string array are required. 894 * 895 * `mrb_kwargs::rest` is the remaining keyword argument that can be accepted as `**rest` in Ruby. 896 * If `NULL` is specified, `ArgumentError` is raised when there is an undefined keyword. 897 * 898 * Examples: 899 * 900 * // def method(a: 1, b: 2) 901 * 902 * uint32_t kw_num = 2; 903 * const char *kw_names[kw_num] = { "a", "b" }; 904 * uint32_t kw_required = 0; 905 * mrb_value kw_values[kw_num]; 906 * const mrb_kwargs kwargs = { kw_num, kw_values, kw_names, kw_required, NULL }; 907 * 908 * mrb_get_args(mrb, ":", &kwargs); 909 * if (mrb_undef_p(kw_values[0])) { kw_values[0] = mrb_fixnum_value(1); } 910 * if (mrb_undef_p(kw_values[1])) { kw_values[1] = mrb_fixnum_value(2); } 911 * 912 * 913 * // def method(str, x:, y: 2, z: "default string", **opts) 914 * 915 * mrb_value str, kw_rest; 916 * uint32_t kw_num = 3; 917 * const char *kw_names[kw_num] = { "x", "y", "z" }; 918 * uint32_t kw_required = 1; 919 * mrb_value kw_values[kw_num]; 920 * const mrb_kwargs kwargs = { kw_num, kw_values, kw_names, kw_required, &kw_rest }; 921 * 922 * mrb_get_args(mrb, "S:", &str, &kwargs); 923 * // or: mrb_get_args(mrb, ":S", &kwargs, &str); 924 * if (mrb_undef_p(kw_values[1])) { kw_values[1] = mrb_fixnum_value(2); } 925 * if (mrb_undef_p(kw_values[2])) { kw_values[2] = mrb_str_new_cstr(mrb, "default string"); } 926 */ 927 typedef struct mrb_kwargs mrb_kwargs; 928 929 struct mrb_kwargs 930 { 931 uint32_t num; 932 mrb_value *values; 933 const char *const *table; 934 uint32_t required; 935 mrb_value *rest; 936 }; 937 938 /** 810 939 * Retrieve arguments from mrb_state. 811 940 * 812 * When applicable, implicit conversions (such as `to_str`, `to_ary`, `to_hash`) are813 * applied to received arguments.814 * Used inside a function of mrb_func_t type.815 *816 941 * @param mrb The current MRuby state. 817 * @param format [mrb_args_format]is a list of format specifiers942 * @param format is a list of format specifiers 818 943 * @param ... The passing variadic arguments must be a pointer of retrieving type. 819 944 * @return the number of arguments retrieved. 820 945 * @see mrb_args_format 946 * @see mrb_kwargs 821 947 */ 822 948 MRB_API mrb_int mrb_get_args(mrb_state *mrb, mrb_args_format format, ...); 823 949 824 static inlinemrb_sym950 MRB_INLINE mrb_sym 825 951 mrb_get_mid(mrb_state *mrb) /* get method symbol */ 826 952 { … … 828 954 } 829 955 830 static inline int 831 mrb_get_argc(mrb_state *mrb) /* get argc */ 832 { 833 return mrb->c->ci->argc; 834 } 956 /** 957 * Retrieve number of arguments from mrb_state. 958 * 959 * Correctly handles *splat arguments. 960 */ 961 MRB_API mrb_int mrb_get_argc(mrb_state *mrb); 962 963 MRB_API mrb_value* mrb_get_argv(mrb_state *mrb); 835 964 836 965 /* `strlen` for character string literals (use with caution or `strlen` instead) … … 845 974 * Call existing ruby functions. 846 975 * 976 * Example: 977 * 847 978 * #include <stdio.h> 848 979 * #include <mruby.h> … … 861 992 * fclose(fp); 862 993 * 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. 870 */ 871 MRB_API mrb_value mrb_funcall(mrb_state*, mrb_value, const char*, mrb_int,...); 994 * } 995 * 996 * @param mrb The current mruby state. 997 * @param val A reference to an mruby value. 998 * @param name The name of the method. 999 * @param argc The number of arguments the method has. 1000 * @param ... Variadic values(not type safe!). 1001 * @return [mrb_value] mruby function value. 1002 */ 1003 MRB_API mrb_value mrb_funcall(mrb_state *mrb, mrb_value val, const char *name, mrb_int argc, ...); 872 1004 /** 873 1005 * Call existing ruby functions. This is basically the type safe version of mrb_funcall. … … 891 1023 * mrb_close(mrb); 892 1024 * } 893 * @param [mrb_state*] mrb_state*The current mruby state.894 * @param [mrb_value] mrb_valueA reference to an mruby value.895 * @param [mrb_sym] mrb_sym The symbol representing the method.896 * @param [mrb_int] mrb_intThe number of arguments the method has.897 * @param [const mrb_value*] mrb_value*Pointer to the object.1025 * @param mrb The current mruby state. 1026 * @param val A reference to an mruby value. 1027 * @param name_sym The symbol representing the method. 1028 * @param argc The number of arguments the method has. 1029 * @param obj Pointer to the object. 898 1030 * @return [mrb_value] mrb_value mruby function value. 899 1031 * @see mrb_funcall 900 1032 */ 901 MRB_API mrb_value mrb_funcall_argv(mrb_state *, mrb_value, mrb_sym, mrb_int, const mrb_value*);1033 MRB_API mrb_value mrb_funcall_argv(mrb_state *mrb, mrb_value val, mrb_sym name, mrb_int argc, const mrb_value *argv); 902 1034 /** 903 1035 * Call existing ruby functions with a block. 904 1036 */ 905 MRB_API mrb_value mrb_funcall_with_block(mrb_state *, mrb_value, mrb_sym, mrb_int, const mrb_value*, mrb_value);1037 MRB_API mrb_value mrb_funcall_with_block(mrb_state *mrb, mrb_value val, mrb_sym name, mrb_int argc, const mrb_value *argv, mrb_value block); 906 1038 /** 907 1039 * Create a symbol 1040 * 1041 * Example: 908 1042 * 909 1043 * # Ruby style: … … 912 1046 * // C style: 913 1047 * 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. 1048 * 1049 * @param mrb The current mruby state. 1050 * @param str The string to be symbolized 916 1051 * @return [mrb_sym] mrb_sym A symbol. 917 1052 */ 918 MRB_API mrb_sym mrb_intern_cstr(mrb_state *,const char*);1053 MRB_API mrb_sym mrb_intern_cstr(mrb_state *mrb, const char* str); 919 1054 MRB_API mrb_sym mrb_intern(mrb_state*,const char*,size_t); 920 1055 MRB_API mrb_sym mrb_intern_static(mrb_state*,const char*,size_t); … … 924 1059 MRB_API mrb_value mrb_check_intern(mrb_state*,const char*,size_t); 925 1060 MRB_API mrb_value mrb_check_intern_str(mrb_state*,mrb_value); 926 MRB_API const char *mrb_sym2name(mrb_state*,mrb_sym); 927 MRB_API const char *mrb_sym2name_len(mrb_state*,mrb_sym,mrb_int*); 928 MRB_API mrb_value mrb_sym2str(mrb_state*,mrb_sym); 1061 MRB_API const char *mrb_sym_name(mrb_state*,mrb_sym); 1062 MRB_API const char *mrb_sym_name_len(mrb_state*,mrb_sym,mrb_int*); 1063 MRB_API const char *mrb_sym_dump(mrb_state*,mrb_sym); 1064 MRB_API mrb_value mrb_sym_str(mrb_state*,mrb_sym); 1065 #define mrb_sym2name(mrb,sym) mrb_sym_name(mrb,sym) 1066 #define mrb_sym2name_len(mrb,sym,len) mrb_sym_name_len(mrb,sym,len) 1067 #define mrb_sym2str(mrb,sym) mrb_sym_str(mrb,sym) 929 1068 930 1069 MRB_API void *mrb_malloc(mrb_state*, size_t); /* raise RuntimeError if no mem */ … … 945 1084 #define mrb_str_new_lit(mrb, lit) mrb_str_new_static(mrb, (lit), mrb_strlen_lit(lit)) 946 1085 1086 MRB_API mrb_value mrb_obj_freeze(mrb_state*, mrb_value); 1087 #define mrb_str_new_frozen(mrb,p,len) mrb_obj_freeze(mrb,mrb_str_new(mrb,p,len)) 1088 #define mrb_str_new_cstr_frozen(mrb,p) mrb_obj_freeze(mrb,mrb_str_new_cstr(mrb,p)) 1089 #define mrb_str_new_static_frozen(mrb,p,len) mrb_obj_freeze(mrb,mrb_str_new_static(mrb,p,len)) 1090 #define mrb_str_new_lit_frozen(mrb,lit) mrb_obj_freeze(mrb,mrb_str_new_lit(mrb,lit)) 1091 947 1092 #ifdef _WIN32 948 char* mrb_utf8_from_locale(const char *p, size_t len);949 char* mrb_locale_from_utf8(const char *p, size_t len);1093 MRB_API char* mrb_utf8_from_locale(const char *p, int len); 1094 MRB_API char* mrb_locale_from_utf8(const char *p, int len); 950 1095 #define mrb_locale_free(p) free(p) 951 1096 #define mrb_utf8_free(p) free(p) 952 1097 #else 953 #define mrb_utf8_from_locale(p, l) ( p)954 #define mrb_locale_from_utf8(p, l) ( p)1098 #define mrb_utf8_from_locale(p, l) ((char*)(p)) 1099 #define mrb_locale_from_utf8(p, l) ((char*)(p)) 955 1100 #define mrb_locale_free(p) 956 1101 #define mrb_utf8_free(p) … … 1007 1152 MRB_API void* mrb_default_allocf(mrb_state*, void*, size_t, void*); 1008 1153 1009 MRB_API mrb_value mrb_top_self(mrb_state * );1010 MRB_API mrb_value mrb_run(mrb_state *, struct RProc*, mrb_value);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*);1154 MRB_API mrb_value mrb_top_self(mrb_state *mrb); 1155 MRB_API mrb_value mrb_run(mrb_state *mrb, struct RProc* proc, mrb_value self); 1156 MRB_API mrb_value mrb_top_run(mrb_state *mrb, struct RProc *proc, mrb_value self, unsigned int stack_keep); 1157 MRB_API mrb_value mrb_vm_run(mrb_state *mrb, struct RProc *proc, mrb_value self, unsigned int stack_keep); 1158 MRB_API mrb_value mrb_vm_exec(mrb_state *mrb, struct RProc *proc, const mrb_code *iseq); 1014 1159 /* compatibility macros */ 1015 1160 #define mrb_toplevel_run_keep(m,p,k) mrb_top_run((m),(p),mrb_top_self(m),(k)) … … 1021 1166 MRB_API mrb_sym mrb_obj_to_sym(mrb_state *mrb, mrb_value name); 1022 1167 1023 MRB_API mrb_bool mrb_obj_eq(mrb_state *, mrb_value, mrb_value);1024 MRB_API mrb_bool mrb_obj_equal(mrb_state *, mrb_value, mrb_value);1168 MRB_API mrb_bool mrb_obj_eq(mrb_state *mrb, mrb_value a, mrb_value b); 1169 MRB_API mrb_bool mrb_obj_equal(mrb_state *mrb, mrb_value a, mrb_value b); 1025 1170 MRB_API mrb_bool mrb_equal(mrb_state *mrb, mrb_value obj1, mrb_value obj2); 1026 MRB_API mrb_value mrb_convert_to_integer(mrb_state *mrb, mrb_value val, int base);1171 MRB_API mrb_value mrb_convert_to_integer(mrb_state *mrb, mrb_value val, mrb_int base); 1027 1172 MRB_API mrb_value mrb_Integer(mrb_state *mrb, mrb_value val); 1173 #ifndef MRB_WITHOUT_FLOAT 1028 1174 MRB_API mrb_value mrb_Float(mrb_state *mrb, mrb_value val); 1175 #endif 1029 1176 MRB_API mrb_value mrb_inspect(mrb_state *mrb, mrb_value obj); 1030 1177 MRB_API mrb_bool mrb_eql(mrb_state *mrb, mrb_value obj1, mrb_value obj2); 1178 /* mrb_cmp(mrb, obj1, obj2): 1:0:-1; -2 for error */ 1179 MRB_API mrb_int mrb_cmp(mrb_state *mrb, mrb_value obj1, mrb_value obj2); 1180 1181 MRB_INLINE int 1182 mrb_gc_arena_save(mrb_state *mrb) 1183 { 1184 return mrb->gc.arena_idx; 1185 } 1186 1187 MRB_INLINE void 1188 mrb_gc_arena_restore(mrb_state *mrb, int idx) 1189 { 1190 mrb->gc.arena_idx = idx; 1191 } 1031 1192 1032 1193 MRB_API void mrb_garbage_collect(mrb_state*); 1033 1194 MRB_API void mrb_full_gc(mrb_state*); 1034 1195 MRB_API void mrb_incremental_gc(mrb_state *); 1035 MRB_API int mrb_gc_arena_save(mrb_state*);1036 MRB_API void mrb_gc_arena_restore(mrb_state*,int);1037 1196 MRB_API void mrb_gc_mark(mrb_state*,struct RBasic*); 1038 1197 #define mrb_gc_mark_value(mrb,val) do {\ … … 1077 1236 MRB_API mrb_noreturn void mrb_raisef(mrb_state *mrb, struct RClass *c, const char *fmt, ...); 1078 1237 MRB_API mrb_noreturn void mrb_name_error(mrb_state *mrb, mrb_sym id, const char *fmt, ...); 1238 MRB_API mrb_noreturn void mrb_frozen_error(mrb_state *mrb, void *frozen_obj); 1239 MRB_API mrb_noreturn void mrb_argnum_error(mrb_state *mrb, mrb_int argc, int min, int max); 1079 1240 MRB_API void mrb_warn(mrb_state *mrb, const char *fmt, ...); 1080 1241 MRB_API mrb_noreturn void mrb_bug(mrb_state *mrb, const char *fmt, ...); 1081 1242 MRB_API void mrb_print_backtrace(mrb_state *mrb); 1082 1243 MRB_API void mrb_print_error(mrb_state *mrb); 1244 /* function for `raisef` formatting */ 1245 MRB_API mrb_value mrb_vformat(mrb_state *mrb, const char *format, va_list ap); 1083 1246 1084 1247 /* macros to get typical exception objects … … 1098 1261 #define E_LOCALJUMP_ERROR (mrb_exc_get(mrb, "LocalJumpError")) 1099 1262 #define E_REGEXP_ERROR (mrb_exc_get(mrb, "RegexpError")) 1263 #define E_FROZEN_ERROR (mrb_exc_get(mrb, "FrozenError")) 1100 1264 1101 1265 #define E_NOTIMP_ERROR (mrb_exc_get(mrb, "NotImplementedError")) 1266 #ifndef MRB_WITHOUT_FLOAT 1102 1267 #define E_FLOATDOMAIN_ERROR (mrb_exc_get(mrb, "FloatDomainError")) 1268 #endif 1103 1269 1104 1270 #define E_KEY_ERROR (mrb_exc_get(mrb, "KeyError")) … … 1122 1288 MRB_API mrb_value mrb_to_int(mrb_state *mrb, mrb_value val); 1123 1289 #define mrb_int(mrb, val) mrb_fixnum(mrb_to_int(mrb, val)) 1290 /* string type checking (contrary to the name, it doesn't convert) */ 1291 MRB_API mrb_value mrb_to_str(mrb_state *mrb, mrb_value val); 1124 1292 MRB_API void mrb_check_type(mrb_state *mrb, mrb_value x, enum mrb_vtype t); 1293 1294 MRB_INLINE void mrb_check_frozen(mrb_state *mrb, void *o) 1295 { 1296 if (mrb_frozen_p((struct RBasic*)o)) mrb_frozen_error(mrb, o); 1297 } 1125 1298 1126 1299 typedef enum call_type { … … 1131 1304 } call_type; 1132 1305 1133 MRB_API void mrb_define_alias(mrb_state *mrb, struct RClass * klass, const char *name1, const char *name2);1306 MRB_API void mrb_define_alias(mrb_state *mrb, struct RClass *c, const char *a, const char *b); 1134 1307 MRB_API const char *mrb_class_name(mrb_state *mrb, struct RClass* klass); 1135 1308 MRB_API void mrb_define_global_const(mrb_state *mrb, const char *name, mrb_value val); … … 1142 1315 1143 1316 1144 /* 1317 /** 1145 1318 * Resume a Fiber 1146 1319 * 1147 * @mrbgemmruby-fiber1320 * Implemented in mruby-fiber 1148 1321 */ 1149 1322 MRB_API mrb_value mrb_fiber_resume(mrb_state *mrb, mrb_value fib, mrb_int argc, const mrb_value *argv); 1150 1323 1151 /* 1324 /** 1152 1325 * Yield a Fiber 1153 1326 * 1154 * @mrbgemmruby-fiber1327 * Implemented in mruby-fiber 1155 1328 */ 1156 1329 MRB_API mrb_value mrb_fiber_yield(mrb_state *mrb, mrb_int argc, const mrb_value *argv); 1157 1330 1158 /* 1331 /** 1332 * Check if a Fiber is alive 1333 * 1334 * Implemented in mruby-fiber 1335 */ 1336 MRB_API mrb_value mrb_fiber_alive_p(mrb_state *mrb, mrb_value fib); 1337 1338 /** 1159 1339 * FiberError reference 1160 1340 * 1161 * @mrbgemmruby-fiber1341 * Implemented in mruby-fiber 1162 1342 */ 1163 1343 #define E_FIBER_ERROR (mrb_exc_get(mrb, "FiberError")) 1344 MRB_API void mrb_stack_extend(mrb_state*, mrb_int); 1164 1345 1165 1346 /* memory pool implementation */ … … 1170 1351 MRB_API void* mrb_pool_realloc(struct mrb_pool*, void*, size_t oldlen, size_t newlen); 1171 1352 MRB_API mrb_bool mrb_pool_can_realloc(struct mrb_pool*, void*, size_t); 1353 /* temporary memory allocation, only effective while GC arena is kept */ 1172 1354 MRB_API void* mrb_alloca(mrb_state *mrb, size_t); 1173 1355 … … 1184 1366 #undef memcpy 1185 1367 #undef memset 1186 static inlinevoid*1368 static void* 1187 1369 mrbmemcpy(void *dst, const void *src, size_t n) 1188 1370 { 1189 char *d = dst;1190 const char *s = src;1371 char *d = (char*)dst; 1372 const char *s = (const char*)src; 1191 1373 while (n--) 1192 1374 *d++ = *s++; … … 1195 1377 #define memcpy(a,b,c) mrbmemcpy(a,b,c) 1196 1378 1197 static inlinevoid*1379 static void* 1198 1380 mrbmemset(void *s, int c, size_t n) 1199 1381 { 1200 char *t = s;1382 char *t = (char*)s; 1201 1383 while (n--) 1202 1384 *t++ = c; -
EcnlProtoTool/trunk/mruby-2.1.1/include/mruby/array.h
r331 r439 1 /* 2 ** mruby/array.h - Array class1 /** 2 ** @file mruby/array.h - Array class 3 3 ** 4 4 ** See Copyright Notice in mruby.h … … 18 18 typedef struct mrb_shared_array { 19 19 int refcnt; 20 mrb_ intlen;20 mrb_ssize len; 21 21 mrb_value *ptr; 22 22 } mrb_shared_array; 23 23 24 #define MRB_ARY_EMBED_LEN_MAX ((mrb_int)(sizeof(void*)*3/sizeof(mrb_value))) 24 25 struct RArray { 25 26 MRB_OBJECT_HEADER; 26 mrb_int len;27 27 union { 28 mrb_int capa; 29 mrb_shared_array *shared; 30 } aux; 31 mrb_value *ptr; 28 struct { 29 mrb_ssize len; 30 union { 31 mrb_ssize capa; 32 mrb_shared_array *shared; 33 } aux; 34 mrb_value *ptr; 35 } heap; 36 void *ary[3]; 37 } as; 32 38 }; 33 39 … … 36 42 #define RARRAY(v) ((struct RArray*)(mrb_ptr(v))) 37 43 38 #define RARRAY_LEN(a) (RARRAY(a)->len) 39 #define RARRAY_PTR(a) ((const mrb_value*)RARRAY(a)->ptr) 44 #define MRB_ARY_EMBED_MASK 7 45 #define ARY_EMBED_P(a) ((a)->flags & MRB_ARY_EMBED_MASK) 46 #define ARY_UNSET_EMBED_FLAG(a) ((a)->flags &= ~(MRB_ARY_EMBED_MASK)) 47 #define ARY_EMBED_LEN(a) ((mrb_int)(((a)->flags & MRB_ARY_EMBED_MASK) - 1)) 48 #define ARY_SET_EMBED_LEN(a,len) ((a)->flags = ((a)->flags&~MRB_ARY_EMBED_MASK) | ((uint32_t)(len) + 1)) 49 #define ARY_EMBED_PTR(a) ((mrb_value*)(&(a)->as.ary)) 50 51 #define ARY_LEN(a) (ARY_EMBED_P(a)?ARY_EMBED_LEN(a):(a)->as.heap.len) 52 #define ARY_PTR(a) (ARY_EMBED_P(a)?ARY_EMBED_PTR(a):(a)->as.heap.ptr) 53 #define RARRAY_LEN(a) ARY_LEN(RARRAY(a)) 54 #define RARRAY_PTR(a) ARY_PTR(RARRAY(a)) 55 #define ARY_SET_LEN(a,n) do {\ 56 if (ARY_EMBED_P(a)) {\ 57 mrb_assert((n) <= MRB_ARY_EMBED_LEN_MAX); \ 58 ARY_SET_EMBED_LEN(a,n);\ 59 }\ 60 else\ 61 (a)->as.heap.len = (n);\ 62 } while (0) 63 #define ARY_CAPA(a) (ARY_EMBED_P(a)?MRB_ARY_EMBED_LEN_MAX:(a)->as.heap.aux.capa) 40 64 #define MRB_ARY_SHARED 256 41 65 #define ARY_SHARED_P(a) ((a)->flags & MRB_ARY_SHARED) … … 176 200 */ 177 201 MRB_API void mrb_ary_replace(mrb_state *mrb, mrb_value self, mrb_value other); 202 MRB_API mrb_value mrb_ensure_array_type(mrb_state *mrb, mrb_value self); 178 203 MRB_API mrb_value mrb_check_array_type(mrb_state *mrb, mrb_value self); 179 204 180 205 /* 181 * Unshift an element into anarray206 * Unshift an element into the array 182 207 * 183 208 * Equivalent to: … … 190 215 */ 191 216 MRB_API mrb_value mrb_ary_unshift(mrb_state *mrb, mrb_value self, mrb_value item); 217 218 /* 219 * Get nth element in the array 220 * 221 * Equivalent to: 222 * 223 * ary[offset] 224 * 225 * @param ary The target array. 226 * @param offset The element position (negative counts from the tail). 227 */ 192 228 MRB_API mrb_value mrb_ary_entry(mrb_value ary, mrb_int offset); 229 230 /* 231 * Replace subsequence of an array. 232 * 233 * Equivalent to: 234 * 235 * ary.shift 236 * 237 * @param mrb The mruby state reference. 238 * @param self The array from which the value will be shifted. 239 * @param head Beginning position of a replacement subsequence. 240 * @param len Length of a replacement subsequence. 241 * @param rpl The array of replacement elements. 242 * @return The receiver array. 243 */ 244 MRB_API mrb_value mrb_ary_splice(mrb_state *mrb, mrb_value self, mrb_int head, mrb_int len, mrb_value rpl); 193 245 194 246 /* … … 206 258 207 259 /* 208 * Removes all elements from th isarray260 * Removes all elements from the array 209 261 * 210 262 * Equivalent to: … … 240 292 MRB_API mrb_value mrb_ary_resize(mrb_state *mrb, mrb_value ary, mrb_int new_len); 241 293 242 static inline mrb_int243 mrb_ary_len(mrb_state *mrb, mrb_value ary)244 {245 (void)mrb;246 mrb_assert(mrb_array_p(ary));247 return RARRAY_LEN(ary);248 }249 250 static inline mrb_value251 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 259 294 MRB_END_DECL 260 295 -
EcnlProtoTool/trunk/mruby-2.1.1/include/mruby/boxing_nan.h
r331 r439 1 /* 2 ** mruby/boxing_nan.h - nan boxing mrb_value definition1 /** 2 ** @file mruby/boxing_nan.h - nan boxing mrb_value definition 3 3 ** 4 4 ** See Copyright Notice in mruby.h … … 12 12 #endif 13 13 14 #ifdef MRB_WITHOUT_FLOAT 15 # error ---->> MRB_NAN_BOXING and MRB_WITHOUT_FLOAT conflict <<---- 16 #endif 17 14 18 #ifdef MRB_INT64 15 19 # error ---->> MRB_NAN_BOXING and MRB_INT64 conflict <<---- … … 17 21 18 22 #define MRB_FIXNUM_SHIFT 0 19 #define MRB_TT_HAS_BASIC MRB_TT_OBJECT 20 21 #ifdef MRB_ENDIAN_BIG 22 #define MRB_ENDIAN_LOHI(a,b) a b 23 #else 24 #define MRB_ENDIAN_LOHI(a,b) b a 25 #endif 23 #define MRB_SYMBOL_SHIFT 0 26 24 27 25 /* value representation by nan-boxing: … … 78 76 79 77 #define SET_FLOAT_VALUE(mrb,r,v) do { \ 80 if ( v != v) { \78 if ((v) != (v)) { \ 81 79 (r).value.ttt = 0x7ff80000; \ 82 80 (r).value.i = 0; \ -
EcnlProtoTool/trunk/mruby-2.1.1/include/mruby/boxing_no.h
r321 r439 1 /* 2 ** mruby/boxing_no.h - unboxed mrb_value definition1 /** 2 ** @file mruby/boxing_no.h - unboxed mrb_value definition 3 3 ** 4 4 ** See Copyright Notice in mruby.h … … 9 9 10 10 #define MRB_FIXNUM_SHIFT 0 11 #define MRB_TT_HAS_BASIC MRB_TT_OBJECT 11 #define MRB_SYMBOL_SHIFT 0 12 13 union mrb_value_union { 14 #ifndef MRB_WITHOUT_FLOAT 15 mrb_float f; 16 #endif 17 void *p; 18 mrb_int i; 19 mrb_sym sym; 20 }; 12 21 13 22 typedef struct mrb_value { 14 union { 15 mrb_float f; 16 void *p; 17 mrb_int i; 18 mrb_sym sym; 19 } value; 23 union mrb_value_union value; 20 24 enum mrb_vtype tt; 21 25 } mrb_value; 22 26 27 #ifndef MRB_WITHOUT_FLOAT 23 28 #define mrb_float_pool(mrb,f) mrb_float_value(mrb,f) 29 #endif 24 30 25 31 #define mrb_ptr(o) (o).value.p 26 32 #define mrb_cptr(o) mrb_ptr(o) 33 #ifndef MRB_WITHOUT_FLOAT 27 34 #define mrb_float(o) (o).value.f 35 #endif 28 36 #define mrb_fixnum(o) (o).value.i 29 37 #define mrb_symbol(o) (o).value.sym … … 40 48 #define SET_BOOL_VALUE(r,b) BOXNIX_SET_VALUE(r, b ? MRB_TT_TRUE : MRB_TT_FALSE, value.i, 1) 41 49 #define SET_INT_VALUE(r,n) BOXNIX_SET_VALUE(r, MRB_TT_FIXNUM, value.i, (n)) 50 #ifndef MRB_WITHOUT_FLOAT 42 51 #define SET_FLOAT_VALUE(mrb,r,v) BOXNIX_SET_VALUE(r, MRB_TT_FLOAT, value.f, (v)) 52 #endif 43 53 #define SET_SYM_VALUE(r,v) BOXNIX_SET_VALUE(r, MRB_TT_SYMBOL, value.sym, (v)) 44 54 #define SET_OBJ_VALUE(r,v) BOXNIX_SET_VALUE(r, (((struct RObject*)(v))->tt), value.p, (v)) -
EcnlProtoTool/trunk/mruby-2.1.1/include/mruby/boxing_word.h
r331 r439 1 /* 2 ** mruby/boxing_word.h - word boxing mrb_value definition1 /** 2 ** @file mruby/boxing_word.h - word boxing mrb_value definition 3 3 ** 4 4 ** See Copyright Notice in mruby.h … … 8 8 #define MRUBY_BOXING_WORD_H 9 9 10 #if defined(MRB_INT16)11 # error MRB_INT16 is too small for MRB_WORD_BOXING.12 #endif13 14 10 #if defined(MRB_INT64) && !defined(MRB_64BIT) 15 11 #error MRB_INT64 cannot be used with MRB_WORD_BOXING in 32-bit mode. 16 12 #endif 17 13 14 #ifndef MRB_WITHOUT_FLOAT 18 15 struct RFloat { 19 16 MRB_OBJECT_HEADER; 20 17 mrb_float f; 21 18 }; 19 #endif 22 20 23 21 struct RCptr { … … 26 24 }; 27 25 28 #define MRB_FIXNUM_SHIFT 129 #define MRB_TT_HAS_BASIC MRB_TT_FLOAT30 31 26 enum mrb_special_consts { 32 MRB_Qnil = 0,33 MRB_Qfalse = 2,34 MRB_Qtrue = 4,35 MRB_Qundef = 6,27 MRB_Qnil = 0, 28 MRB_Qfalse = 4, 29 MRB_Qtrue = 12, 30 MRB_Qundef = 20, 36 31 }; 37 32 38 #define MRB_FIXNUM_FLAG 0x01 39 #define MRB_SYMBOL_FLAG 0x0e 40 #define MRB_SPECIAL_SHIFT 8 33 #if defined(MRB_64BIT) && defined(MRB_INT32) 34 #define MRB_FIXNUM_SHIFT 0 35 #else 36 #define MRB_FIXNUM_SHIFT BOXWORD_FIXNUM_SHIFT 37 #endif 38 #define MRB_SYMBOL_SHIFT BOXWORD_SYMBOL_SHIFT 41 39 40 #define BOXWORD_FIXNUM_BIT_POS 1 41 #define BOXWORD_SYMBOL_BIT_POS 2 42 #define BOXWORD_FIXNUM_SHIFT BOXWORD_FIXNUM_BIT_POS 43 #ifdef MRB_64BIT 44 #define BOXWORD_SYMBOL_SHIFT 0 45 #else 46 #define BOXWORD_SYMBOL_SHIFT BOXWORD_SYMBOL_BIT_POS 47 #endif 48 #define BOXWORD_FIXNUM_FLAG (1 << (BOXWORD_FIXNUM_BIT_POS - 1)) 49 #define BOXWORD_SYMBOL_FLAG (1 << (BOXWORD_SYMBOL_BIT_POS - 1)) 50 #define BOXWORD_FIXNUM_MASK ((1 << BOXWORD_FIXNUM_BIT_POS) - 1) 51 #define BOXWORD_SYMBOL_MASK ((1 << BOXWORD_SYMBOL_BIT_POS) - 1) 52 #define BOXWORD_IMMEDIATE_MASK 0x07 53 54 #define BOXWORD_SHIFT_VALUE(o,n,t) \ 55 (t)(((long)(o).w) >> BOXWORD_##n##_SHIFT) 56 #define BOXWORD_SET_SHIFT_VALUE(o,n,v) \ 57 ((o).w = (((unsigned long)(v)) << BOXWORD_##n##_SHIFT) | BOXWORD_##n##_FLAG) 58 #define BOXWORD_SHIFT_VALUE_P(o,n) \ 59 (((o).w & BOXWORD_##n##_MASK) == BOXWORD_##n##_FLAG) 60 #define BOXWORD_OBJ_TYPE_P(o,n) \ 61 (!mrb_immediate_p(o) && (o).value.bp->tt == MRB_TT_##n) 62 63 /* 64 * mrb_value representation: 65 * 66 * nil : ...0000 0000 (all bits are 0) 67 * false : ...0000 0100 (mrb_fixnum(v) != 0) 68 * true : ...0000 1100 69 * undef : ...0001 0100 70 * fixnum: ...IIII III1 71 * symbol: ...SSSS SS10 (use only upper 32-bit as symbol value on 64-bit CPU) 72 * object: ...PPPP P000 (any bits are 1) 73 */ 42 74 typedef union mrb_value { 43 75 union { 44 76 void *p; 77 #ifdef MRB_64BIT 78 /* use struct to avoid bit shift. */ 45 79 struct { 46 unsigned int i_flag : MRB_FIXNUM_SHIFT; 47 mrb_int i : (MRB_INT_BIT - MRB_FIXNUM_SHIFT); 80 MRB_ENDIAN_LOHI( 81 mrb_sym sym; 82 ,uint32_t sym_flag; 83 ) 48 84 }; 49 struct { 50 unsigned int sym_flag : MRB_SPECIAL_SHIFT; 51 mrb_sym sym : (sizeof(mrb_sym) * CHAR_BIT); 52 }; 85 #endif 53 86 struct RBasic *bp; 87 #ifndef MRB_WITHOUT_FLOAT 54 88 struct RFloat *fp; 89 #endif 55 90 struct RCptr *vp; 56 91 } value; … … 59 94 60 95 MRB_API mrb_value mrb_word_boxing_cptr_value(struct mrb_state*, void*); 96 #ifndef MRB_WITHOUT_FLOAT 61 97 MRB_API mrb_value mrb_word_boxing_float_value(struct mrb_state*, mrb_float); 62 98 MRB_API mrb_value mrb_word_boxing_float_pool(struct mrb_state*, mrb_float); 99 #endif 63 100 101 #ifndef MRB_WITHOUT_FLOAT 64 102 #define mrb_float_pool(mrb,f) mrb_word_boxing_float_pool(mrb,f) 103 #endif 65 104 66 105 #define mrb_ptr(o) (o).value.p 67 106 #define mrb_cptr(o) (o).value.vp->p 107 #ifndef MRB_WITHOUT_FLOAT 68 108 #define mrb_float(o) (o).value.fp->f 69 #define mrb_fixnum(o) ((mrb_int)(o).value.i) 109 #endif 110 #define mrb_fixnum(o) BOXWORD_SHIFT_VALUE(o, FIXNUM, mrb_int) 111 #ifdef MRB_64BIT 70 112 #define mrb_symbol(o) (o).value.sym 113 #else 114 #define mrb_symbol(o) BOXWORD_SHIFT_VALUE(o, SYMBOL, mrb_sym) 115 #endif 116 #define mrb_bool(o) (((o).w & ~(unsigned long)MRB_Qfalse) != 0) 71 117 72 static inline enum mrb_vtype 118 #define mrb_immediate_p(o) ((o).w & BOXWORD_IMMEDIATE_MASK || (o).w == MRB_Qnil) 119 #define mrb_fixnum_p(o) BOXWORD_SHIFT_VALUE_P(o, FIXNUM) 120 #ifdef MRB_64BIT 121 #define mrb_symbol_p(o) ((o).value.sym_flag == BOXWORD_SYMBOL_FLAG) 122 #else 123 #define mrb_symbol_p(o) BOXWORD_SHIFT_VALUE_P(o, SYMBOL) 124 #endif 125 #define mrb_undef_p(o) ((o).w == MRB_Qundef) 126 #define mrb_nil_p(o) ((o).w == MRB_Qnil) 127 #define mrb_false_p(o) ((o).w == MRB_Qfalse) 128 #define mrb_true_p(o) ((o).w == MRB_Qtrue) 129 #ifndef MRB_WITHOUT_FLOAT 130 #define mrb_float_p(o) BOXWORD_OBJ_TYPE_P(o, FLOAT) 131 #endif 132 #define mrb_array_p(o) BOXWORD_OBJ_TYPE_P(o, ARRAY) 133 #define mrb_string_p(o) BOXWORD_OBJ_TYPE_P(o, STRING) 134 #define mrb_hash_p(o) BOXWORD_OBJ_TYPE_P(o, HASH) 135 #define mrb_cptr_p(o) BOXWORD_OBJ_TYPE_P(o, CPTR) 136 #define mrb_exception_p(o) BOXWORD_OBJ_TYPE_P(o, EXCEPTION) 137 #define mrb_free_p(o) BOXWORD_OBJ_TYPE_P(o, FREE) 138 #define mrb_object_p(o) BOXWORD_OBJ_TYPE_P(o, OBJECT) 139 #define mrb_class_p(o) BOXWORD_OBJ_TYPE_P(o, CLASS) 140 #define mrb_module_p(o) BOXWORD_OBJ_TYPE_P(o, MODULE) 141 #define mrb_iclass_p(o) BOXWORD_OBJ_TYPE_P(o, ICLASS) 142 #define mrb_sclass_p(o) BOXWORD_OBJ_TYPE_P(o, SCLASS) 143 #define mrb_proc_p(o) BOXWORD_OBJ_TYPE_P(o, PROC) 144 #define mrb_range_p(o) BOXWORD_OBJ_TYPE_P(o, RANGE) 145 #define mrb_file_p(o) BOXWORD_OBJ_TYPE_P(o, FILE) 146 #define mrb_env_p(o) BOXWORD_OBJ_TYPE_P(o, ENV) 147 #define mrb_data_p(o) BOXWORD_OBJ_TYPE_P(o, DATA) 148 #define mrb_fiber_p(o) BOXWORD_OBJ_TYPE_P(o, FIBER) 149 #define mrb_istruct_p(o) BOXWORD_OBJ_TYPE_P(o, ISTRUCT) 150 #define mrb_break_p(o) BOXWORD_OBJ_TYPE_P(o, BREAK) 151 152 #ifndef MRB_WITHOUT_FLOAT 153 #define SET_FLOAT_VALUE(mrb,r,v) ((r) = mrb_word_boxing_float_value(mrb, v)) 154 #endif 155 #define SET_CPTR_VALUE(mrb,r,v) ((r) = mrb_word_boxing_cptr_value(mrb, v)) 156 #define SET_UNDEF_VALUE(r) ((r).w = MRB_Qundef) 157 #define SET_NIL_VALUE(r) ((r).w = MRB_Qnil) 158 #define SET_FALSE_VALUE(r) ((r).w = MRB_Qfalse) 159 #define SET_TRUE_VALUE(r) ((r).w = MRB_Qtrue) 160 #define SET_BOOL_VALUE(r,b) ((b) ? SET_TRUE_VALUE(r) : SET_FALSE_VALUE(r)) 161 #define SET_INT_VALUE(r,n) BOXWORD_SET_SHIFT_VALUE(r, FIXNUM, n) 162 #ifdef MRB_64BIT 163 #define SET_SYM_VALUE(r,v) ((r).value.sym = v, (r).value.sym_flag = BOXWORD_SYMBOL_FLAG) 164 #else 165 #define SET_SYM_VALUE(r,n) BOXWORD_SET_SHIFT_VALUE(r, SYMBOL, n) 166 #endif 167 #define SET_OBJ_VALUE(r,v) ((r).value.p = v) 168 169 MRB_INLINE enum mrb_vtype 73 170 mrb_type(mrb_value o) 74 171 { 75 switch (o.w) { 76 case MRB_Qfalse: 77 case MRB_Qnil: 78 return MRB_TT_FALSE; 79 case MRB_Qtrue: 80 return MRB_TT_TRUE; 81 case MRB_Qundef: 82 return MRB_TT_UNDEF; 83 } 84 if (o.value.i_flag == MRB_FIXNUM_FLAG) { 85 return MRB_TT_FIXNUM; 86 } 87 if (o.value.sym_flag == MRB_SYMBOL_FLAG) { 88 return MRB_TT_SYMBOL; 89 } 90 return o.value.bp->tt; 172 return !mrb_bool(o) ? MRB_TT_FALSE : 173 mrb_true_p(o) ? MRB_TT_TRUE : 174 mrb_fixnum_p(o) ? MRB_TT_FIXNUM : 175 mrb_symbol_p(o) ? MRB_TT_SYMBOL : 176 mrb_undef_p(o) ? MRB_TT_UNDEF : 177 o.value.bp->tt; 91 178 } 92 179 93 #define mrb_bool(o) ((o).w != MRB_Qnil && (o).w != MRB_Qfalse)94 #define mrb_fixnum_p(o) ((o).value.i_flag == MRB_FIXNUM_FLAG)95 #define mrb_undef_p(o) ((o).w == MRB_Qundef)96 #define mrb_nil_p(o) ((o).w == MRB_Qnil)97 98 #define BOXWORD_SET_VALUE(o, ttt, attr, v) do { \99 switch (ttt) {\100 case MRB_TT_FALSE: (o).w = (v) ? MRB_Qfalse : MRB_Qnil; break;\101 case MRB_TT_TRUE: (o).w = MRB_Qtrue; break;\102 case MRB_TT_UNDEF: (o).w = MRB_Qundef; 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;\105 default: (o).w = 0; (o).attr = (v); if ((o).value.bp) (o).value.bp->tt = ttt; break;\106 }\107 } while (0)108 109 #define SET_FLOAT_VALUE(mrb,r,v) r = mrb_word_boxing_float_value(mrb, v)110 #define SET_CPTR_VALUE(mrb,r,v) r = mrb_word_boxing_cptr_value(mrb, v)111 #define SET_NIL_VALUE(r) BOXWORD_SET_VALUE(r, MRB_TT_FALSE, value.i, 0)112 #define SET_FALSE_VALUE(r) BOXWORD_SET_VALUE(r, MRB_TT_FALSE, value.i, 1)113 #define SET_TRUE_VALUE(r) BOXWORD_SET_VALUE(r, MRB_TT_TRUE, value.i, 1)114 #define SET_BOOL_VALUE(r,b) BOXWORD_SET_VALUE(r, b ? MRB_TT_TRUE : MRB_TT_FALSE, value.i, 1)115 #define SET_INT_VALUE(r,n) BOXWORD_SET_VALUE(r, MRB_TT_FIXNUM, value.i, (n))116 #define SET_SYM_VALUE(r,v) BOXWORD_SET_VALUE(r, MRB_TT_SYMBOL, value.sym, (v))117 #define SET_OBJ_VALUE(r,v) BOXWORD_SET_VALUE(r, (((struct RObject*)(v))->tt), value.p, (v))118 #define SET_UNDEF_VALUE(r) BOXWORD_SET_VALUE(r, MRB_TT_UNDEF, value.i, 0)119 120 180 #endif /* MRUBY_BOXING_WORD_H */ -
EcnlProtoTool/trunk/mruby-2.1.1/include/mruby/class.h
r331 r439 1 /* 2 ** mruby/class.h - Class class1 /** 2 ** @file mruby/class.h - Class class 3 3 ** 4 4 ** See Copyright Notice in mruby.h … … 23 23 24 24 #define mrb_class_ptr(v) ((struct RClass*)(mrb_ptr(v))) 25 #define RCLASS_SUPER(v) (((struct RClass*)(mrb_ptr(v)))->super)26 #define RCLASS_IV_TBL(v) (((struct RClass*)(mrb_ptr(v)))->iv)27 #define RCLASS_M_TBL(v) (((struct RClass*)(mrb_ptr(v)))->mt)28 25 29 static inlinestruct RClass*26 MRB_INLINE struct RClass* 30 27 mrb_class(mrb_state *mrb, mrb_value v) 31 28 { … … 41 38 case MRB_TT_FIXNUM: 42 39 return mrb->fixnum_class; 40 #ifndef MRB_WITHOUT_FLOAT 43 41 case MRB_TT_FLOAT: 44 42 return mrb->float_class; 43 #endif 45 44 case MRB_TT_CPTR: 46 45 return mrb->object_class; … … 52 51 } 53 52 54 /* TODO: figure out where to put user flags */ 55 #define MRB_FLAG_IS_FROZEN (1 << 18) 56 #define MRB_FLAG_IS_PREPENDED (1 << 19) 57 #define MRB_FLAG_IS_ORIGIN (1 << 20) 53 /* flags: 54 20: frozen 55 19: is_prepended 56 18: is_origin 57 17: is_inherited (used by method cache) 58 16: unused 59 0-15: instance type 60 */ 61 #define MRB_FL_CLASS_IS_PREPENDED (1 << 19) 62 #define MRB_FL_CLASS_IS_ORIGIN (1 << 18) 58 63 #define MRB_CLASS_ORIGIN(c) do {\ 59 if ( c->flags & MRB_FLAG_IS_PREPENDED) {\60 c = c->super;\61 while (!( c->flags & MRB_FLAG_IS_ORIGIN)) {\62 c = c->super;\64 if ((c)->flags & MRB_FL_CLASS_IS_PREPENDED) {\ 65 (c) = (c)->super;\ 66 while (!((c)->flags & MRB_FL_CLASS_IS_ORIGIN)) {\ 67 (c) = (c)->super;\ 63 68 }\ 64 69 }\ 65 70 } while (0) 71 #define MRB_FL_CLASS_IS_INHERITED (1 << 17) 66 72 #define MRB_INSTANCE_TT_MASK (0xFF) 67 #define MRB_SET_INSTANCE_TT(c, tt) c->flags = ((c->flags & ~MRB_INSTANCE_TT_MASK) | (char)tt)68 #define MRB_INSTANCE_TT(c) (enum mrb_vtype)( c->flags & MRB_INSTANCE_TT_MASK)73 #define MRB_SET_INSTANCE_TT(c, tt) ((c)->flags = (((c)->flags & ~MRB_INSTANCE_TT_MASK) | (char)(tt))) 74 #define MRB_INSTANCE_TT(c) (enum mrb_vtype)((c)->flags & MRB_INSTANCE_TT_MASK) 69 75 70 76 MRB_API struct RClass* mrb_define_class_id(mrb_state*, mrb_sym, struct RClass*); 71 77 MRB_API struct RClass* mrb_define_module_id(mrb_state*, mrb_sym); 72 MRB_APIstruct RClass *mrb_vm_define_class(mrb_state*, mrb_value, mrb_value, mrb_sym);73 MRB_APIstruct RClass *mrb_vm_define_module(mrb_state*, mrb_value, mrb_sym);74 MRB_API void mrb_define_method_raw(mrb_state*, struct RClass*, mrb_sym, struct RProc *);78 struct RClass *mrb_vm_define_class(mrb_state*, mrb_value, mrb_value, mrb_sym); 79 struct RClass *mrb_vm_define_module(mrb_state*, mrb_value, mrb_sym); 80 MRB_API void mrb_define_method_raw(mrb_state*, struct RClass*, mrb_sym, mrb_method_t); 75 81 MRB_API void mrb_define_method_id(mrb_state *mrb, struct RClass *c, mrb_sym mid, mrb_func_t func, mrb_aspec aspec); 76 MRB_API void mrb_alias_method(mrb_state *mrb, struct RClass *c, mrb_sym a, mrb_sym b);82 MRB_API void mrb_alias_method(mrb_state*, struct RClass *c, mrb_sym a, mrb_sym b); 77 83 78 MRB_API struct RClass *mrb_class_outer_module(mrb_state*, struct RClass *); 79 MRB_API struct RProc *mrb_method_search_vm(mrb_state*, struct RClass**, mrb_sym); 80 MRB_API struct RProc *mrb_method_search(mrb_state*, struct RClass*, mrb_sym); 84 MRB_API mrb_method_t mrb_method_search_vm(mrb_state*, struct RClass**, mrb_sym); 85 MRB_API mrb_method_t mrb_method_search(mrb_state*, struct RClass*, mrb_sym); 81 86 82 87 MRB_API struct RClass* mrb_class_real(struct RClass* cl); 88 mrb_value mrb_instance_new(mrb_state *mrb, mrb_value cv); 83 89 90 void mrb_class_name_class(mrb_state*, struct RClass*, struct RClass*, mrb_sym); 91 mrb_bool mrb_const_name_p(mrb_state*, const char*, mrb_int); 92 mrb_value mrb_class_find_path(mrb_state*, struct RClass*); 93 mrb_value mrb_mod_to_s(mrb_state*, mrb_value); 84 94 void mrb_gc_mark_mt(mrb_state*, struct RClass*); 85 95 size_t mrb_gc_mark_mt_size(mrb_state*, struct RClass*); 86 96 void mrb_gc_free_mt(mrb_state*, struct RClass*); 87 97 98 #ifdef MRB_METHOD_CACHE 99 void mrb_mc_clear_by_class(mrb_state *mrb, struct RClass* c); 100 #else 101 #define mrb_mc_clear_by_class(mrb,c) 102 #endif 103 88 104 MRB_END_DECL 89 105 -
EcnlProtoTool/trunk/mruby-2.1.1/include/mruby/common.h
r331 r439 1 /* 2 ** "common.h - mruby common platform definition"1 /** 2 ** @file common.h - mruby common platform definition" 3 3 ** 4 4 ** See Copyright Notice in mruby.h … … 8 8 #define MRUBY_COMMON_H 9 9 10 #ifdef __APPLE__ 11 #ifndef __TARGETCONDITIONALS__ 12 #include "TargetConditionals.h" 13 #endif 14 #endif 10 15 11 16 #ifdef __cplusplus … … 15 20 #else 16 21 # define MRB_BEGIN_DECL extern "C" { 17 # define MRB_END_DECL 22 # define MRB_END_DECL } 18 23 #endif 19 24 #else … … 30 35 31 36 /** Declare a function that never returns. */ 32 #if __STDC_VERSION__ >= 201112L37 #if defined __STDC_VERSION__ && __STDC_VERSION__ >= 201112L 33 38 # define mrb_noreturn _Noreturn 34 39 #elif defined __GNUC__ && !defined __STRICT_ANSI__ … … 50 55 51 56 /** Declare a function as always inlined. */ 52 #if defined (_MSC_VER)53 # define MRB_INLINE static __inline54 # else55 # define MRB_INLINE static inline57 #if defined _MSC_VER && _MSC_VER < 1900 58 # ifndef __cplusplus 59 # define inline __inline 60 # endif 56 61 #endif 57 62 #define MRB_INLINE static inline 58 63 59 64 /** Declare a public MRuby API function. */ 65 #ifndef MRB_API 60 66 #if defined(MRB_BUILD_AS_DLL) 61 67 #if defined(MRB_CORE) || defined(MRB_LIB) … … 67 73 # define MRB_API extern 68 74 #endif 75 #endif 76 77 /** Declare mingw versions */ 78 #if defined(__MINGW32__) || defined(__MINGW64__) 79 # include <_mingw.h> 80 # if defined(__MINGW64_VERSION_MAJOR) 81 # define MRB_MINGW64_VERSION (__MINGW64_VERSION_MAJOR * 1000 + __MINGW64_VERSION_MINOR) 82 # elif defined(__MINGW32_MAJOR_VERSION) 83 # define MRB_MINGW32_VERSION (__MINGW32_MAJOR_VERSION * 1000 + __MINGW32_MINOR_VERSION) 84 # endif 85 #endif 69 86 70 87 MRB_END_DECL -
EcnlProtoTool/trunk/mruby-2.1.1/include/mruby/compile.h
r331 r439 1 /* 2 ** mruby/compile.h - mruby parser1 /** 2 ** @file mruby/compile.h - mruby parser 3 3 ** 4 4 ** See Copyright Notice in mruby.h … … 25 25 int slen; 26 26 char *filename; 27 short lineno;27 uint16_t lineno; 28 28 int (*partial_hook)(struct mrb_parser_state*); 29 29 void *partial_data; … … 34 34 mrb_bool keep_lv:1; 35 35 mrb_bool no_optimize:1; 36 mrb_bool on_eval:1; 37 38 size_t parser_nerr; 36 39 } mrbc_context; 37 40 … … 65 68 /* saved error message */ 66 69 struct mrb_parser_message { 67 int lineno;70 uint16_t lineno; 68 71 int column; 69 72 char* message; … … 103 106 }; 104 107 105 #define MRB_PARSER_TOKBUF_MAX 65536108 #define MRB_PARSER_TOKBUF_MAX (UINT16_MAX-1) 106 109 #define MRB_PARSER_TOKBUF_SIZE 256 107 110 … … 116 119 #endif 117 120 mrbc_context *cxt; 118 char const *filename;119 int lineno;121 mrb_sym filename_sym; 122 uint16_t lineno; 120 123 int column; 121 124 … … 137 140 int tsiz; 138 141 139 mrb_ast_node *all_heredocs; 142 mrb_ast_node *all_heredocs; /* list of mrb_parser_heredoc_info* */ 140 143 mrb_ast_node *heredocs_from_nextline; 141 144 mrb_ast_node *parsing_heredoc; 142 145 mrb_ast_node *lex_strterm_before_heredoc; 143 mrb_bool heredoc_end_now:1; /* for mirb */144 146 145 147 void *ylval; … … 150 152 151 153 mrb_bool no_optimize:1; 154 mrb_bool on_eval:1; 152 155 mrb_bool capture_errors:1; 153 156 struct mrb_parser_message error_buffer[10]; … … 155 158 156 159 mrb_sym* filename_table; 157 size_t filename_table_length;158 int current_filename_index;160 uint16_t filename_table_length; 161 uint16_t current_filename_index; 159 162 160 163 struct mrb_jmpbuf* jmp; 164 mrb_ast_node *nvars; 161 165 }; 162 166 … … 164 168 MRB_API void mrb_parser_free(struct mrb_parser_state*); 165 169 MRB_API void mrb_parser_parse(struct mrb_parser_state*,mrbc_context*); 166 MRB_API double mrb_float_read(const char*, char**);167 170 168 171 MRB_API void mrb_parser_set_filename(struct mrb_parser_state*, char const*); 169 MRB_API char const*mrb_parser_get_filename(struct mrb_parser_state*, uint16_t idx);172 MRB_API mrb_sym mrb_parser_get_filename(struct mrb_parser_state*, uint16_t idx); 170 173 171 174 /* utility functions */ … … 174 177 #endif 175 178 MRB_API struct mrb_parser_state* mrb_parse_string(mrb_state*,const char*,mrbc_context*); 176 MRB_API struct mrb_parser_state* mrb_parse_nstring(mrb_state*,const char*, int,mrbc_context*);179 MRB_API struct mrb_parser_state* mrb_parse_nstring(mrb_state*,const char*,size_t,mrbc_context*); 177 180 MRB_API struct RProc* mrb_generate_code(mrb_state*, struct mrb_parser_state*); 178 181 MRB_API mrb_value mrb_load_exec(mrb_state *mrb, struct mrb_parser_state *p, mrbc_context *c); … … 184 187 #endif 185 188 MRB_API mrb_value mrb_load_string(mrb_state *mrb, const char *s); 186 MRB_API mrb_value mrb_load_nstring(mrb_state *mrb, const char *s, int len);189 MRB_API mrb_value mrb_load_nstring(mrb_state *mrb, const char *s, size_t len); 187 190 MRB_API mrb_value mrb_load_string_cxt(mrb_state *mrb, const char *s, mrbc_context *cxt); 188 MRB_API mrb_value mrb_load_nstring_cxt(mrb_state *mrb, const char *s, int len, mrbc_context *cxt);191 MRB_API mrb_value mrb_load_nstring_cxt(mrb_state *mrb, const char *s, size_t len, mrbc_context *cxt); 189 192 190 193 /** @} */ -
EcnlProtoTool/trunk/mruby-2.1.1/include/mruby/data.h
r331 r439 1 /* 2 ** mruby/data.h - Data class1 /** 2 ** @file mruby/data.h - Data class 3 3 ** 4 4 ** See Copyright Notice in mruby.h … … 40 40 mrb_data_object_alloc(mrb,klass,ptr,type) 41 41 42 #define Data_Make_Struct(mrb,klass,strct,type,sval,data) do { \ 43 sval = mrb_malloc(mrb, sizeof(strct)); \ 44 { static const strct zero = { 0 }; *sval = zero; };\ 45 data = Data_Wrap_Struct(mrb,klass,type,sval);\ 42 #define Data_Make_Struct(mrb,klass,strct,type,sval,data_obj) do { \ 43 (data_obj) = Data_Wrap_Struct(mrb,klass,type,NULL);\ 44 (sval) = (strct *)mrb_malloc(mrb, sizeof(strct)); \ 45 { static const strct zero = { 0 }; *(sval) = zero; };\ 46 (data_obj)->data = (sval);\ 46 47 } while (0) 47 48 … … 63 64 } while (0) 64 65 65 static inlinevoid66 MRB_INLINE void 66 67 mrb_data_init(mrb_value v, void *ptr, const mrb_data_type *type) 67 68 { 68 mrb_assert(mrb_ type(v) == MRB_TT_DATA);69 mrb_assert(mrb_data_p(v)); 69 70 DATA_PTR(v) = ptr; 70 71 DATA_TYPE(v) = type; -
EcnlProtoTool/trunk/mruby-2.1.1/include/mruby/debug.h
r331 r439 1 /* 2 ** mruby/debug.h - mruby debug info1 /** 2 ** @file mruby/debug.h - mruby debug info 3 3 ** 4 4 ** See Copyright Notice in mruby.h … … 27 27 typedef struct mrb_irep_debug_info_file { 28 28 uint32_t start_pos; 29 const char *filename;30 29 mrb_sym filename_sym; 31 30 uint32_t line_entry_count; … … 48 47 * @return returns NULL if not found 49 48 */ 50 MRB_API const char *mrb_debug_get_filename(mrb_ irep *irep, uint32_t pc);49 MRB_API const char *mrb_debug_get_filename(mrb_state *mrb, mrb_irep *irep, ptrdiff_t pc); 51 50 52 51 /* … … 54 53 * @return returns -1 if not found 55 54 */ 56 MRB_API int32_t mrb_debug_get_line(mrb_ irep *irep, uint32_t pc);55 MRB_API int32_t mrb_debug_get_line(mrb_state *mrb, mrb_irep *irep, ptrdiff_t pc); 57 56 57 MRB_API mrb_irep_debug_info *mrb_debug_info_alloc(mrb_state *mrb, mrb_irep *irep); 58 58 MRB_API mrb_irep_debug_info_file *mrb_debug_info_append_file( 59 mrb_state *mrb, mrb_irep *irep, 59 mrb_state *mrb, mrb_irep_debug_info *info, 60 const char *filename, uint16_t *lines, 60 61 uint32_t start_pos, uint32_t end_pos); 61 MRB_API mrb_irep_debug_info *mrb_debug_info_alloc(mrb_state *mrb, mrb_irep *irep);62 62 MRB_API void mrb_debug_info_free(mrb_state *mrb, mrb_irep_debug_info *d); 63 63 -
EcnlProtoTool/trunk/mruby-2.1.1/include/mruby/dump.h
r331 r439 1 /* 2 ** mruby/dump.h - mruby binary dumper (mrbc binary format)1 /** 2 ** @file mruby/dump.h - mruby binary dumper (mrbc binary format) 3 3 ** 4 4 ** See Copyright Notice in mruby.h … … 32 32 #endif 33 33 MRB_API mrb_irep *mrb_read_irep(mrb_state*, const uint8_t*); 34 MRB_API mrb_irep *mrb_read_irep_buf(mrb_state*, const void*, size_t); 34 35 35 36 /* dump/load error code … … 53 54 #define RITE_BINARY_IDENT "RITE" 54 55 #define RITE_BINARY_IDENT_LIL "ETIR" 55 #define RITE_BINARY_FORMAT_VER "000 4"56 #define RITE_BINARY_FORMAT_VER "0006" 56 57 #define RITE_COMPILER_NAME "MATZ" 57 58 #define RITE_COMPILER_VERSION "0000" 58 59 59 #define RITE_VM_VER "000 0"60 #define RITE_VM_VER "0002" 60 61 61 62 #define RITE_BINARY_EOF "END\0" 62 63 #define RITE_SECTION_IREP_IDENT "IREP" 63 #define RITE_SECTION_LINENO_IDENT "LINE"64 64 #define RITE_SECTION_DEBUG_IDENT "DBG\0" 65 65 #define RITE_SECTION_LV_IDENT "LVAR" … … 67 67 #define MRB_DUMP_DEFAULT_STR_LEN 128 68 68 #define MRB_DUMP_ALIGNMENT sizeof(uint32_t) 69 70 #ifdef __CA850__71 #pragma pack(1)72 #elif __RX73 #pragma pack74 #elif _MSC_VER75 #pragma pack(push, 1)76 #endif77 #ifndef __GNUC__78 #define __attribute__(x)79 #endif // !__GNUC__80 69 81 70 /* binary header */ … … 87 76 uint8_t compiler_name[4]; /* Compiler name */ 88 77 uint8_t compiler_version[4]; 89 } __attribute__((packed));78 }; 90 79 91 80 /* section header */ … … 96 85 struct rite_section_header { 97 86 RITE_SECTION_HEADER; 98 } __attribute__((packed));87 }; 99 88 100 89 struct rite_section_irep_header { … … 102 91 103 92 uint8_t rite_version[4]; /* Rite Instruction Specification Version */ 104 } __attribute__((packed)); 105 106 struct rite_section_lineno_header { 107 RITE_SECTION_HEADER; 108 } __attribute__((packed)); 93 }; 109 94 110 95 struct rite_section_debug_header { 111 96 RITE_SECTION_HEADER; 112 } __attribute__((packed));97 }; 113 98 114 99 struct rite_section_lv_header { 115 100 RITE_SECTION_HEADER; 116 } __attribute__((packed));101 }; 117 102 118 103 #define RITE_LV_NULL_MARK UINT16_MAX … … 120 105 struct rite_binary_footer { 121 106 RITE_SECTION_HEADER; 122 } __attribute__((packed)); 123 124 #ifdef __CA850__ 125 #pragma pack(8) 126 #elif __RX 127 #pragma unpack 128 #elif _MSC_VER 129 #pragma pack(pop) 130 #endif 107 }; 131 108 132 109 static inline int -
EcnlProtoTool/trunk/mruby-2.1.1/include/mruby/error.h
r331 r439 1 /* 2 ** mruby/error.h - Exception class1 /** 2 ** @file mruby/error.h - Exception class 3 3 ** 4 4 ** See Copyright Notice in mruby.h … … 25 25 MRB_API mrb_value mrb_exc_new_str(mrb_state *mrb, struct RClass* c, mrb_value str); 26 26 #define mrb_exc_new_str_lit(mrb, c, lit) mrb_exc_new_str(mrb, c, mrb_str_new_lit(mrb, lit)) 27 MRB_API mrb_value mrb_make_exception(mrb_state *mrb, int argc, const mrb_value *argv);27 MRB_API mrb_value mrb_make_exception(mrb_state *mrb, mrb_int argc, const mrb_value *argv); 28 28 MRB_API mrb_value mrb_exc_backtrace(mrb_state *mrb, mrb_value exc); 29 29 MRB_API mrb_value mrb_get_backtrace(mrb_state *mrb); 30 30 MRB_API mrb_noreturn void mrb_no_method_error(mrb_state *mrb, mrb_sym id, mrb_value args, const char *fmt, ...); 31 31 32 /* declaration for failmethod */32 /* declaration for `fail` method */ 33 33 MRB_API mrb_value mrb_f_raise(mrb_state*, mrb_value); 34 34 35 #if defined(MRB_64BIT) || defined(MRB_USE_FLOAT) || defined(MRB_NAN_BOXING) || defined(MRB_WORD_BOXING) 35 36 struct RBreak { 36 37 MRB_OBJECT_HEADER; 37 struct iv_tbl *iv;38 38 struct RProc *proc; 39 39 mrb_value val; 40 40 }; 41 #define mrb_break_value_get(brk) ((brk)->val) 42 #define mrb_break_value_set(brk, v) ((brk)->val = v) 43 #else 44 struct RBreak { 45 MRB_OBJECT_HEADER; 46 struct RProc *proc; 47 union mrb_value_union value; 48 }; 49 #define RBREAK_VALUE_TT_MASK ((1 << 8) - 1) 50 static inline mrb_value 51 mrb_break_value_get(struct RBreak *brk) 52 { 53 mrb_value val; 54 val.value = brk->value; 55 val.tt = (enum mrb_vtype)(brk->flags & RBREAK_VALUE_TT_MASK); 56 return val; 57 } 58 static inline void 59 mrb_break_value_set(struct RBreak *brk, mrb_value val) 60 { 61 brk->value = val.value; 62 brk->flags &= ~RBREAK_VALUE_TT_MASK; 63 brk->flags |= val.tt; 64 } 65 #endif /* MRB_64BIT || MRB_USE_FLOAT || MRB_NAN_BOXING || MRB_WORD_BOXING */ 66 #define mrb_break_proc_get(brk) ((brk)->proc) 67 #define mrb_break_proc_set(brk, p) ((brk)->proc = p) 41 68 42 69 /** 43 70 * Protect 44 71 * 45 * @mrbgem mruby-error72 * Implemented in the mruby-error mrbgem 46 73 */ 47 74 MRB_API mrb_value mrb_protect(mrb_state *mrb, mrb_func_t body, mrb_value data, mrb_bool *state); … … 50 77 * Ensure 51 78 * 52 * @mrbgem mruby-error79 * Implemented in the mruby-error mrbgem 53 80 */ 54 81 MRB_API mrb_value mrb_ensure(mrb_state *mrb, mrb_func_t body, mrb_value b_data, … … 58 85 * Rescue 59 86 * 60 * @mrbgem mruby-error87 * Implemented in the mruby-error mrbgem 61 88 */ 62 89 MRB_API mrb_value mrb_rescue(mrb_state *mrb, mrb_func_t body, mrb_value b_data, … … 66 93 * Rescue exception 67 94 * 68 * @mrbgem mruby-error95 * Implemented in the mruby-error mrbgem 69 96 */ 70 97 MRB_API mrb_value mrb_rescue_exceptions(mrb_state *mrb, mrb_func_t body, mrb_value b_data, -
EcnlProtoTool/trunk/mruby-2.1.1/include/mruby/gc.h
r331 r439 1 /* 2 ** mruby/gc.h - garbage collector for mruby1 /** 2 ** @file mruby/gc.h - garbage collector for mruby 3 3 ** 4 4 ** See Copyright Notice in mruby.h … … 34 34 } mrb_gc_state; 35 35 36 /* Disable MSVC warning "C4200: nonstandard extension used: zero-sized array 37 * in struct/union" when in C++ mode */ 38 #ifdef _MSC_VER 39 #pragma warning(push) 40 #pragma warning(disable : 4200) 41 #endif 42 36 43 typedef struct mrb_heap_page { 37 44 struct RBasic *freelist; … … 43 50 void *objects[]; 44 51 } mrb_heap_page; 52 53 #ifdef _MSC_VER 54 #pragma warning(pop) 55 #endif 45 56 46 57 typedef struct mrb_gc { -
EcnlProtoTool/trunk/mruby-2.1.1/include/mruby/hash.h
r331 r439 1 /* 2 ** mruby/hash.h - Hash class1 /** 2 ** @file mruby/hash.h - Hash class 3 3 ** 4 4 ** See Copyright Notice in mruby.h … … 9 9 10 10 #include "common.h" 11 #include <mruby/khash.h>12 11 13 12 /** … … 19 18 MRB_OBJECT_HEADER; 20 19 struct iv_tbl *iv; 21 struct kh_ht*ht;20 struct htable *ht; 22 21 }; 23 22 … … 25 24 #define mrb_hash_value(p) mrb_obj_value((void*)(p)) 26 25 27 MRB_API mrb_value mrb_hash_new_capa(mrb_state*, mrb_int); 26 MRB_API mrb_value mrb_hash_new_capa(mrb_state *mrb, mrb_int capa); 27 MRB_API mrb_value mrb_ensure_hash_type(mrb_state *mrb, mrb_value hash); 28 MRB_API mrb_value mrb_check_hash_type(mrb_state *mrb, mrb_value hash); 28 29 29 30 /* … … 75 76 * Equivalent to: 76 77 * 77 * hash. hash_key?(key) ? hash[key] : def78 * hash.key?(key) ? hash[key] : def 78 79 * 79 80 * @param mrb The mruby state reference. … … 95 96 * @param hash The target hash. 96 97 * @param key The key to delete. 97 * @return The deleted value. 98 * @return The deleted value. This value is not protected from GC. Use `mrb_gc_protect()` if necessary. 98 99 */ 99 100 MRB_API mrb_value mrb_hash_delete_key(mrb_state *mrb, mrb_value hash, mrb_value key); … … 111 112 */ 112 113 MRB_API mrb_value mrb_hash_keys(mrb_state *mrb, mrb_value hash); 113 MRB_API mrb_value mrb_check_hash_type(mrb_state *mrb, mrb_value hash); 114 /* 115 * Check if the hash has the key. 116 * 117 * Equivalent to: 118 * 119 * hash.key?(key) 120 * 121 * @param mrb The mruby state reference. 122 * @param hash The target hash. 123 * @param key The key to check existence. 124 * @return True if the hash has the key 125 */ 126 MRB_API mrb_bool mrb_hash_key_p(mrb_state *mrb, mrb_value hash, mrb_value key); 114 127 115 128 /* … … 124 137 * @return True if the hash is empty, false otherwise. 125 138 */ 126 MRB_API mrb_ valuemrb_hash_empty_p(mrb_state *mrb, mrb_value self);139 MRB_API mrb_bool mrb_hash_empty_p(mrb_state *mrb, mrb_value self); 127 140 128 141 /* … … 152 165 MRB_API mrb_value mrb_hash_clear(mrb_state *mrb, mrb_value hash); 153 166 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) 167 /* 168 * Get hash size. 169 * 170 * Equivalent to: 171 * 172 * hash.size 173 * 174 * @param mrb The mruby state reference. 175 * @param hash The target hash. 176 * @return The hash size. 177 */ 178 MRB_API mrb_int mrb_hash_size(mrb_state *mrb, mrb_value hash); 179 180 /* 181 * Copies the hash. 182 * 183 * 184 * @param mrb The mruby state reference. 185 * @param hash The target hash. 186 * @return The copy of the hash 187 */ 188 MRB_API mrb_value mrb_hash_dup(mrb_state *mrb, mrb_value hash); 189 190 /* 191 * Merges two hashes. The first hash will be modified by the 192 * second hash. 193 * 194 * @param mrb The mruby state reference. 195 * @param hash1 The target hash. 196 * @param hash2 Updating hash 197 */ 198 MRB_API void mrb_hash_merge(mrb_state *mrb, mrb_value hash1, mrb_value hash2); 162 199 163 200 /* RHASH_TBL allocates st_table if not available. */ … … 166 203 #define RHASH_IFNONE(h) mrb_iv_get(mrb, (h), mrb_intern_lit(mrb, "ifnone")) 167 204 #define RHASH_PROCDEFAULT(h) RHASH_IFNONE(h) 168 MRB_API struct kh_ht * mrb_hash_tbl(mrb_state *mrb, mrb_value hash);169 205 170 206 #define MRB_HASH_DEFAULT 1 … … 178 214 void mrb_gc_free_hash(mrb_state*, struct RHash*); 179 215 216 /* return non zero to break the loop */ 217 typedef int (mrb_hash_foreach_func)(mrb_state *mrb, mrb_value key, mrb_value val, void *data); 218 MRB_API void mrb_hash_foreach(mrb_state *mrb, struct RHash *hash, mrb_hash_foreach_func *func, void *p); 219 180 220 MRB_END_DECL 181 221 -
EcnlProtoTool/trunk/mruby-2.1.1/include/mruby/irep.h
r331 r439 1 /* 2 ** mruby/irep.h - mrb_irep structure1 /** 2 ** @file mruby/irep.h - mrb_irep structure 3 3 ** 4 4 ** See Copyright Notice in mruby.h … … 33 33 uint8_t flags; 34 34 35 mrb_code *iseq;35 const mrb_code *iseq; 36 36 mrb_value *pool; 37 37 mrb_sym *syms; … … 40 40 struct mrb_locals *lv; 41 41 /* debug info */ 42 mrb_bool own_filename;43 const char *filename;44 uint16_t *lines;45 42 struct mrb_irep_debug_info* debug_info; 46 43 47 size_t ilen, plen, slen, rlen, refcnt; 44 uint16_t ilen, plen, slen, rlen; 45 uint32_t refcnt; 48 46 } mrb_irep; 49 47 … … 51 49 52 50 MRB_API mrb_irep *mrb_add_irep(mrb_state *mrb); 51 52 /* @param [const uint8_t*] irep code, expected as a literal */ 53 53 MRB_API mrb_value mrb_load_irep(mrb_state*, const uint8_t*); 54 55 /* 56 * @param [const void*] irep code 57 * @param [size_t] size of irep buffer. If -1 is given, it is considered unrestricted. 58 */ 59 MRB_API mrb_value mrb_load_irep_buf(mrb_state*, const void*, size_t); 60 61 /* @param [const uint8_t*] irep code, expected as a literal */ 54 62 MRB_API mrb_value mrb_load_irep_cxt(mrb_state*, const uint8_t*, mrbc_context*); 63 64 /* 65 * @param [const void*] irep code 66 * @param [size_t] size of irep buffer. If -1 is given, it is considered unrestricted. 67 */ 68 MRB_API mrb_value mrb_load_irep_buf_cxt(mrb_state*, const void*, size_t, mrbc_context*); 69 55 70 void mrb_irep_free(mrb_state*, struct mrb_irep*); 56 71 void mrb_irep_incref(mrb_state*, struct mrb_irep*); 57 72 void mrb_irep_decref(mrb_state*, struct mrb_irep*); 73 void mrb_irep_cutref(mrb_state*, struct mrb_irep*); 74 void mrb_irep_remove_lv(mrb_state *mrb, mrb_irep *irep); 75 76 struct mrb_insn_data { 77 uint8_t insn; 78 uint16_t a; 79 uint16_t b; 80 uint8_t c; 81 }; 82 83 struct mrb_insn_data mrb_decode_insn(const mrb_code *pc); 58 84 59 85 MRB_END_DECL -
EcnlProtoTool/trunk/mruby-2.1.1/include/mruby/istruct.h
r331 r439 1 /* 2 ** mruby/istruct.h - Inline structures1 /** 2 ** @file mruby/istruct.h - Inline structures 3 3 ** 4 4 ** See Copyright Notice in mruby.h … … 20 20 #define ISTRUCT_DATA_SIZE (sizeof(void*) * 3) 21 21 22 struct RI struct {22 struct RIStruct { 23 23 MRB_OBJECT_HEADER; 24 24 char inline_data[ISTRUCT_DATA_SIZE]; 25 25 }; 26 26 27 #define RISTRUCT(obj) ((struct RI struct*)(mrb_ptr(obj)))27 #define RISTRUCT(obj) ((struct RIStruct*)(mrb_ptr(obj))) 28 28 #define ISTRUCT_PTR(obj) (RISTRUCT(obj)->inline_data) 29 29 -
EcnlProtoTool/trunk/mruby-2.1.1/include/mruby/khash.h
r331 r439 1 /* 2 ** mruby/khash.c- Hash for mruby1 /** 2 ** @file mruby/khash.h - Hash for mruby 3 3 ** 4 4 ** See Copyright Notice in mruby.h -
EcnlProtoTool/trunk/mruby-2.1.1/include/mruby/numeric.h
r331 r439 1 /* 2 ** mruby/numeric.h - Numeric, Integer, Float, Fixnum class1 /** 2 ** @file mruby/numeric.h - Numeric, Integer, Float, Fixnum class 3 3 ** 4 4 ** See Copyright Notice in mruby.h … … 17 17 MRB_BEGIN_DECL 18 18 19 #define POSFIXABLE(f) ((f) <= MRB_INT_MAX) 20 #define NEGFIXABLE(f) ((f) >= MRB_INT_MIN) 21 #define FIXABLE(f) (POSFIXABLE(f) && NEGFIXABLE(f)) 22 19 #define TYPED_POSFIXABLE(f,t) ((f) <= (t)MRB_INT_MAX) 20 #define TYPED_NEGFIXABLE(f,t) ((f) >= (t)MRB_INT_MIN) 21 #define TYPED_FIXABLE(f,t) (TYPED_POSFIXABLE(f,t) && TYPED_NEGFIXABLE(f,t)) 22 #define POSFIXABLE(f) TYPED_POSFIXABLE(f,mrb_int) 23 #define NEGFIXABLE(f) TYPED_NEGFIXABLE(f,mrb_int) 24 #define FIXABLE(f) TYPED_FIXABLE(f,mrb_int) 25 #ifndef MRB_WITHOUT_FLOAT 23 26 #ifdef MRB_INT64 24 #define FIXABLE_FLOAT(f) FIXABLE((mrb_int)(f))27 #define FIXABLE_FLOAT(f) ((f)>=-9223372036854775808.0 && (f)<9223372036854775808.0) 25 28 #else 26 #define FIXABLE_FLOAT(f) FIXABLE(f) 29 #define FIXABLE_FLOAT(f) TYPED_FIXABLE(f,mrb_float) 30 #endif 27 31 #endif 28 32 33 #ifndef MRB_WITHOUT_FLOAT 29 34 MRB_API mrb_value mrb_flo_to_fixnum(mrb_state *mrb, mrb_value val); 30 MRB_API mrb_value mrb_fixnum_to_str(mrb_state *mrb, mrb_value x, int base); 35 #endif 36 MRB_API mrb_value mrb_fixnum_to_str(mrb_state *mrb, mrb_value x, mrb_int base); 31 37 /* ArgumentError if format string doesn't match /%(\.[0-9]+)?[aAeEfFgG]/ */ 38 #ifndef MRB_WITHOUT_FLOAT 32 39 MRB_API mrb_value mrb_float_to_str(mrb_state *mrb, mrb_value x, const char *fmt); 33 40 MRB_API mrb_float mrb_to_flo(mrb_state *mrb, mrb_value x); 41 MRB_API mrb_value mrb_int_value(mrb_state *mrb, mrb_float f); 42 #endif 34 43 35 mrb_value mrb_fixnum_plus(mrb_state *mrb, mrb_value x, mrb_value y); 36 mrb_value mrb_fixnum_minus(mrb_state *mrb, mrb_value x, mrb_value y); 37 mrb_value mrb_fixnum_mul(mrb_state *mrb, mrb_value x, mrb_value y); 38 mrb_value mrb_num_div(mrb_state *mrb, mrb_value x, mrb_value y); 44 MRB_API mrb_value mrb_num_plus(mrb_state *mrb, mrb_value x, mrb_value y); 45 MRB_API mrb_value mrb_num_minus(mrb_state *mrb, mrb_value x, mrb_value y); 46 MRB_API mrb_value mrb_num_mul(mrb_state *mrb, mrb_value x, mrb_value y); 39 47 40 48 #ifndef __has_builtin … … 153 161 #endif 154 162 163 #ifndef MRB_WITHOUT_FLOAT 164 # include <stdint.h> 165 # include <float.h> 166 167 # define MRB_FLT_RADIX FLT_RADIX 168 169 # ifdef MRB_USE_FLOAT 170 # define MRB_FLT_MANT_DIG FLT_MANT_DIG 171 # define MRB_FLT_EPSILON FLT_EPSILON 172 # define MRB_FLT_DIG FLT_DIG 173 # define MRB_FLT_MIN_EXP FLT_MIN_EXP 174 # define MRB_FLT_MIN FLT_MIN 175 # define MRB_FLT_MIN_10_EXP FLT_MIN_10_EXP 176 # define MRB_FLT_MAX_EXP FLT_MAX_EXP 177 # define MRB_FLT_MAX FLT_MAX 178 # define MRB_FLT_MAX_10_EXP FLT_MAX_10_EXP 179 180 # else /* not MRB_USE_FLOAT */ 181 # define MRB_FLT_MANT_DIG DBL_MANT_DIG 182 # define MRB_FLT_EPSILON DBL_EPSILON 183 # define MRB_FLT_DIG DBL_DIG 184 # define MRB_FLT_MIN_EXP DBL_MIN_EXP 185 # define MRB_FLT_MIN DBL_MIN 186 # define MRB_FLT_MIN_10_EXP DBL_MIN_10_EXP 187 # define MRB_FLT_MAX_EXP DBL_MAX_EXP 188 # define MRB_FLT_MAX DBL_MAX 189 # define MRB_FLT_MAX_10_EXP DBL_MAX_10_EXP 190 # endif /* MRB_USE_FLOAT */ 191 #endif /* MRB_WITHOUT_FLOAT */ 192 155 193 MRB_END_DECL 156 194 -
EcnlProtoTool/trunk/mruby-2.1.1/include/mruby/object.h
r331 r439 1 /* 2 ** mruby/object.h - mruby object definition1 /** 2 ** @file mruby/object.h - mruby object definition 3 3 ** 4 4 ** See Copyright Notice in mruby.h … … 9 9 10 10 #define MRB_OBJECT_HEADER \ 11 enum mrb_vtype tt:8;\12 uint32_t color:3;\13 uint32_t flags:21;\14 struct RClass *c;\15 struct RBasic *gcnext11 struct RClass *c; \ 12 struct RBasic *gcnext; \ 13 enum mrb_vtype tt:8; \ 14 uint32_t color:3; \ 15 uint32_t flags:21 16 16 17 #define MRB_FLAG_TEST(obj, flag) ((obj)->flags & flag) 18 17 #define MRB_FLAG_TEST(obj, flag) ((obj)->flags & (flag)) 19 18 20 19 struct RBasic { … … 23 22 #define mrb_basic_ptr(v) ((struct RBasic*)(mrb_ptr(v))) 24 23 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) 24 #define MRB_FL_OBJ_IS_FROZEN (1 << 20) 25 #define MRB_FROZEN_P(o) ((o)->flags & MRB_FL_OBJ_IS_FROZEN) 26 #define MRB_SET_FROZEN_FLAG(o) ((o)->flags |= MRB_FL_OBJ_IS_FROZEN) 27 #define MRB_UNSET_FROZEN_FLAG(o) ((o)->flags &= ~MRB_FL_OBJ_IS_FROZEN) 28 #define mrb_frozen_p(o) MRB_FROZEN_P(o) 28 29 29 30 struct RObject { … … 33 34 #define mrb_obj_ptr(v) ((struct RObject*)(mrb_ptr(v))) 34 35 35 #define mrb_immediate_p(x) (mrb_type(x) < MRB_TT_HAS_BASIC)36 36 #define mrb_special_const_p(x) mrb_immediate_p(x) 37 37 -
EcnlProtoTool/trunk/mruby-2.1.1/include/mruby/opcode.h
r331 r439 1 /* 2 ** mruby/opcode.h - RiteVM operation codes1 /** 2 ** @file mruby/opcode.h - RiteVM operation codes 3 3 ** 4 4 ** See Copyright Notice in mruby.h … … 8 8 #define MRUBY_OPCODE_H 9 9 10 #define MAXARG_Bx (0xffff) 11 #define MAXARG_sBx (MAXARG_Bx>>1) /* 'sBx' is signed */ 12 13 /* instructions: packed 32 bit */ 14 /* ------------------------------- */ 15 /* A:B:C:OP = 9: 9: 7: 7 */ 16 /* A:Bx:OP = 9:16: 7 */ 17 /* Ax:OP = 25: 7 */ 18 /* A:Bz:Cz:OP = 9:14: 2: 7 */ 19 20 #define GET_OPCODE(i) ((int)(((mrb_code)(i)) & 0x7f)) 21 #define GETARG_A(i) ((int)((((mrb_code)(i)) >> 23) & 0x1ff)) 22 #define GETARG_B(i) ((int)((((mrb_code)(i)) >> 14) & 0x1ff)) 23 #define GETARG_C(i) ((int)((((mrb_code)(i)) >> 7) & 0x7f)) 24 #define GETARG_Bx(i) ((int)((((mrb_code)(i)) >> 7) & 0xffff)) 25 #define GETARG_sBx(i) ((int)(GETARG_Bx(i)-MAXARG_sBx)) 26 #define GETARG_Ax(i) ((int32_t)((((mrb_code)(i)) >> 7) & 0x1ffffff)) 27 #define GETARG_UNPACK_b(i,n1,n2) ((int)((((mrb_code)(i)) >> (7+(n2))) & (((1<<(n1))-1)))) 28 #define GETARG_UNPACK_c(i,n1,n2) ((int)((((mrb_code)(i)) >> 7) & (((1<<(n2))-1)))) 29 #define GETARG_b(i) GETARG_UNPACK_b(i,14,2) 30 #define GETARG_c(i) GETARG_UNPACK_c(i,14,2) 31 32 #define MKOPCODE(op) ((op) & 0x7f) 33 #define MKARG_A(c) ((mrb_code)((c) & 0x1ff) << 23) 34 #define MKARG_B(c) ((mrb_code)((c) & 0x1ff) << 14) 35 #define MKARG_C(c) (((c) & 0x7f) << 7) 36 #define MKARG_Bx(v) ((mrb_code)((v) & 0xffff) << 7) 37 #define MKARG_sBx(v) MKARG_Bx((v)+MAXARG_sBx) 38 #define MKARG_Ax(v) ((mrb_code)((v) & 0x1ffffff) << 7) 39 #define MKARG_PACK(b,n1,c,n2) ((((b) & ((1<<n1)-1)) << (7+n2))|(((c) & ((1<<n2)-1)) << 7)) 40 #define MKARG_bc(b,c) MKARG_PACK(b,14,c,2) 41 42 #define MKOP_A(op,a) (MKOPCODE(op)|MKARG_A(a)) 43 #define MKOP_AB(op,a,b) (MKOP_A(op,a)|MKARG_B(b)) 44 #define MKOP_ABC(op,a,b,c) (MKOP_AB(op,a,b)|MKARG_C(c)) 45 #define MKOP_ABx(op,a,bx) (MKOP_A(op,a)|MKARG_Bx(bx)) 46 #define MKOP_Bx(op,bx) (MKOPCODE(op)|MKARG_Bx(bx)) 47 #define MKOP_sBx(op,sbx) (MKOPCODE(op)|MKARG_sBx(sbx)) 48 #define MKOP_AsBx(op,a,sbx) (MKOP_A(op,a)|MKARG_sBx(sbx)) 49 #define MKOP_Ax(op,ax) (MKOPCODE(op)|MKARG_Ax(ax)) 50 #define MKOP_Abc(op,a,b,c) (MKOP_A(op,a)|MKARG_bc(b,c)) 51 52 enum { 53 /*----------------------------------------------------------------------- 54 operation code operand description 55 ------------------------------------------------------------------------*/ 56 OP_NOP=0,/* */ 57 OP_MOVE,/* A B R(A) := R(B) */ 58 OP_LOADL,/* A Bx R(A) := Pool(Bx) */ 59 OP_LOADI,/* A sBx R(A) := sBx */ 60 OP_LOADSYM,/* A Bx R(A) := Syms(Bx) */ 61 OP_LOADNIL,/* A R(A) := nil */ 62 OP_LOADSELF,/* A R(A) := self */ 63 OP_LOADT,/* A R(A) := true */ 64 OP_LOADF,/* A R(A) := false */ 65 66 OP_GETGLOBAL,/* A Bx R(A) := getglobal(Syms(Bx)) */ 67 OP_SETGLOBAL,/* A Bx setglobal(Syms(Bx), R(A)) */ 68 OP_GETSPECIAL,/*A Bx R(A) := Special[Bx] */ 69 OP_SETSPECIAL,/*A Bx Special[Bx] := R(A) */ 70 OP_GETIV,/* A Bx R(A) := ivget(Syms(Bx)) */ 71 OP_SETIV,/* A Bx ivset(Syms(Bx),R(A)) */ 72 OP_GETCV,/* A Bx R(A) := cvget(Syms(Bx)) */ 73 OP_SETCV,/* A Bx cvset(Syms(Bx),R(A)) */ 74 OP_GETCONST,/* A Bx R(A) := constget(Syms(Bx)) */ 75 OP_SETCONST,/* A Bx constset(Syms(Bx),R(A)) */ 76 OP_GETMCNST,/* A Bx R(A) := R(A)::Syms(Bx) */ 77 OP_SETMCNST,/* A Bx R(A+1)::Syms(Bx) := R(A) */ 78 OP_GETUPVAR,/* A B C R(A) := uvget(B,C) */ 79 OP_SETUPVAR,/* A B C uvset(B,C,R(A)) */ 80 81 OP_JMP,/* sBx pc+=sBx */ 82 OP_JMPIF,/* A sBx if R(A) pc+=sBx */ 83 OP_JMPNOT,/* A sBx if !R(A) pc+=sBx */ 84 OP_ONERR,/* sBx rescue_push(pc+sBx) */ 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) */ 87 OP_POPERR,/* A A.times{rescue_pop()} */ 88 OP_RAISE,/* A raise(R(A)) */ 89 OP_EPUSH,/* Bx ensure_push(SEQ[Bx]) */ 90 OP_EPOP,/* A A.times{ensure_pop().call} */ 91 92 OP_SEND,/* A B C R(A) := call(R(A),Syms(B),R(A+1),...,R(A+C)) */ 93 OP_SENDB,/* A B C R(A) := call(R(A),Syms(B),R(A+1),...,R(A+C),&R(A+C+1))*/ 94 OP_FSEND,/* A B C R(A) := fcall(R(A),Syms(B),R(A+1),...,R(A+C-1)) */ 95 OP_CALL,/* A R(A) := self.call(frame.argc, frame.argv) */ 96 OP_SUPER,/* A C R(A) := super(R(A+1),... ,R(A+C+1)) */ 97 OP_ARGARY,/* A Bx R(A) := argument array (16=6:1:5:4) */ 98 OP_ENTER,/* Ax arg setup according to flags (23=5:5:1:5:5:1:1) */ 99 OP_KARG,/* A B C R(A) := kdict[Syms(B)]; if C kdict.rm(Syms(B)) */ 100 OP_KDICT,/* A C R(A) := kdict */ 101 102 OP_RETURN,/* A B return R(A) (B=normal,in-block return/break) */ 103 OP_TAILCALL,/* A B C return call(R(A),Syms(B),*R(C)) */ 104 OP_BLKPUSH,/* A Bx R(A) := block (16=6:1:5:4) */ 105 106 OP_ADD,/* A B C R(A) := R(A)+R(A+1) (Syms[B]=:+,C=1) */ 107 OP_ADDI,/* A B C R(A) := R(A)+C (Syms[B]=:+) */ 108 OP_SUB,/* A B C R(A) := R(A)-R(A+1) (Syms[B]=:-,C=1) */ 109 OP_SUBI,/* A B C R(A) := R(A)-C (Syms[B]=:-) */ 110 OP_MUL,/* A B C R(A) := R(A)*R(A+1) (Syms[B]=:*,C=1) */ 111 OP_DIV,/* A B C R(A) := R(A)/R(A+1) (Syms[B]=:/,C=1) */ 112 OP_EQ,/* A B C R(A) := R(A)==R(A+1) (Syms[B]=:==,C=1) */ 113 OP_LT,/* A B C R(A) := R(A)<R(A+1) (Syms[B]=:<,C=1) */ 114 OP_LE,/* A B C R(A) := R(A)<=R(A+1) (Syms[B]=:<=,C=1) */ 115 OP_GT,/* A B C R(A) := R(A)>R(A+1) (Syms[B]=:>,C=1) */ 116 OP_GE,/* A B C R(A) := R(A)>=R(A+1) (Syms[B]=:>=,C=1) */ 117 118 OP_ARRAY,/* A B C R(A) := ary_new(R(B),R(B+1)..R(B+C)) */ 119 OP_ARYCAT,/* A B ary_cat(R(A),R(B)) */ 120 OP_ARYPUSH,/* A B ary_push(R(A),R(B)) */ 121 OP_AREF,/* A B C R(A) := R(B)[C] */ 122 OP_ASET,/* A B C R(B)[C] := R(A) */ 123 OP_APOST,/* A B C *R(A),R(A+1)..R(A+C) := R(A) */ 124 125 OP_STRING,/* A Bx R(A) := str_dup(Lit(Bx)) */ 126 OP_STRCAT,/* A B str_cat(R(A),R(B)) */ 127 128 OP_HASH,/* A B C R(A) := hash_new(R(B),R(B+1)..R(B+C)) */ 129 OP_LAMBDA,/* A Bz Cz R(A) := lambda(SEQ[Bz],Cz) */ 130 OP_RANGE,/* A B C R(A) := range_new(R(B),R(B+1),C) */ 131 132 OP_OCLASS,/* A R(A) := ::Object */ 133 OP_CLASS,/* A B R(A) := newclass(R(A),Syms(B),R(A+1)) */ 134 OP_MODULE,/* A B R(A) := newmodule(R(A),Syms(B)) */ 135 OP_EXEC,/* A Bx R(A) := blockexec(R(A),SEQ[Bx]) */ 136 OP_METHOD,/* A B R(A).newmethod(Syms(B),R(A+1)) */ 137 OP_SCLASS,/* A B R(A) := R(B).singleton_class */ 138 OP_TCLASS,/* A R(A) := target_class */ 139 140 OP_DEBUG,/* A B C print R(A),R(B),R(C) */ 141 OP_STOP,/* stop VM */ 142 OP_ERR,/* Bx raise RuntimeError with message Lit(Bx) */ 143 144 OP_RSVD1,/* reserved instruction #1 */ 145 OP_RSVD2,/* reserved instruction #2 */ 146 OP_RSVD3,/* reserved instruction #3 */ 147 OP_RSVD4,/* reserved instruction #4 */ 148 OP_RSVD5,/* reserved instruction #5 */ 10 enum mrb_insn { 11 #define OPCODE(x,_) OP_ ## x, 12 #include "mruby/ops.h" 13 #undef OPCODE 149 14 }; 150 15 … … 159 24 #define OP_R_RETURN 2 160 25 26 #define PEEK_B(pc) (*(pc)) 27 #define PEEK_S(pc) ((pc)[0]<<8|(pc)[1]) 28 #define PEEK_W(pc) ((pc)[0]<<16|(pc)[1]<<8|(pc)[2]) 29 30 #define READ_B() PEEK_B(pc++) 31 #define READ_S() (pc+=2, PEEK_S(pc-2)) 32 #define READ_W() (pc+=3, PEEK_W(pc-3)) 33 34 #define FETCH_Z() /* nothing */ 35 #define FETCH_B() do {a=READ_B();} while (0) 36 #define FETCH_BB() do {a=READ_B(); b=READ_B();} while (0) 37 #define FETCH_BBB() do {a=READ_B(); b=READ_B(); c=READ_B();} while (0) 38 #define FETCH_BS() do {a=READ_B(); b=READ_S();} while (0) 39 #define FETCH_S() do {a=READ_S();} while (0) 40 #define FETCH_W() do {a=READ_W();} while (0) 41 42 /* with OP_EXT1 (1st 16bit) */ 43 #define FETCH_Z_1() FETCH_Z() 44 #define FETCH_B_1() FETCH_S() 45 #define FETCH_BB_1() do {a=READ_S(); b=READ_B();} while (0) 46 #define FETCH_BBB_1() do {a=READ_S(); b=READ_B(); c=READ_B();} while (0) 47 #define FETCH_BS_1() do {a=READ_S(); b=READ_S();} while (0) 48 #define FETCH_S_1() FETCH_S() 49 #define FETCH_W_1() FETCH_W() 50 51 /* with OP_EXT2 (2nd 16bit) */ 52 #define FETCH_Z_2() FETCH_Z() 53 #define FETCH_B_2() FETCH_B() 54 #define FETCH_BB_2() do {a=READ_B(); b=READ_S();} while (0) 55 #define FETCH_BBB_2() do {a=READ_B(); b=READ_S(); c=READ_B();} while (0) 56 #define FETCH_BS_2() FETCH_BS() 57 #define FETCH_S_2() FETCH_S() 58 #define FETCH_W_2() FETCH_W() 59 60 /* with OP_EXT3 (1st & 2nd 16bit) */ 61 #define FETCH_Z_3() FETCH_Z() 62 #define FETCH_B_3() FETCH_B() 63 #define FETCH_BB_3() do {a=READ_S(); b=READ_S();} while (0) 64 #define FETCH_BBB_3() do {a=READ_S(); b=READ_S(); c=READ_B();} while (0) 65 #define FETCH_BS_3() do {a=READ_S(); b=READ_S();} while (0) 66 #define FETCH_S_3() FETCH_S() 67 #define FETCH_W_3() FETCH_W() 68 161 69 #endif /* MRUBY_OPCODE_H */ -
EcnlProtoTool/trunk/mruby-2.1.1/include/mruby/proc.h
r331 r439 1 /* 2 ** mruby/proc.h - Proc class1 /** 2 ** @file mruby/proc.h - Proc class 3 3 ** 4 4 ** See Copyright Notice in mruby.h … … 19 19 MRB_OBJECT_HEADER; 20 20 mrb_value *stack; 21 ptrdiff_t cioff; 22 union { 23 mrb_sym mid; 24 struct mrb_context *c; 25 } cxt; 21 struct mrb_context *cxt; 22 mrb_sym mid; 26 23 }; 27 24 28 #define MRB_SET_ENV_STACK_LEN(e,len) (e)->flags = (unsigned int)(len) 29 #define MRB_ENV_STACK_LEN(e) ((mrb_int)(e)->flags) 30 #define MRB_ENV_UNSHARE_STACK(e) ((e)->cioff = -1) 31 #define MRB_ENV_STACK_SHARED_P(e) ((e)->cioff >= 0) 25 /* flags (21bits): 1(shared flag):10(cioff/bidx):10(stack_len) */ 26 #define MRB_ENV_SET_STACK_LEN(e,len) ((e)->flags = (((e)->flags & ~0x3ff)|((unsigned int)(len) & 0x3ff))) 27 #define MRB_ENV_STACK_LEN(e) ((mrb_int)((e)->flags & 0x3ff)) 28 #define MRB_ENV_STACK_UNSHARED (1<<20) 29 #define MRB_ENV_UNSHARE_STACK(e) ((e)->flags |= MRB_ENV_STACK_UNSHARED) 30 #define MRB_ENV_STACK_SHARED_P(e) (((e)->flags & MRB_ENV_STACK_UNSHARED) == 0) 31 #define MRB_ENV_BIDX(e) (((e)->flags >> 10) & 0x3ff) 32 #define MRB_ENV_SET_BIDX(e,idx) ((e)->flags = (((e)->flags & ~(0x3ff<<10))|((unsigned int)(idx) & 0x3ff)<<10)) 32 33 33 MRB_APIvoid mrb_env_unshare(mrb_state*, struct REnv*);34 void mrb_env_unshare(mrb_state*, struct REnv*); 34 35 35 36 struct RProc { … … 39 40 mrb_func_t func; 40 41 } body; 41 struct RClass *target_class; 42 struct REnv *env; 42 struct RProc *upper; 43 union { 44 struct RClass *target_class; 45 struct REnv *env; 46 } e; 43 47 }; 44 48 … … 52 56 #define MRB_ASPEC_BLOCK(a) ((a) & 1) 53 57 54 #define MRB_PROC_CFUNC 128 55 #define MRB_PROC_CFUNC_P(p) (((p)->flags & MRB_PROC_CFUNC) != 0) 58 #define MRB_PROC_CFUNC_FL 128 59 #define MRB_PROC_CFUNC_P(p) (((p)->flags & MRB_PROC_CFUNC_FL) != 0) 60 #define MRB_PROC_CFUNC(p) (p)->body.func 56 61 #define MRB_PROC_STRICT 256 57 62 #define MRB_PROC_STRICT_P(p) (((p)->flags & MRB_PROC_STRICT) != 0) 58 63 #define MRB_PROC_ORPHAN 512 59 64 #define MRB_PROC_ORPHAN_P(p) (((p)->flags & MRB_PROC_ORPHAN) != 0) 65 #define MRB_PROC_ENVSET 1024 66 #define MRB_PROC_ENV_P(p) (((p)->flags & MRB_PROC_ENVSET) != 0) 67 #define MRB_PROC_ENV(p) (MRB_PROC_ENV_P(p) ? (p)->e.env : NULL) 68 #define MRB_PROC_TARGET_CLASS(p) (MRB_PROC_ENV_P(p) ? (p)->e.env->c : (p)->e.target_class) 69 #define MRB_PROC_SET_TARGET_CLASS(p,tc) do {\ 70 if (MRB_PROC_ENV_P(p)) {\ 71 (p)->e.env->c = (tc);\ 72 mrb_field_write_barrier(mrb, (struct RBasic*)(p)->e.env, (struct RBasic*)(tc));\ 73 }\ 74 else {\ 75 (p)->e.target_class = (tc);\ 76 mrb_field_write_barrier(mrb, (struct RBasic*)p, (struct RBasic*)(tc));\ 77 }\ 78 } while (0) 79 #define MRB_PROC_SCOPE 2048 80 #define MRB_PROC_SCOPE_P(p) (((p)->flags & MRB_PROC_SCOPE) != 0) 60 81 61 82 #define mrb_proc_ptr(v) ((struct RProc*)(mrb_ptr(v))) … … 66 87 MRB_API struct RProc *mrb_closure_new_cfunc(mrb_state *mrb, mrb_func_t func, int nlocals); 67 88 void mrb_proc_copy(struct RProc *a, struct RProc *b); 89 mrb_int mrb_proc_arity(const struct RProc *p); 68 90 69 91 /* implementation of #send method */ 70 MRB_APImrb_value mrb_f_send(mrb_state *mrb, mrb_value self);92 mrb_value mrb_f_send(mrb_state *mrb, mrb_value self); 71 93 72 94 /* following functions are defined in mruby-proc-ext so please include it when using */ 73 MRB_API struct RProc *mrb_proc_new_cfunc_with_env(mrb_state *, mrb_func_t, mrb_int, const mrb_value*);74 MRB_API mrb_value mrb_proc_cfunc_env_get(mrb_state *, mrb_int);95 MRB_API struct RProc *mrb_proc_new_cfunc_with_env(mrb_state *mrb, mrb_func_t func, mrb_int argc, const mrb_value *argv); 96 MRB_API mrb_value mrb_proc_cfunc_env_get(mrb_state *mrb, mrb_int idx); 75 97 /* old name */ 76 98 #define mrb_cfunc_env_get(mrb, idx) mrb_proc_cfunc_env_get(mrb, idx) 77 99 100 #define MRB_METHOD_FUNC_FL 1 101 #define MRB_METHOD_NOARG_FL 2 102 #ifndef MRB_METHOD_T_STRUCT 103 104 #define MRB_METHOD_FUNC_P(m) (((uintptr_t)(m))&MRB_METHOD_FUNC_FL) 105 #define MRB_METHOD_NOARG_P(m) (((uintptr_t)(m))&MRB_METHOD_NOARG_FL) 106 #define MRB_METHOD_NOARG_SET(m) ((m)=(mrb_method_t)(((uintptr_t)(m))|MRB_METHOD_NOARG_FL)) 107 #define MRB_METHOD_FUNC(m) ((mrb_func_t)((uintptr_t)(m)&(~(MRB_METHOD_NOARG_FL|MRB_METHOD_FUNC_FL)))) 108 #define MRB_METHOD_FROM_FUNC(m,fn) ((m)=(mrb_method_t)((((uintptr_t)(fn))|MRB_METHOD_FUNC_FL))) 109 #define MRB_METHOD_FROM_PROC(m,pr) ((m)=(mrb_method_t)(pr)) 110 #define MRB_METHOD_PROC_P(m) (!MRB_METHOD_FUNC_P(m)) 111 #define MRB_METHOD_PROC(m) ((struct RProc*)(m)) 112 #define MRB_METHOD_UNDEF_P(m) ((m)==0) 113 114 #else 115 116 #define MRB_METHOD_FUNC_P(m) ((m).flags&MRB_METHOD_FUNC_FL) 117 #define MRB_METHOD_NOARG_P(m) ((m).flags&MRB_METHOD_NOARG_FL) 118 #define MRB_METHOD_FUNC(m) ((m).func) 119 #define MRB_METHOD_NOARG_SET(m) do{(m).flags|=MRB_METHOD_NOARG_FL;}while(0) 120 #define MRB_METHOD_FROM_FUNC(m,fn) do{(m).flags=MRB_METHOD_FUNC_FL;(m).func=(fn);}while(0) 121 #define MRB_METHOD_FROM_PROC(m,pr) do{(m).flags=0;(m).proc=(pr);}while(0) 122 #define MRB_METHOD_PROC_P(m) (!MRB_METHOD_FUNC_P(m)) 123 #define MRB_METHOD_PROC(m) ((m).proc) 124 #define MRB_METHOD_UNDEF_P(m) ((m).proc==NULL) 125 126 #endif /* MRB_METHOD_T_STRUCT */ 127 128 #define MRB_METHOD_CFUNC_P(m) (MRB_METHOD_FUNC_P(m)?TRUE:(MRB_METHOD_PROC(m)?(MRB_PROC_CFUNC_P(MRB_METHOD_PROC(m))):FALSE)) 129 #define MRB_METHOD_CFUNC(m) (MRB_METHOD_FUNC_P(m)?MRB_METHOD_FUNC(m):((MRB_METHOD_PROC(m)&&MRB_PROC_CFUNC_P(MRB_METHOD_PROC(m)))?MRB_PROC_CFUNC(MRB_METHOD_PROC(m)):NULL)) 130 131 78 132 #include <mruby/khash.h> 79 KHASH_DECLARE(mt, mrb_sym, struct RProc*, TRUE)133 KHASH_DECLARE(mt, mrb_sym, mrb_method_t, TRUE) 80 134 81 135 MRB_END_DECL -
EcnlProtoTool/trunk/mruby-2.1.1/include/mruby/range.h
r331 r439 1 /* 2 ** mruby/range.h - Range class1 /** 2 ** @file mruby/range.h - Range class 3 3 ** 4 4 ** See Copyright Notice in mruby.h … … 15 15 MRB_BEGIN_DECL 16 16 17 #if defined(MRB_NAN_BOXING) && defined(MRB_64BIT) || defined(MRB_WORD_BOXING) 18 # define MRB_RANGE_EMBED 19 #endif 20 21 #ifdef MRB_RANGE_EMBED 22 struct RRange { 23 MRB_OBJECT_HEADER; 24 mrb_value beg; 25 mrb_value end; 26 mrb_bool excl; 27 }; 28 # define mrb_gc_free_range(mrb, p) ((void)0) 29 # define RANGE_BEG(p) ((p)->beg) 30 # define RANGE_END(p) ((p)->end) 31 #else 17 32 typedef struct mrb_range_edges { 18 33 mrb_value beg; 19 34 mrb_value end; 20 35 } mrb_range_edges; 21 22 36 struct RRange { 23 37 MRB_OBJECT_HEADER; 24 38 mrb_range_edges *edges; 25 mrb_bool excl : 1;39 mrb_bool excl; 26 40 }; 41 # define mrb_gc_free_range(mrb, p) mrb_free(mrb, (p)->edges) 42 # define RANGE_BEG(p) ((p)->edges->beg) 43 # define RANGE_END(p) ((p)->edges->end) 44 #endif 27 45 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)) 30 #define mrb_range_value(p) mrb_obj_value((void*)(p)) 46 #define mrb_range_beg(mrb, r) RANGE_BEG(mrb_range_ptr(mrb, r)) 47 #define mrb_range_end(mrb, r) RANGE_END(mrb_range_ptr(mrb, r)) 48 #define mrb_range_excl_p(mrb, r) RANGE_EXCL(mrb_range_ptr(mrb, r)) 49 #define mrb_range_raw_ptr(r) ((struct RRange*)mrb_ptr(r)) 50 #define mrb_range_value(p) mrb_obj_value((void*)(p)) 51 #define RANGE_EXCL(p) ((p)->excl) 52 53 MRB_API struct RRange* mrb_range_ptr(mrb_state *mrb, mrb_value range); 31 54 32 55 /* … … 42 65 MRB_API mrb_value mrb_range_new(mrb_state *mrb, mrb_value start, mrb_value end, mrb_bool exclude); 43 66 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); 67 enum mrb_range_beg_len { 68 MRB_RANGE_TYPE_MISMATCH = 0, /* (failure) not range */ 69 MRB_RANGE_OK = 1, /* (success) range */ 70 MRB_RANGE_OUT = 2 /* (failure) out of range */ 71 }; 72 73 MRB_API enum mrb_range_beg_len mrb_range_beg_len(mrb_state *mrb, mrb_value range, mrb_int *begp, mrb_int *lenp, mrb_int len, mrb_bool trunc); 45 74 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)); 75 void mrb_gc_mark_range(mrb_state *mrb, struct RRange *r); 46 76 47 77 MRB_END_DECL -
EcnlProtoTool/trunk/mruby-2.1.1/include/mruby/re.h
r331 r439 1 /* 2 ** mruby/re.h - Regexp class1 /** 2 ** @file mruby/re.h - Regexp class 3 3 ** 4 4 ** See Copyright Notice in mruby.h -
EcnlProtoTool/trunk/mruby-2.1.1/include/mruby/string.h
r331 r439 1 /* 2 ** mruby/string.h - String class1 /** 2 ** @file mruby/string.h - String class 3 3 ** 4 4 ** See Copyright Notice in mruby.h … … 17 17 extern const char mrb_digitmap[]; 18 18 19 #define RSTRING_EMBED_LEN_MAX ((mrb_int)(sizeof(void*) * 3 - 1)) 19 #define RSTRING_EMBED_LEN_MAX \ 20 ((mrb_int)(sizeof(void*) * 3 + sizeof(void*) - 32 / CHAR_BIT - 1)) 20 21 21 22 struct RString { … … 23 24 union { 24 25 struct { 25 mrb_ intlen;26 mrb_ssize len; 26 27 union { 27 mrb_ intcapa;28 mrb_ssize capa; 28 29 struct mrb_shared_string *shared; 30 struct RString *fshared; 29 31 } aux; 30 32 char *ptr; 31 33 } heap; 32 char ary[RSTRING_EMBED_LEN_MAX + 1];33 34 } as; 34 35 }; 36 struct RStringEmbed { 37 MRB_OBJECT_HEADER; 38 char ary[]; 39 }; 40 41 #define RSTR_SET_TYPE_FLAG(s, type) (RSTR_UNSET_TYPE_FLAG(s), (s)->flags |= MRB_STR_##type) 42 #define RSTR_UNSET_TYPE_FLAG(s) ((s)->flags &= ~(MRB_STR_TYPE_MASK|MRB_STR_EMBED_LEN_MASK)) 35 43 36 44 #define RSTR_EMBED_P(s) ((s)->flags & MRB_STR_EMBED) … … 39 47 #define RSTR_SET_EMBED_LEN(s, n) do {\ 40 48 size_t tmp_n = (n);\ 41 s->flags &= ~MRB_STR_EMBED_LEN_MASK;\42 s->flags |= (tmp_n) << MRB_STR_EMBED_LEN_SHIFT;\49 (s)->flags &= ~MRB_STR_EMBED_LEN_MASK;\ 50 (s)->flags |= (tmp_n) << MRB_STR_EMBED_LEN_SHIFT;\ 43 51 } while (0) 44 52 #define RSTR_SET_LEN(s, n) do {\ … … 47 55 }\ 48 56 else {\ 49 s->as.heap.len = (mrb_int)(n);\57 (s)->as.heap.len = (mrb_ssize)(n);\ 50 58 }\ 51 59 } while (0) 60 #define RSTR_EMBED_PTR(s) (((struct RStringEmbed*)(s))->ary) 52 61 #define RSTR_EMBED_LEN(s)\ 53 62 (mrb_int)(((s)->flags & MRB_STR_EMBED_LEN_MASK) >> MRB_STR_EMBED_LEN_SHIFT) 54 #define RSTR_PTR(s) ((RSTR_EMBED_P(s)) ? (s)->as.ary : (s)->as.heap.ptr) 63 #define RSTR_EMBEDDABLE_P(len) ((len) <= RSTRING_EMBED_LEN_MAX) 64 65 #define RSTR_PTR(s) ((RSTR_EMBED_P(s)) ? RSTR_EMBED_PTR(s) : (s)->as.heap.ptr) 55 66 #define RSTR_LEN(s) ((RSTR_EMBED_P(s)) ? RSTR_EMBED_LEN(s) : (s)->as.heap.len) 56 67 #define RSTR_CAPA(s) (RSTR_EMBED_P(s) ? RSTRING_EMBED_LEN_MAX : (s)->as.heap.aux.capa) … … 60 71 #define RSTR_UNSET_SHARED_FLAG(s) ((s)->flags &= ~MRB_STR_SHARED) 61 72 73 #define RSTR_FSHARED_P(s) ((s)->flags & MRB_STR_FSHARED) 74 #define RSTR_SET_FSHARED_FLAG(s) ((s)->flags |= MRB_STR_FSHARED) 75 #define RSTR_UNSET_FSHARED_FLAG(s) ((s)->flags &= ~MRB_STR_FSHARED) 76 62 77 #define RSTR_NOFREE_P(s) ((s)->flags & MRB_STR_NOFREE) 63 78 #define RSTR_SET_NOFREE_FLAG(s) ((s)->flags |= MRB_STR_NOFREE) 64 79 #define RSTR_UNSET_NOFREE_FLAG(s) ((s)->flags &= ~MRB_STR_NOFREE) 65 80 66 /* 81 #ifdef MRB_UTF8_STRING 82 # define RSTR_ASCII_P(s) ((s)->flags & MRB_STR_ASCII) 83 # define RSTR_SET_ASCII_FLAG(s) ((s)->flags |= MRB_STR_ASCII) 84 # define RSTR_UNSET_ASCII_FLAG(s) ((s)->flags &= ~MRB_STR_ASCII) 85 # define RSTR_WRITE_ASCII_FLAG(s, v) (RSTR_UNSET_ASCII_FLAG(s), (s)->flags |= v) 86 # define RSTR_COPY_ASCII_FLAG(dst, src) RSTR_WRITE_ASCII_FLAG(dst, RSTR_ASCII_P(src)) 87 #else 88 # define RSTR_ASCII_P(s) (void)0 89 # define RSTR_SET_ASCII_FLAG(s) (void)0 90 # define RSTR_UNSET_ASCII_FLAG(s) (void)0 91 # define RSTR_WRITE_ASCII_FLAG(s, v) (void)0 92 # define RSTR_COPY_ASCII_FLAG(dst, src) (void)0 93 #endif 94 95 #define RSTR_POOL_P(s) ((s)->flags & MRB_STR_POOL) 96 #define RSTR_SET_POOL_FLAG(s) ((s)->flags |= MRB_STR_POOL) 97 98 /** 67 99 * Returns a pointer from a Ruby string 68 100 */ … … 75 107 #define RSTRING_END(s) (RSTRING_PTR(s) + RSTRING_LEN(s)) 76 108 MRB_API mrb_int mrb_str_strlen(mrb_state*, struct RString*); 109 #define RSTRING_CSTR(mrb,s) mrb_string_cstr(mrb, s) 77 110 78 111 #define MRB_STR_SHARED 1 79 #define MRB_STR_NOFREE 2 80 #define MRB_STR_NO_UTF 8 81 #define MRB_STR_EMBED 16 82 #define MRB_STR_EMBED_LEN_MASK 0x3e0 83 #define MRB_STR_EMBED_LEN_SHIFT 5 112 #define MRB_STR_FSHARED 2 113 #define MRB_STR_NOFREE 4 114 #define MRB_STR_EMBED 8 /* type flags up to here */ 115 #define MRB_STR_POOL 16 /* status flags from here */ 116 #define MRB_STR_ASCII 32 117 #define MRB_STR_EMBED_LEN_SHIFT 6 118 #define MRB_STR_EMBED_LEN_BIT 5 119 #define MRB_STR_EMBED_LEN_MASK (((1 << MRB_STR_EMBED_LEN_BIT) - 1) << MRB_STR_EMBED_LEN_SHIFT) 120 #define MRB_STR_TYPE_MASK (MRB_STR_POOL - 1) 121 84 122 85 123 void mrb_gc_free_str(mrb_state*, struct RString*); 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 124 125 MRB_API void mrb_str_modify(mrb_state *mrb, struct RString *s); 126 /* mrb_str_modify() with keeping ASCII flag if set */ 127 MRB_API void mrb_str_modify_keep_ascii(mrb_state *mrb, struct RString *s); 128 129 /** 130 * Finds the index of a substring in a string 131 */ 132 MRB_API mrb_int mrb_str_index(mrb_state *mrb, mrb_value str, const char *p, mrb_int len, mrb_int offset); 133 #define mrb_str_index_lit(mrb, str, lit, off) mrb_str_index(mrb, str, lit, mrb_strlen_lit(lit), off); 134 135 /** 136 * Appends self to other. Returns self as a concatenated string. 137 * 138 * 139 * Example: 140 * 94 141 * int 95 142 * main(int argc, … … 110 157 * str2 = mrb_str_new_lit(mrb, "def"); 111 158 * 112 * // Concat nates str2 to str1.159 * // Concatenates str2 to str1. 113 160 * mrb_str_concat(mrb, str1, str2); 114 161 * 115 * // Prints new Concatnated Ruby string. 116 * mrb_p(mrb, str1); 117 * 118 * mrb_close(mrb); 119 * return 0; 120 * } 121 * 122 * 123 * Result: 162 * // Prints new Concatenated Ruby string. 163 * mrb_p(mrb, str1); 164 * 165 * mrb_close(mrb); 166 * return 0; 167 * } 168 * 169 * Result: 124 170 * 125 171 * => "abcdef" 126 172 * 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.173 * @param mrb The current mruby state. 174 * @param self String to concatenate. 175 * @param other String to append to self. 130 176 * @return [mrb_value] Returns a new String appending other to self. 131 177 */ 132 MRB_API void mrb_str_concat(mrb_state *, mrb_value, mrb_value);133 134 /* 178 MRB_API void mrb_str_concat(mrb_state *mrb, mrb_value self, mrb_value other); 179 180 /** 135 181 * Adds two strings together. 136 182 * 137 183 * 138 * Example: 139 * 140 * !!!c 184 * Example: 185 * 141 186 * int 142 187 * main(int argc, … … 162 207 * mrb_p(mrb, b); 163 208 * 164 * // Concat nates both Ruby strings.209 * // Concatenates both Ruby strings. 165 210 * c = mrb_str_plus(mrb, a, b); 166 211 * 167 * // Prints new Concatnated Ruby string.168 * mrb_p(mrb, c);169 * 170 * mrb_close(mrb);171 * return 0;172 * }173 * 174 * 175 * 212 * // Prints new Concatenated Ruby string. 213 * mrb_p(mrb, c); 214 * 215 * mrb_close(mrb); 216 * return 0; 217 * } 218 * 219 * 220 * Result: 176 221 * 177 222 * => "abc" # First string 178 223 * => "def" # Second string 179 * => "abcdef" # First & Second concat nated.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.224 * => "abcdef" # First & Second concatenated. 225 * 226 * @param mrb The current mruby state. 227 * @param a First string to concatenate. 228 * @param b Second string to concatenate. 184 229 * @return [mrb_value] Returns a new String containing a concatenated to b. 185 230 */ 186 MRB_API mrb_value mrb_str_plus(mrb_state *, mrb_value, mrb_value);187 188 /* 231 MRB_API mrb_value mrb_str_plus(mrb_state *mrb, mrb_value a, mrb_value b); 232 233 /** 189 234 * Converts pointer into a Ruby string. 190 235 * 191 * @param [mrb_state]mrb The current mruby state.192 * @param [void*]p The pointer to convert to Ruby string.236 * @param mrb The current mruby state. 237 * @param p The pointer to convert to Ruby string. 193 238 * @return [mrb_value] Returns a new Ruby String. 194 239 */ 195 MRB_API mrb_value mrb_ptr_to_str(mrb_state * , void*);196 197 /* 240 MRB_API mrb_value mrb_ptr_to_str(mrb_state *mrb, void *p); 241 242 /** 198 243 * Returns an object as a Ruby string. 199 244 * 200 * @param [mrb_state]mrb The current mruby state.201 * @param [mrb_value]obj An object to return as a Ruby string.245 * @param mrb The current mruby state. 246 * @param obj An object to return as a Ruby string. 202 247 * @return [mrb_value] An object as a Ruby string. 203 248 */ 204 249 MRB_API mrb_value mrb_obj_as_string(mrb_state *mrb, mrb_value obj); 205 250 206 /* 251 /** 207 252 * Resizes the string's length. Returns the amount of characters 208 253 * in the specified by len. … … 210 255 * Example: 211 256 * 212 * !!!c213 257 * int 214 258 * main(int argc, … … 235 279 * Result: 236 280 * 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.281 * => "Hello" 282 * 283 * @param mrb The current mruby state. 284 * @param str The Ruby string to resize. 285 * @param len The length. 242 286 * @return [mrb_value] An object as a Ruby string. 243 287 */ 244 288 MRB_API mrb_value mrb_str_resize(mrb_state *mrb, mrb_value str, mrb_int len); 245 289 246 /* 290 /** 247 291 * Returns a sub string. 248 292 * 249 * Example: 250 * 251 * !!!c 293 * Example: 294 * 252 295 * int 253 296 * main(int argc, … … 275 318 * } 276 319 * 277 * 320 * Result: 278 321 * 279 322 * => "He" 280 323 * 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.324 * @param mrb The current mruby state. 325 * @param str Ruby string. 326 * @param beg The beginning point of the sub-string. 327 * @param len The end point of the sub-string. 285 328 * @return [mrb_value] An object as a Ruby sub-string. 286 329 */ 287 330 MRB_API mrb_value mrb_str_substr(mrb_state *mrb, mrb_value str, mrb_int beg, mrb_int len); 288 331 289 /* 332 /** 290 333 * Returns a Ruby string type. 291 334 * 292 335 * 293 * @param [mrb_state]mrb The current mruby state.294 * @param [mrb_value]str Ruby string.336 * @param mrb The current mruby state. 337 * @param str Ruby string. 295 338 * @return [mrb_value] A Ruby string. 296 339 */ 340 MRB_API mrb_value mrb_ensure_string_type(mrb_state *mrb, mrb_value str); 341 MRB_API mrb_value mrb_check_string_type(mrb_state *mrb, mrb_value str); 342 /* obsolete: use mrb_ensure_string_type() instead */ 297 343 MRB_API mrb_value mrb_string_type(mrb_state *mrb, mrb_value str); 298 344 299 MRB_API mrb_value mrb_check_string_type(mrb_state *mrb, mrb_value str); 345 346 MRB_API mrb_value mrb_str_new_capa(mrb_state *mrb, size_t capa); 300 347 MRB_API mrb_value mrb_str_buf_new(mrb_state *mrb, size_t capa); 301 348 302 MRB_API const char *mrb_string_value_cstr(mrb_state *mrb, mrb_value *ptr); 349 /* NULL terminated C string from mrb_value */ 350 MRB_API const char *mrb_string_cstr(mrb_state *mrb, mrb_value str); 351 /* NULL terminated C string from mrb_value; `str` will be updated */ 352 MRB_API const char *mrb_string_value_cstr(mrb_state *mrb, mrb_value *str); 353 /* obslete: use RSTRING_PTR() */ 303 354 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 */ 355 /* obslete: use RSTRING_LEN() */ 312 356 MRB_API mrb_int mrb_string_value_len(mrb_state *mrb, mrb_value str); 313 357 314 /* 358 /** 315 359 * Duplicates a string object. 316 360 * 317 361 * 318 * @param [mrb_state]mrb The current mruby state.319 * @param [mrb_value]str Ruby string.362 * @param mrb The current mruby state. 363 * @param str Ruby string. 320 364 * @return [mrb_value] Duplicated Ruby string. 321 365 */ 322 366 MRB_API mrb_value mrb_str_dup(mrb_state *mrb, mrb_value str); 323 367 324 /* 368 /** 325 369 * Returns a symbol from a passed in Ruby string. 326 370 * 327 * @param [mrb_state]mrb The current mruby state.328 * @param [mrb_value]self Ruby string.371 * @param mrb The current mruby state. 372 * @param self Ruby string. 329 373 * @return [mrb_value] A symbol. 330 374 */ … … 332 376 333 377 MRB_API mrb_value mrb_str_to_inum(mrb_state *mrb, mrb_value str, mrb_int base, mrb_bool badcheck); 378 MRB_API mrb_value mrb_cstr_to_inum(mrb_state *mrb, const char *s, mrb_int base, mrb_bool badcheck); 334 379 MRB_API double mrb_str_to_dbl(mrb_state *mrb, mrb_value str, mrb_bool badcheck); 335 336 /* 380 MRB_API double mrb_cstr_to_dbl(mrb_state *mrb, const char *s, mrb_bool badcheck); 381 382 /** 337 383 * Returns a converted string type. 384 * For type checking, non converting `mrb_to_str` is recommended. 338 385 */ 339 386 MRB_API mrb_value mrb_str_to_str(mrb_state *mrb, mrb_value str); 340 387 341 /* 388 /** 342 389 * Returns true if the strings match and false if the strings don't match. 343 390 * 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.391 * @param mrb The current mruby state. 392 * @param str1 Ruby string to compare. 393 * @param str2 Ruby string to compare. 347 394 * @return [mrb_value] boolean value. 348 395 */ 349 396 MRB_API mrb_bool mrb_str_equal(mrb_state *mrb, mrb_value str1, mrb_value str2); 350 397 351 /* 352 * Returns a concate d string comprised of a Ruby string and a C string.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.398 /** 399 * Returns a concatenated string comprised of a Ruby string and a C string. 400 * 401 * @param mrb The current mruby state. 402 * @param str Ruby string. 403 * @param ptr A C string. 404 * @param len length of C string. 358 405 * @return [mrb_value] A Ruby string. 359 406 * @see mrb_str_cat_cstr … … 361 408 MRB_API mrb_value mrb_str_cat(mrb_state *mrb, mrb_value str, const char *ptr, size_t len); 362 409 363 /* 364 * Returns a concate d string comprised of a Ruby string and a C string.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.410 /** 411 * Returns a concatenated string comprised of a Ruby string and a C string. 412 * 413 * @param mrb The current mruby state. 414 * @param str Ruby string. 415 * @param ptr A C string. 369 416 * @return [mrb_value] A Ruby string. 370 417 * @see mrb_str_cat … … 374 421 #define mrb_str_cat_lit(mrb, str, lit) mrb_str_cat(mrb, str, lit, mrb_strlen_lit(lit)) 375 422 376 /* 423 /** 377 424 * Adds str2 to the end of str1. 378 425 */ 379 426 MRB_API mrb_value mrb_str_append(mrb_state *mrb, mrb_value str, mrb_value str2); 380 427 381 /* 428 /** 382 429 * Returns 0 if both Ruby strings are equal. Returns a value < 0 if Ruby str1 is less than Ruby str2. Returns a value > 0 if Ruby str2 is greater than Ruby str1. 383 430 */ 384 431 MRB_API int mrb_str_cmp(mrb_state *mrb, mrb_value str1, mrb_value str2); 385 432 386 /* 433 /** 387 434 * Returns a newly allocated C string from a Ruby string. 388 435 * This is an utility function to pass a Ruby string to C library functions. … … 395 442 * (e.g. it can be used for mkstemp(3)). 396 443 * 397 * @param [mrb_state *]mrb The current mruby state.398 * @param [mrb_value]str Ruby string. Must be an instance of String.444 * @param mrb The current mruby state. 445 * @param str Ruby string. Must be an instance of String. 399 446 * @return [char *] A newly allocated C string. 400 447 */ 401 448 MRB_API char *mrb_str_to_cstr(mrb_state *mrb, mrb_value str); 402 449 403 mrb_value mrb_str_pool(mrb_state *mrb, mrb_value str);404 mrb_int mrb_str_hash(mrb_state *mrb, mrb_value str);450 mrb_value mrb_str_pool(mrb_state *mrb, const char *s, mrb_int len, mrb_bool nofree); 451 uint32_t mrb_str_hash(mrb_state *mrb, mrb_value str); 405 452 mrb_value mrb_str_dump(mrb_state *mrb, mrb_value str); 406 453 407 /* 454 /** 408 455 * Returns a printable version of str, surrounded by quote marks, with special characters escaped. 409 456 */ 410 457 mrb_value mrb_str_inspect(mrb_state *mrb, mrb_value str); 411 412 void mrb_noregexp(mrb_state *mrb, mrb_value self);413 void mrb_regexp_check(mrb_state *mrb, mrb_value obj);414 458 415 459 /* For backward compatibility */ … … 418 462 #define mrb_str_buf_append(mrb, str, str2) mrb_str_cat_str(mrb, str, str2) 419 463 464 mrb_bool mrb_str_beg_len(mrb_int str_len, mrb_int *begp, mrb_int *lenp); 465 mrb_value mrb_str_byte_subseq(mrb_state *mrb, mrb_value str, mrb_int beg, mrb_int len); 466 467 #ifdef MRB_UTF8_STRING 468 mrb_int mrb_utf8len(const char *str, const char *end); 469 mrb_int mrb_utf8_strlen(const char *str, mrb_int byte_len); 470 #endif 471 420 472 MRB_END_DECL 421 473 -
EcnlProtoTool/trunk/mruby-2.1.1/include/mruby/throw.h
r331 r439 1 /* 2 ** mruby/throw.h - mruby exception throwing handler1 /** 2 ** @file mruby/throw.h - mruby exception throwing handler 3 3 ** 4 4 ** See Copyright Notice in mruby.h … … 16 16 #if defined(MRB_ENABLE_CXX_EXCEPTION) && defined(__cplusplus) 17 17 18 #define MRB_TRY(buf) do {try {18 #define MRB_TRY(buf) try { 19 19 #define MRB_CATCH(buf) } catch(mrb_jmpbuf_impl e) { if (e != (buf)->impl) { throw e; } 20 #define MRB_END_EXC(buf) } } while(0)20 #define MRB_END_EXC(buf) } 21 21 22 22 #define MRB_THROW(buf) throw((buf)->impl) … … 35 35 #endif 36 36 37 #define MRB_TRY(buf) do {if (MRB_SETJMP((buf)->impl) == 0) {37 #define MRB_TRY(buf) if (MRB_SETJMP((buf)->impl) == 0) { 38 38 #define MRB_CATCH(buf) } else { 39 #define MRB_END_EXC(buf) } } while(0)39 #define MRB_END_EXC(buf) } 40 40 41 41 #define MRB_THROW(buf) MRB_LONGJMP((buf)->impl, 1); -
EcnlProtoTool/trunk/mruby-2.1.1/include/mruby/value.h
r331 r439 1 /* 2 ** mruby/value.h - mruby value definitions1 /** 2 ** @file mruby/value.h - mruby value definitions 3 3 ** 4 4 ** See Copyright Notice in mruby.h … … 10 10 #include "common.h" 11 11 12 /* *12 /* 13 13 * MRuby Value definition functions and macros. 14 14 */ 15 15 MRB_BEGIN_DECL 16 16 17 /** 18 * mruby Symbol. 19 * @class mrb_sym 20 * 21 * You can create an mrb_sym by simply using mrb_str_intern() or mrb_intern_cstr() 22 */ 17 23 typedef uint32_t mrb_sym; 24 25 /** 26 * mruby Boolean. 27 * @class mrb_bool 28 * 29 * 30 * Used internally to represent boolean. Can be TRUE or FALSE. 31 * Not to be confused with Ruby's boolean classes, which can be 32 * obtained using mrb_false_value() and mrb_true_value() 33 */ 18 34 typedef uint8_t mrb_bool; 19 35 struct mrb_state; 20 21 #if defined(MRB_INT16) && defined(MRB_INT64)22 # error "You can't define MRB_INT16 and MRB_INT64 at the same time."23 #endif24 36 25 37 #if defined _MSC_VER && _MSC_VER < 1800 26 38 # define PRIo64 "llo" 27 39 # define PRId64 "lld" 40 # define PRIu64 "llu" 28 41 # define PRIx64 "llx" 29 42 # define PRIo16 "ho" 30 43 # define PRId16 "hd" 44 # define PRIu16 "hu" 31 45 # define PRIx16 "hx" 32 46 # define PRIo32 "o" 33 47 # define PRId32 "d" 48 # define PRIu32 "u" 34 49 # define PRIx32 "x" 35 50 #else … … 45 60 # define MRB_PRId PRId64 46 61 # define MRB_PRIx PRIx64 47 #elif defined(MRB_INT16)48 typedef int16_t mrb_int;49 # define MRB_INT_BIT 1650 # define MRB_INT_MIN (INT16_MIN>>MRB_FIXNUM_SHIFT)51 # define MRB_INT_MAX (INT16_MAX>>MRB_FIXNUM_SHIFT)52 # define MRB_PRIo PRIo1653 # define MRB_PRId PRId1654 # define MRB_PRIx PRIx1655 62 #else 56 63 typedef int32_t mrb_int; … … 63 70 #endif 64 71 65 72 #ifdef MRB_ENDIAN_BIG 73 # define MRB_ENDIAN_LOHI(a,b) a b 74 #else 75 # define MRB_ENDIAN_LOHI(a,b) b a 76 #endif 77 78 #ifndef MRB_WITHOUT_FLOAT 66 79 MRB_API double mrb_float_read(const char*, char**); 67 80 #ifdef MRB_USE_FLOAT … … 70 83 typedef double mrb_float; 71 84 #endif 85 #endif 72 86 73 87 #if defined _MSC_VER && _MSC_VER < 1900 74 # ifndef __cplusplus75 # define inline __inline76 # endif77 88 # include <stdarg.h> 78 89 MRB_API int mrb_msvc_vsnprintf(char *s, size_t n, const char *format, va_list arg); … … 80 91 # define vsnprintf(s, n, format, arg) mrb_msvc_vsnprintf(s, n, format, arg) 81 92 # define snprintf(s, n, format, ...) mrb_msvc_snprintf(s, n, format, __VA_ARGS__) 82 # if _MSC_VER < 1800 93 # if _MSC_VER < 1800 && !defined MRB_WITHOUT_FLOAT 83 94 # include <float.h> 84 95 # define isfinite(n) _finite(n) … … 94 105 enum mrb_vtype { 95 106 MRB_TT_FALSE = 0, /* 0 */ 96 MRB_TT_ FREE, /* 1 */97 MRB_TT_ TRUE,/* 2 */107 MRB_TT_TRUE, /* 1 */ 108 MRB_TT_FLOAT, /* 2 */ 98 109 MRB_TT_FIXNUM, /* 3 */ 99 110 MRB_TT_SYMBOL, /* 4 */ 100 111 MRB_TT_UNDEF, /* 5 */ 101 MRB_TT_ FLOAT,/* 6 */102 MRB_TT_ CPTR, /* 7 */112 MRB_TT_CPTR, /* 6 */ 113 MRB_TT_FREE, /* 7 */ 103 114 MRB_TT_OBJECT, /* 8 */ 104 115 MRB_TT_CLASS, /* 9 */ … … 147 158 #endif 148 159 160 #define MRB_SYMBOL_BIT (sizeof(mrb_sym) * CHAR_BIT - MRB_SYMBOL_SHIFT) 161 #define MRB_SYMBOL_MAX (UINT32_MAX >> MRB_SYMBOL_SHIFT) 162 163 #if INTPTR_MAX < MRB_INT_MAX 164 typedef intptr_t mrb_ssize; 165 # define MRB_SSIZE_MAX (INTPTR_MAX>>MRB_FIXNUM_SHIFT) 166 #else 167 typedef mrb_int mrb_ssize; 168 # define MRB_SSIZE_MAX MRB_INT_MAX 169 #endif 170 171 #ifndef mrb_immediate_p 172 #define mrb_immediate_p(o) (mrb_type(o) < MRB_TT_FREE) 173 #endif 149 174 #ifndef mrb_fixnum_p 150 175 #define mrb_fixnum_p(o) (mrb_type(o) == MRB_TT_FIXNUM) 151 176 #endif 177 #ifndef mrb_symbol_p 178 #define mrb_symbol_p(o) (mrb_type(o) == MRB_TT_SYMBOL) 179 #endif 152 180 #ifndef mrb_undef_p 153 181 #define mrb_undef_p(o) (mrb_type(o) == MRB_TT_UNDEF) … … 156 184 #define mrb_nil_p(o) (mrb_type(o) == MRB_TT_FALSE && !mrb_fixnum(o)) 157 185 #endif 186 #ifndef mrb_false_p 187 #define mrb_false_p(o) (mrb_type(o) == MRB_TT_FALSE && !!mrb_fixnum(o)) 188 #endif 189 #ifndef mrb_true_p 190 #define mrb_true_p(o) (mrb_type(o) == MRB_TT_TRUE) 191 #endif 192 #ifndef MRB_WITHOUT_FLOAT 193 #ifndef mrb_float_p 194 #define mrb_float_p(o) (mrb_type(o) == MRB_TT_FLOAT) 195 #endif 196 #endif 197 #ifndef mrb_array_p 198 #define mrb_array_p(o) (mrb_type(o) == MRB_TT_ARRAY) 199 #endif 200 #ifndef mrb_string_p 201 #define mrb_string_p(o) (mrb_type(o) == MRB_TT_STRING) 202 #endif 203 #ifndef mrb_hash_p 204 #define mrb_hash_p(o) (mrb_type(o) == MRB_TT_HASH) 205 #endif 206 #ifndef mrb_cptr_p 207 #define mrb_cptr_p(o) (mrb_type(o) == MRB_TT_CPTR) 208 #endif 209 #ifndef mrb_exception_p 210 #define mrb_exception_p(o) (mrb_type(o) == MRB_TT_EXCEPTION) 211 #endif 212 #ifndef mrb_free_p 213 #define mrb_free_p(o) (mrb_type(o) == MRB_TT_FREE) 214 #endif 215 #ifndef mrb_object_p 216 #define mrb_object_p(o) (mrb_type(o) == MRB_TT_OBJECT) 217 #endif 218 #ifndef mrb_class_p 219 #define mrb_class_p(o) (mrb_type(o) == MRB_TT_CLASS) 220 #endif 221 #ifndef mrb_module_p 222 #define mrb_module_p(o) (mrb_type(o) == MRB_TT_MODULE) 223 #endif 224 #ifndef mrb_iclass_p 225 #define mrb_iclass_p(o) (mrb_type(o) == MRB_TT_ICLASS) 226 #endif 227 #ifndef mrb_sclass_p 228 #define mrb_sclass_p(o) (mrb_type(o) == MRB_TT_SCLASS) 229 #endif 230 #ifndef mrb_proc_p 231 #define mrb_proc_p(o) (mrb_type(o) == MRB_TT_PROC) 232 #endif 233 #ifndef mrb_range_p 234 #define mrb_range_p(o) (mrb_type(o) == MRB_TT_RANGE) 235 #endif 236 #ifndef mrb_file_p 237 #define mrb_file_p(o) (mrb_type(o) == MRB_TT_FILE) 238 #endif 239 #ifndef mrb_env_p 240 #define mrb_env_p(o) (mrb_type(o) == MRB_TT_ENV) 241 #endif 242 #ifndef mrb_data_p 243 #define mrb_data_p(o) (mrb_type(o) == MRB_TT_DATA) 244 #endif 245 #ifndef mrb_fiber_p 246 #define mrb_fiber_p(o) (mrb_type(o) == MRB_TT_FIBER) 247 #endif 248 #ifndef mrb_istruct_p 249 #define mrb_istruct_p(o) (mrb_type(o) == MRB_TT_ISTRUCT) 250 #endif 251 #ifndef mrb_break_p 252 #define mrb_break_p(o) (mrb_type(o) == MRB_TT_BREAK) 253 #endif 158 254 #ifndef mrb_bool 159 255 #define mrb_bool(o) (mrb_type(o) != MRB_TT_FALSE) 160 256 #endif 161 #define mrb_float_p(o) (mrb_type(o) == MRB_TT_FLOAT)162 #define mrb_symbol_p(o) (mrb_type(o) == MRB_TT_SYMBOL)163 #define mrb_array_p(o) (mrb_type(o) == MRB_TT_ARRAY)164 #define mrb_string_p(o) (mrb_type(o) == MRB_TT_STRING)165 #define mrb_hash_p(o) (mrb_type(o) == MRB_TT_HASH)166 #define mrb_cptr_p(o) (mrb_type(o) == MRB_TT_CPTR)167 #define mrb_exception_p(o) (mrb_type(o) == MRB_TT_EXCEPTION)168 257 #define mrb_test(o) mrb_bool(o) 169 MRB_API mrb_bool mrb_regexp_p(struct mrb_state*, mrb_value); 170 171 /* 258 259 /** 172 260 * Returns a float in Ruby. 173 */ 261 * 262 * Takes a float and boxes it into an mrb_value 263 */ 264 #ifndef MRB_WITHOUT_FLOAT 174 265 MRB_INLINE mrb_value mrb_float_value(struct mrb_state *mrb, mrb_float f) 175 266 { … … 179 270 return v; 180 271 } 181 182 static inline mrb_value 272 #endif 273 274 MRB_INLINE mrb_value 183 275 mrb_cptr_value(struct mrb_state *mrb, void *p) 184 276 { … … 189 281 } 190 282 191 /* 283 /** 192 284 * Returns a fixnum in Ruby. 285 * 286 * Takes an integer and boxes it into an mrb_value 193 287 */ 194 288 MRB_INLINE mrb_value mrb_fixnum_value(mrb_int i) … … 199 293 } 200 294 201 static inlinemrb_value295 MRB_INLINE mrb_value 202 296 mrb_symbol_value(mrb_sym i) 203 297 { … … 207 301 } 208 302 209 static inlinemrb_value303 MRB_INLINE mrb_value 210 304 mrb_obj_value(void *p) 211 305 { … … 217 311 } 218 312 219 220 /* 313 /** 221 314 * Get a nil mrb_value object. 222 315 * … … 231 324 } 232 325 233 /* 326 /** 234 327 * Returns false in Ruby. 235 328 */ … … 241 334 } 242 335 243 /* 336 /** 244 337 * Returns true in Ruby. 245 338 */ … … 251 344 } 252 345 253 static inlinemrb_value346 MRB_INLINE mrb_value 254 347 mrb_bool_value(mrb_bool boolean) 255 348 { … … 259 352 } 260 353 261 static inlinemrb_value354 MRB_INLINE mrb_value 262 355 mrb_undef_value(void) 263 356 { … … 267 360 } 268 361 269 #ifdef MRB_USE_ETEXT_EDATA 270 #if (defined(__APPLE__) && defined(__MACH__)) 271 #include <mach-o/getsect.h> 362 #if defined(MRB_USE_ETEXT_EDATA) && !defined(MRB_USE_LINK_TIME_RO_DATA_P) 363 # ifdef __GNUC__ 364 # warning MRB_USE_ETEXT_EDATA is deprecated. Define MRB_USE_LINK_TIME_RO_DATA_P instead. 365 # endif 366 # define MRB_USE_LINK_TIME_RO_DATA_P 367 #endif 368 369 #if defined(MRB_USE_CUSTOM_RO_DATA_P) 370 /* If you define `MRB_USE_CUSTOM_RO_DATA_P`, you must implement `mrb_ro_data_p()`. */ 371 mrb_bool mrb_ro_data_p(const char *p); 372 #elif defined(MRB_USE_LINK_TIME_RO_DATA_P) 373 extern char __ehdr_start[]; 374 extern char __init_array_start[]; 375 272 376 static inline mrb_bool 273 377 mrb_ro_data_p(const char *p) 274 378 { 275 return (const char*)get_etext() < p && p < (const char*)get_edata(); 276 } 277 #else 278 extern char _etext[]; 279 #ifdef MRB_NO_INIT_ARRAY_START 280 extern char _edata[]; 281 282 static inline mrb_bool 283 mrb_ro_data_p(const char *p) 284 { 285 return _etext < p && p < _edata; 286 } 287 #else 288 extern char __init_array_start[]; 289 290 static inline mrb_bool 291 mrb_ro_data_p(const char *p) 292 { 293 return _etext < p && p < (char*)&__init_array_start; 294 } 295 #endif 296 #endif 379 return __ehdr_start < p && p < __init_array_start; 380 } 297 381 #else 298 382 # define mrb_ro_data_p(p) FALSE -
EcnlProtoTool/trunk/mruby-2.1.1/include/mruby/variable.h
r331 r439 1 /* 2 ** mruby/variable.h - mruby variables1 /** 2 ** @file mruby/variable.h - mruby variables 3 3 ** 4 4 ** See Copyright Notice in mruby.h … … 32 32 mrb_value mrb_vm_special_get(mrb_state*, mrb_sym); 33 33 void mrb_vm_special_set(mrb_state*, mrb_sym, mrb_value); 34 mrb_value mrb_vm_iv_get(mrb_state*, mrb_sym);35 void mrb_vm_iv_set(mrb_state*, mrb_sym, mrb_value);36 34 mrb_value mrb_vm_cv_get(mrb_state*, mrb_sym); 37 35 void mrb_vm_cv_set(mrb_state*, mrb_sym, mrb_value); … … 43 41 MRB_API void mrb_const_remove(mrb_state*, mrb_value, mrb_sym); 44 42 45 MRB_API mrb_bool mrb_iv_ p(mrb_state *mrb, mrb_sym sym);46 MRB_API void mrb_iv_ check(mrb_state *mrb, mrb_sym sym);43 MRB_API mrb_bool mrb_iv_name_sym_p(mrb_state *mrb, mrb_sym sym); 44 MRB_API void mrb_iv_name_sym_check(mrb_state *mrb, mrb_sym sym); 47 45 MRB_API mrb_value mrb_obj_iv_get(mrb_state *mrb, struct RObject *obj, mrb_sym sym); 48 46 MRB_API void mrb_obj_iv_set(mrb_state *mrb, struct RObject *obj, mrb_sym sym, mrb_value v); 49 47 MRB_API mrb_bool mrb_obj_iv_defined(mrb_state *mrb, struct RObject *obj, mrb_sym sym); 50 MRB_API void mrb_obj_iv_ifnone(mrb_state *mrb, struct RObject *obj, mrb_sym sym, mrb_value v);51 48 MRB_API mrb_value mrb_iv_get(mrb_state *mrb, mrb_value obj, mrb_sym sym); 52 49 MRB_API void mrb_iv_set(mrb_state *mrb, mrb_value obj, mrb_sym sym, mrb_value v); … … 101 98 * Example: 102 99 * 103 * !!!ruby104 100 * # Ruby style 105 101 * $value = nil 106 102 * 107 * !!!c108 103 * // C style 109 104 * mrb_sym sym = mrb_intern_lit(mrb, "$value"); … … 112 107 * @param mrb The mruby state reference 113 108 * @param sym The name of the global variable 114 * @param val The value of the global variable115 109 */ 116 110 MRB_API void mrb_gv_remove(mrb_state *mrb, mrb_sym sym); … … 121 115 MRB_API mrb_bool mrb_cv_defined(mrb_state *mrb, mrb_value mod, mrb_sym sym); 122 116 mrb_value mrb_obj_iv_inspect(mrb_state*, struct RObject*); 117 void mrb_obj_iv_set_force(mrb_state *mrb, struct RObject *obj, mrb_sym sym, mrb_value v); 123 118 mrb_value mrb_mod_constants(mrb_state *mrb, mrb_value mod); 124 119 mrb_value mrb_f_global_variables(mrb_state *mrb, mrb_value self); … … 127 122 mrb_value mrb_mod_cv_get(mrb_state *mrb, struct RClass * c, mrb_sym sym); 128 123 mrb_bool mrb_mod_cv_defined(mrb_state *mrb, struct RClass * c, mrb_sym sym); 129 mrb_ sym mrb_class_sym(mrb_state *mrb, struct RClass *c, struct RClass *outer);124 mrb_bool mrb_ident_p(const char *s, mrb_int len); 130 125 131 126 /* GC functions */ … … 136 131 void mrb_gc_free_iv(mrb_state*, struct RObject*); 137 132 133 /* return non zero to break the loop */ 134 typedef int (mrb_iv_foreach_func)(mrb_state*,mrb_sym,mrb_value,void*); 135 MRB_API void mrb_iv_foreach(mrb_state *mrb, mrb_value obj, mrb_iv_foreach_func *func, void *p); 136 138 137 MRB_END_DECL 139 138 -
EcnlProtoTool/trunk/mruby-2.1.1/include/mruby/version.h
r331 r439 1 /* 2 ** mruby/version.h - mruby version definition1 /** 2 ** @file mruby/version.h - mruby version definition 3 3 ** 4 4 ** See Copyright Notice in mruby.h … … 28 28 * The version of Ruby used by mruby. 29 29 */ 30 #define MRUBY_RUBY_VERSION " 1.9"30 #define MRUBY_RUBY_VERSION "2.0" 31 31 32 32 /* … … 38 38 * Major release version number. 39 39 */ 40 #define MRUBY_RELEASE_MAJOR 140 #define MRUBY_RELEASE_MAJOR 2 41 41 42 42 /* 43 43 * Minor release version number. 44 44 */ 45 #define MRUBY_RELEASE_MINOR 345 #define MRUBY_RELEASE_MINOR 1 46 46 47 47 /* 48 48 * Tiny release version number. 49 49 */ 50 #define MRUBY_RELEASE_TEENY 050 #define MRUBY_RELEASE_TEENY 1 51 51 52 52 /* … … 63 63 * Release year. 64 64 */ 65 #define MRUBY_RELEASE_YEAR 20 1765 #define MRUBY_RELEASE_YEAR 2020 66 66 67 67 /* 68 68 * Release month. 69 69 */ 70 #define MRUBY_RELEASE_MONTH 770 #define MRUBY_RELEASE_MONTH 6 71 71 72 72 /* … … 78 78 * Release date as a string. 79 79 */ 80 #define MRUBY_RELEASE_DATE MRB_STRINGIZE(MRUBY_RELEASE_YEAR) "-" MRB_STRINGIZE(MRUBY_RELEASE_MONTH) "-" MRB_STRINGIZE(MRUBY_RELEASE_DAY) 80 #define MRUBY_RELEASE_DATE \ 81 MRUBY_RELEASE_YEAR_STR "-" \ 82 MRUBY_RELEASE_MONTH_STR "-" \ 83 MRUBY_RELEASE_DAY_STR 84 #define MRUBY_RELEASE_YEAR_STR MRB_STRINGIZE(MRUBY_RELEASE_YEAR) 85 #if MRUBY_RELEASE_MONTH < 10 86 #define MRUBY_RELEASE_MONTH_STR "0" MRB_STRINGIZE(MRUBY_RELEASE_MONTH) 87 #else 88 #define MRUBY_RELEASE_MONTH_STR MRB_STRINGIZE(MRUBY_RELEASE_MONTH) 89 #endif 90 #if MRUBY_RELEASE_DAY < 10 91 #define MRUBY_RELEASE_DAY_STR "0" MRB_STRINGIZE(MRUBY_RELEASE_DAY) 92 #else 93 #define MRUBY_RELEASE_DAY_STR MRB_STRINGIZE(MRUBY_RELEASE_DAY) 94 #endif 81 95 82 96 /* … … 93 107 * mruby's version, and release date. 94 108 */ 95 #define MRUBY_DESCRIPTION 96 "mruby " MRUBY_VERSION 97 " (" MRUBY_RELEASE_DATE ") 109 #define MRUBY_DESCRIPTION \ 110 "mruby " MRUBY_VERSION \ 111 " (" MRUBY_RELEASE_DATE ")" \ 98 112 99 113 /* -
EcnlProtoTool/trunk/mruby-2.1.1/lib/mruby/source.rb
r321 r439 7 7 8 8 # Reads a constant defined at version.h 9 MRUBY_READ_VERSION_CONSTANT = Proc.new { |name| ROOT.join('include','mruby','version.h').read.match(/^#define #{name} +"?([\w\. ]+)"?$/)[1] } 9 MRUBY_READ_VERSION_CONSTANT = Proc.new do |name| 10 ROOT.join('include','mruby','version.h').read.match(/^#define #{name} +"?([\w\. ]+)"?\r?$/)[1] 11 end 10 12 11 13 MRUBY_RUBY_VERSION = MRUBY_READ_VERSION_CONSTANT['MRUBY_RUBY_VERSION'] -
EcnlProtoTool/trunk/mruby-2.1.1/minirake
r331 r439 1 #!/usr/bin/env ruby 2 3 # Original is https://github.com/jimweirich/rake/ 4 # Copyright (c) 2003 Jim Weirich 5 # License: MIT-LICENSE 6 7 require 'getoptlong' 8 require 'fileutils' 9 10 class String 11 def ext(newext='') 12 return self.dup if ['.', '..'].include? self 13 if newext != '' 14 newext = (newext =~ /^\./) ? newext : ("." + newext) 15 end 16 self.chomp(File.extname(self)) << newext 17 end 18 19 def pathmap(spec=nil, &block) 20 return self if spec.nil? 21 result = '' 22 spec.scan(/%\{[^}]*\}-?\d*[sdpfnxX%]|%-?\d+d|%.|[^%]+/) do |frag| 23 case frag 24 when '%f' 25 result << File.basename(self) 26 when '%n' 27 result << File.basename(self).ext 28 when '%d' 29 result << File.dirname(self) 30 when '%x' 31 result << File.extname(self) 32 when '%X' 33 result << self.ext 34 when '%p' 35 result << self 36 when '%s' 37 result << (File::ALT_SEPARATOR || File::SEPARATOR) 38 when '%-' 39 # do nothing 40 when '%%' 41 result << "%" 42 when /%(-?\d+)d/ 43 result << pathmap_partial($1.to_i) 44 when /^%\{([^}]*)\}(\d*[dpfnxX])/ 45 patterns, operator = $1, $2 46 result << pathmap('%' + operator).pathmap_replace(patterns, &block) 47 when /^%/ 48 fail ArgumentError, "Unknown pathmap specifier #{frag} in '#{spec}'" 49 else 50 result << frag 51 end 52 end 53 result 54 end 55 end 56 57 module MiniRake 58 class Task 59 TASKS = Hash.new 60 RULES = Array.new 61 62 # List of prerequisites for a task. 63 attr_reader :prerequisites 64 65 # Source dependency for rule synthesized tasks. Nil if task was not 66 # sythesized from a rule. 67 attr_accessor :source 68 69 # Create a task named +task_name+ with no actions or prerequisites.. 70 # use +enhance+ to add actions and prerequisites. 71 def initialize(task_name) 72 @name = task_name 73 @prerequisites = [] 74 @actions = [] 75 end 76 77 # Enhance a task with prerequisites or actions. Returns self. 78 def enhance(deps=nil, &block) 79 @prerequisites |= deps if deps 80 @actions << block if block_given? 81 self 82 end 83 84 # Name of the task. 85 def name 86 @name.to_s 87 end 88 89 # Invoke the task if it is needed. Prerequites are invoked first. 90 def invoke 91 puts "Invoke #{name} (already=[#{@already_invoked}], needed=[#{needed?}])" if $trace 92 return if @already_invoked 93 @already_invoked = true 94 prerequisites = @prerequisites.collect{ |n| n.is_a?(Proc) ? n.call(name) : n }.flatten 95 prerequisites.each { |n| Task[n].invoke } 96 execute if needed? 97 end 98 99 # Execute the actions associated with this task. 100 def execute 101 puts "Execute #{name}" if $trace 102 self.class.enhance_with_matching_rule(name) if @actions.empty? 103 unless $dryrun 104 @actions.each { |act| act.call(self) } 105 end 106 end 107 108 # Is this task needed? 109 def needed? 110 true 111 end 112 113 # Timestamp for this task. Basic tasks return the current time for 114 # their time stamp. Other tasks can be more sophisticated. 115 def timestamp 116 Time.now 117 end 118 119 # Class Methods ---------------------------------------------------- 120 121 class << self 122 123 # Clear the task list. This cause rake to immediately forget all 124 # the tasks that have been assigned. (Normally used in the unit 125 # tests.) 126 def clear 127 TASKS.clear 128 RULES.clear 129 end 130 131 # List of all defined tasks. 132 def tasks 133 TASKS.keys.sort.collect { |tn| Task[tn] } 134 end 135 136 # Return a task with the given name. If the task is not currently 137 # known, try to synthesize one from the defined rules. If no 138 # rules are found, but an existing file matches the task name, 139 # assume it is a file task with no dependencies or actions. 140 def [](task_name) 141 task_name = task_name.to_s 142 if task_name.end_with?(":") 143 task_name = task_name.slice(0, task_name.length - 1) 144 end 145 if task = TASKS[task_name] 146 return task 147 end 148 if task = enhance_with_matching_rule(task_name) 149 return task 150 end 151 if File.exist?(task_name) 152 return FileTask.define_task(task_name) 153 end 154 fail "Don't know how to rake #{task_name}" 155 end 156 157 # Define a task given +args+ and an option block. If a rule with 158 # the given name already exists, the prerequisites and actions are 159 # added to the existing task. 160 def define_task(args, &block) 161 task_name, deps = resolve_args(args) 162 lookup(task_name).enhance([deps].flatten, &block) 163 end 164 165 # Define a rule for synthesizing tasks. 166 def create_rule(args, &block) 167 pattern, deps = resolve_args(args) 168 pattern = Regexp.new(Regexp.quote(pattern) + '$') if String === pattern 169 RULES << [pattern, deps, block] 170 end 171 172 173 # Lookup a task. Return an existing task if found, otherwise 174 # create a task of the current type. 175 def lookup(task_name) 176 name = task_name.to_s 177 TASKS[name] ||= self.new(name) 178 end 179 180 # If a rule can be found that matches the task name, enhance the 181 # task with the prerequisites and actions from the rule. Set the 182 # source attribute of the task appropriately for the rule. Return 183 # the enhanced task or nil of no rule was found. 184 def enhance_with_matching_rule(task_name) 185 RULES.each do |pattern, extensions, block| 186 if pattern.match(task_name) 187 ext = extensions.first 188 deps = extensions[1..-1] 189 case ext 190 when String 191 source = task_name.sub(/\.[^.]*$/, ext) 192 when Proc 193 source = ext.call(task_name) 194 else 195 fail "Don't know how to handle rule dependent: #{ext.inspect}" 196 end 197 if File.exist?(source) 198 task = FileTask.define_task({task_name => [source]+deps}, &block) 199 task.source = source 200 return task 201 end 202 end 203 end 204 nil 205 end 206 207 private 208 209 # Resolve the arguments for a task/rule. 210 def resolve_args(args) 211 case args 212 when Hash 213 fail "Too Many Task Names: #{args.keys.join(' ')}" if args.size > 1 214 fail "No Task Name Given" if args.size < 1 215 task_name = args.keys[0] 216 deps = args[task_name] 217 deps = [deps] if (String===deps) || (Regexp===deps) || (Proc===deps) 218 else 219 task_name = args 220 deps = [] 221 end 222 [task_name, deps] 223 end 224 end 225 end 226 227 228 ###################################################################### 229 class FileTask < Task 230 # Is this file task needed? Yes if it doesn't exist, or if its time 231 # stamp is out of date. 232 def needed? 233 return true unless File.exist?(name) 234 prerequisites = @prerequisites.collect{ |n| n.is_a?(Proc) ? n.call(name) : n }.flatten 235 latest_prereq = prerequisites.collect{|n| Task[n].timestamp}.max 236 return false if latest_prereq.nil? 237 timestamp < latest_prereq 238 end 239 240 # Time stamp for file task. 241 def timestamp 242 return Time.at(0) unless File.exist?(name) 243 stat = File::stat(name.to_s) 244 stat.directory? ? Time.at(0) : stat.mtime 245 end 246 end 247 248 module DSL 249 # Declare a basic task. 250 def task(args, &block) 251 MiniRake::Task.define_task(args, &block) 252 end 253 254 # Declare a file task. 255 def file(args, &block) 256 MiniRake::FileTask.define_task(args, &block) 257 end 258 259 # Declare a set of files tasks to create the given directories on 260 # demand. 261 def directory(args, &block) 262 MiniRake::FileTask.define_task(args) do |t| 263 block.call(t) unless block.nil? 264 dir = args.is_a?(Hash) ? args.keys.first : args 265 (dir.split(File::SEPARATOR) + ['']).inject do |acc, part| 266 (acc + File::SEPARATOR).tap do |d| 267 Dir.mkdir(d) unless File.exists? d 268 end + part 269 end 270 end 271 end 272 273 # Declare a rule for auto-tasks. 274 def rule(args, &block) 275 MiniRake::Task.create_rule(args, &block) 276 end 277 278 # Write a message to standard out if $verbose is enabled. 279 def log(msg) 280 print " " if $trace && $verbose 281 puts msg if $verbose 282 end 283 284 # Run the system command +cmd+. 285 def sh(cmd) 286 puts cmd if $verbose 287 system(cmd) or fail "Command Failed: [#{cmd}]" 288 end 289 290 def desc(text) 291 end 292 end 293 end 294 295 Rake = MiniRake 296 extend MiniRake::DSL 297 298 299 ###################################################################### 300 # Task Definition Functions ... 301 302 ###################################################################### 303 # Rake main application object. When invoking +rake+ from the command 304 # line, a RakeApp object is created and run. 305 # 306 class RakeApp 307 RAKEFILES = ['rakefile', 'Rakefile'] 308 309 OPTIONS = [ 310 ['--dry-run', '-n', GetoptLong::NO_ARGUMENT, 311 "Do a dry run without executing actions."], 312 ['--help', '-H', GetoptLong::NO_ARGUMENT, 313 "Display this help message."], 314 ['--libdir', '-I', GetoptLong::REQUIRED_ARGUMENT, 315 "Include LIBDIR in the search path for required modules."], 316 ['--nosearch', '-N', GetoptLong::NO_ARGUMENT, 317 "Do not search parent directories for the Rakefile."], 318 ['--quiet', '-q', GetoptLong::NO_ARGUMENT, 319 "Do not log messages to standard output (default)."], 320 ['--rakefile', '-f', GetoptLong::REQUIRED_ARGUMENT, 321 "Use FILE as the rakefile."], 322 ['--require', '-r', GetoptLong::REQUIRED_ARGUMENT, 323 "Require MODULE before executing rakefile."], 324 ['--tasks', '-T', GetoptLong::NO_ARGUMENT, 325 "Display the tasks and dependencies, then exit."], 326 ['--pull-gems','-p', GetoptLong::NO_ARGUMENT, 327 "Pull all git mrbgems."], 328 ['--trace', '-t', GetoptLong::NO_ARGUMENT, 329 "Turn on invoke/execute tracing."], 330 ['--usage', '-h', GetoptLong::NO_ARGUMENT, 331 "Display usage."], 332 ['--verbose', '-v', GetoptLong::NO_ARGUMENT, 333 "Log message to standard output."], 334 ['--directory', '-C', GetoptLong::REQUIRED_ARGUMENT, 335 "Change executing directory of rakefiles."] 336 ] 337 338 # Create a RakeApp object. 339 def initialize 340 @rakefile = nil 341 @nosearch = false 342 end 343 344 # True if one of the files in RAKEFILES is in the current directory. 345 # If a match is found, it is copied into @rakefile. 346 def have_rakefile 347 RAKEFILES.each do |fn| 348 if File.exist?(fn) 349 @rakefile = fn 350 return true 351 end 352 end 353 return false 354 end 355 356 # Display the program usage line. 357 def usage 358 puts "rake [-f rakefile] {options} targets..." 359 end 360 361 # Display the rake command line help. 362 def help 363 usage 364 puts 365 puts "Options are ..." 366 puts 367 OPTIONS.sort.each do |long, short, mode, desc| 368 if mode == GetoptLong::REQUIRED_ARGUMENT 369 if desc =~ /\b([A-Z]{2,})\b/ 370 long = long + "=#{$1}" 371 end 372 end 373 printf " %-20s (%s)\n", long, short 374 printf " %s\n", desc 375 end 376 end 377 378 # Display the tasks and dependencies. 379 def display_tasks 380 MiniRake::Task.tasks.each do |t| 381 puts "#{t.class} #{t.name}" 382 t.prerequisites.each { |pre| puts " #{pre}" } 383 end 384 end 385 386 # Return a list of the command line options supported by the 387 # program. 388 def command_line_options 389 OPTIONS.collect { |lst| lst[0..-2] } 390 end 391 392 # Do the option defined by +opt+ and +value+. 393 def do_option(opt, value) 394 case opt 395 when '--dry-run' 396 $dryrun = true 397 $trace = true 398 when '--help' 399 help 400 exit 401 when '--libdir' 402 $:.push(value) 403 when '--nosearch' 404 @nosearch = true 405 when '--quiet' 406 $verbose = false 407 when '--rakefile' 408 RAKEFILES.clear 409 RAKEFILES << value 410 when '--require' 411 require value 412 when '--tasks' 413 $show_tasks = true 414 when '--pull-gems' 415 $pull_gems = true 416 when '--trace' 417 $trace = true 418 when '--usage' 419 usage 420 exit 421 when '--verbose' 422 $verbose = true 423 when '--version' 424 puts "rake, version #{RAKEVERSION}" 425 exit 426 when '--directory' 427 Dir.chdir value 428 else 429 fail "Unknown option: #{opt}" 430 end 431 end 432 433 # Read and handle the command line options. 434 def handle_options 435 $verbose = false 436 $pull_gems = false 437 opts = GetoptLong.new(*command_line_options) 438 opts.each { |opt, value| do_option(opt, value) } 439 end 440 441 # Run the +rake+ application. 442 def run 443 handle_options 444 begin 445 here = Dir.pwd 446 while ! have_rakefile 447 Dir.chdir("..") 448 if Dir.pwd == here || @nosearch 449 fail "No Rakefile found (looking for: #{RAKEFILES.join(', ')})" 450 end 451 here = Dir.pwd 452 end 453 tasks = [] 454 ARGV.each do |task_name| 455 if /^(\w+)=(.*)/.match(task_name) 456 ENV[$1] = $2 457 else 458 tasks << task_name 459 end 460 end 461 puts "(in #{Dir.pwd})" 462 $rakefile = @rakefile 463 load @rakefile 464 if $show_tasks 465 display_tasks 466 else 467 tasks.push("default") if tasks.size == 0 468 tasks.each do |task_name| 469 MiniRake::Task[task_name].invoke 470 end 471 end 472 rescue Exception => ex 473 puts "rake aborted!" 474 puts ex.message 475 if $trace 476 puts ex.backtrace.join("\n") 477 else 478 puts ex.backtrace.find {|str| str =~ /#{@rakefile}/ } || "" 479 end 480 exit 1 481 end 482 end 483 end 484 485 if __FILE__ == $0 then 486 RakeApp.new.run 487 end 1 #! /usr/bin/env ruby 2 exec "rake", *ARGV -
EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/default.gembox
r331 r439 1 1 MRuby::GemBox.new do |conf| 2 # Meta-programming features 3 conf.gem :core => "mruby-metaprog" 4 5 # Use standard IO/File class 6 conf.gem :core => "mruby-io" 7 8 # Use standard Array#pack, String#unpack methods 9 conf.gem :core => "mruby-pack" 10 2 11 # Use standard Kernel#sprintf method 3 12 conf.gem :core => "mruby-sprintf" … … 14 23 # Use standard Struct class 15 24 conf.gem :core => "mruby-struct" 25 26 # Use Comparable module extension 27 conf.gem :core => "mruby-compar-ext" 16 28 17 29 # Use Enumerable module extension … … 75 87 conf.gem :core => "mruby-class-ext" 76 88 89 # Use Method/UnboundMethod class 90 conf.gem :core => "mruby-method" 91 77 92 # Use mruby-compiler to build other mrbgems 78 93 conf.gem :core => "mruby-compiler" -
EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-array-ext/mrblib/array.rb
r331 r439 1 1 class Array 2 ##3 # call-seq:4 # Array.try_convert(obj) -> array or nil5 #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") #=> nil12 #13 # if tmp = Array.try_convert(arg)14 # # the argument is an array15 # elsif tmp = String.try_convert(arg)16 # # the argument is a string17 # end18 #19 def self.try_convert(obj)20 if obj.respond_to?(:to_ary)21 obj.to_ary22 else23 nil24 end25 end26 27 2 ## 28 3 # call-seq: … … 42 17 # 43 18 def uniq!(&block) 44 ary = self.dup 45 result = [] 19 hash = {} 46 20 if block 21 self.each do |val| 22 key = block.call(val) 23 hash[key] = val unless hash.key?(key) 24 end 25 result = hash.values 26 else 47 27 hash = {} 48 while ary.size > 0 49 val = ary.shift 50 key = block.call(val) 51 hash[key] = val unless hash.has_key?(key) 52 end 53 hash.each_value do |value| 54 result << value 55 end 56 else 57 while ary.size > 0 58 result << ary.shift 59 ary.delete(result.last) 60 end 28 self.each do |val| 29 hash[val] = val 30 end 31 result = hash.keys 61 32 end 62 33 if result.size == self.size … … 82 53 def uniq(&block) 83 54 ary = self.dup 84 if block 85 ary.uniq!(&block) 86 else 87 ary.uniq! 88 end 55 ary.uniq!(&block) 89 56 ary 90 57 end … … 106 73 hash = {} 107 74 array = [] 108 elem.each { |x| hash[x] = true } 109 self.each { |x| array << x unless hash[x] } 75 idx = 0 76 len = elem.size 77 while idx < len 78 hash[elem[idx]] = true 79 idx += 1 80 end 81 idx = 0 82 len = size 83 while idx < len 84 v = self[idx] 85 array << v unless hash[v] 86 idx += 1 87 end 110 88 array 89 end 90 91 ## 92 # call-seq: 93 # ary.difference(other_ary1, other_ary2, ...) -> new_ary 94 # 95 # Returns a new array that is a copy of the original array, removing all 96 # occurrences of any item that also appear in +other_ary+. The order is 97 # preserved from the original array. 98 # 99 def difference(*args) 100 ary = self 101 args.each do |x| 102 ary = ary - x 103 end 104 ary 111 105 end 112 106 … … 130 124 ## 131 125 # call-seq: 126 # ary.union(other_ary,...) -> new_ary 127 # 128 # Set Union---Returns a new array by joining this array with 129 # <i>other_ary</i>, removing duplicates. 130 # 131 # ["a", "b", "c"].union(["c", "d", "a"], ["a", "c", "e"]) 132 # #=> ["a", "b", "c", "d", "e"] 133 # 134 def union(*args) 135 ary = self.dup 136 args.each do |x| 137 ary.concat(x) 138 ary.uniq! 139 end 140 ary 141 end 142 143 ## 144 # call-seq: 132 145 # ary & other_ary -> new_ary 133 146 # … … 142 155 hash = {} 143 156 array = [] 144 elem.each{|v| hash[v] = true } 145 self.each do |v| 157 idx = 0 158 len = elem.size 159 while idx < len 160 hash[elem[idx]] = true 161 idx += 1 162 end 163 idx = 0 164 len = size 165 while idx < len 166 v = self[idx] 146 167 if hash[v] 147 168 array << v 148 169 hash.delete v 149 170 end 171 idx += 1 150 172 end 151 173 array 174 end 175 176 ## 177 # call-seq: 178 # ary.intersection(other_ary,...) -> new_ary 179 # 180 # Set Intersection---Returns a new array containing elements common to 181 # this array and <i>other_ary</i>s, removing duplicates. The order is 182 # preserved from the original array. 183 # 184 # [1, 2, 3].intersection([3, 4, 1], [1, 3, 5]) #=> [1, 3] 185 # 186 def intersection(*args) 187 ary = self 188 args.each do |x| 189 ary = ary & x 190 end 191 ary 152 192 end 153 193 … … 170 210 # 171 211 def flatten(depth=nil) 172 ar = [] 173 self.each do |e| 174 if e.is_a?(Array) && (depth.nil? || depth > 0) 175 ar += e.flatten(depth.nil? ? nil : depth - 1) 176 else 177 ar << e 178 end 179 end 180 ar 212 res = dup 213 res.flatten! depth 214 res 181 215 end 182 216 … … 201 235 modified = false 202 236 ar = [] 203 self.each do |e| 237 idx = 0 238 len = size 239 while idx < len 240 e = self[idx] 204 241 if e.is_a?(Array) && (depth.nil? || depth > 0) 205 242 ar += e.flatten(depth.nil? ? nil : depth - 1) … … 208 245 ar << e 209 246 end 247 idx += 1 210 248 end 211 249 if modified … … 253 291 # for efficiency 254 292 def reverse_each(&block) 255 return to_enum :reverse_each unless block _given?293 return to_enum :reverse_each unless block 256 294 257 295 i = self.size - 1 … … 263 301 end 264 302 265 NONE=Object.new266 303 ## 267 304 # call-seq: … … 288 325 # 289 326 290 def fetch(n =nil, ifnone=NONE, &block)327 def fetch(n, ifnone=NONE, &block) 291 328 warn "block supersedes default value argument" if !n.nil? && ifnone != NONE && block 292 329 … … 475 512 476 513 def delete_if(&block) 477 return to_enum :delete_if unless block _given?514 return to_enum :delete_if unless block 478 515 479 516 idx = 0 … … 504 541 505 542 def reject!(&block) 506 return to_enum :reject! unless block _given?543 return to_enum :reject! unless block 507 544 508 545 len = self.size … … 594 631 595 632 def bsearch(&block) 596 return to_enum :bsearch unless block_given? 633 return to_enum :bsearch unless block 634 635 if idx = bsearch_index(&block) 636 self[idx] 637 else 638 nil 639 end 640 end 641 642 ## 643 # call-seq: 644 # ary.bsearch_index {|x| block } -> int or nil 645 # 646 # By using binary search, finds an index of a value from this array which 647 # meets the given condition in O(log n) where n is the size of the array. 648 # 649 # It supports two modes, depending on the nature of the block and they are 650 # exactly the same as in the case of #bsearch method with the only difference 651 # being that this method returns the index of the element instead of the 652 # element itself. For more details consult the documentation for #bsearch. 653 654 def bsearch_index(&block) 655 return to_enum :bsearch_index unless block 597 656 598 657 low = 0 599 high = s elf.size658 high = size 600 659 satisfied = false 660 601 661 while low < high 602 mid = low + ((high - low) / 2).truncate 603 val = self[mid] 604 v = block.call(val) 605 if v.is_a?(Integer) 606 return val if v == 0 607 smaller = v < 0 608 elsif v == true 662 mid = ((low+high)/2).truncate 663 res = block.call self[mid] 664 665 case res 666 when 0 # find-any mode: Found! 667 return mid 668 when Numeric # find-any mode: Continue... 669 in_lower_half = res < 0 670 when true # find-min mode 671 in_lower_half = true 609 672 satisfied = true 610 smaller = true 611 elsif v == false || v.nil? 612 smaller = false 613 end 614 if smaller 673 when false, nil # find-min mode 674 in_lower_half = false 675 else 676 raise TypeError, 'invalid block result (must be numeric, true, false or nil)' 677 end 678 679 if in_lower_half 615 680 high = mid 616 681 else … … 618 683 end 619 684 end 620 return nil if low == self.size 621 return nil unless satisfied 622 self[low] 623 end 624 625 ## 626 # call-seq: 627 # ary.delete_if { |item| block } -> ary 628 # ary.delete_if -> Enumerator 629 # 630 # Deletes every element of +self+ for which block evaluates to +true+. 631 # 632 # The array is changed instantly every time the block is called, not after 633 # the iteration is over. 634 # 635 # See also Array#reject! 636 # 637 # If no block is given, an Enumerator is returned instead. 638 # 639 # scores = [ 97, 42, 75 ] 640 # scores.delete_if {|score| score < 80 } #=> [97] 641 642 def delete_if(&block) 643 return to_enum :delete_if unless block_given? 644 645 idx = 0 646 while idx < self.size do 647 if block.call(self[idx]) 648 self.delete_at(idx) 649 else 650 idx += 1 651 end 652 end 653 self 685 686 satisfied ? low : nil 654 687 end 655 688 … … 670 703 671 704 def keep_if(&block) 672 return to_enum :keep_if unless block _given?705 return to_enum :keep_if unless block 673 706 674 707 idx = 0 … … 699 732 700 733 def select!(&block) 701 return to_enum :select! unless block _given?734 return to_enum :select! unless block 702 735 703 736 result = [] 704 self.each do |x| 705 result << x if block.call(x) 706 end 707 return nil if self.size == result.size 737 idx = 0 738 len = size 739 while idx < len 740 elem = self[idx] 741 result << elem if block.call(elem) 742 idx += 1 743 end 744 return nil if len == result.size 708 745 self.replace(result) 709 746 end … … 727 764 if block 728 765 idx = 0 729 self.each do |*e| 730 return idx if block.call(*e) 766 len = size 767 while idx < len 768 return idx if block.call self[idx] 731 769 idx += 1 732 770 end … … 735 773 end 736 774 nil 737 end738 739 ##740 # call-seq:741 # ary.to_ary -> ary742 #743 # Returns +self+.744 #745 def to_ary746 self747 775 end 748 776 … … 763 791 end 764 792 end 793 794 ## 795 # call-seq: 796 # ary.permutation { |p| block } -> ary 797 # ary.permutation -> Enumerator 798 # ary.permutation(n) { |p| block } -> ary 799 # ary.permutation(n) -> Enumerator 800 # 801 # When invoked with a block, yield all permutations of length +n+ of the 802 # elements of the array, then return the array itself. 803 # 804 # If +n+ is not specified, yield all permutations of all elements. 805 # 806 # The implementation makes no guarantees about the order in which the 807 # permutations are yielded. 808 # 809 # If no block is given, an Enumerator is returned instead. 810 # 811 # Examples: 812 # 813 # a = [1, 2, 3] 814 # a.permutation.to_a #=> [[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]] 815 # a.permutation(1).to_a #=> [[1],[2],[3]] 816 # a.permutation(2).to_a #=> [[1,2],[1,3],[2,1],[2,3],[3,1],[3,2]] 817 # a.permutation(3).to_a #=> [[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]] 818 # a.permutation(0).to_a #=> [[]] # one permutation of length 0 819 # a.permutation(4).to_a #=> [] # no permutations of length 4 820 def permutation(n=self.size, &block) 821 return to_enum(:permutation, n) unless block 822 size = self.size 823 if n == 0 824 yield [] 825 elsif 0 < n && n <= size 826 i = 0 827 while i<size 828 result = [self[i]] 829 if n-1 > 0 830 ary = self[0...i] + self[i+1..-1] 831 ary.permutation(n-1) do |c| 832 yield result + c 833 end 834 else 835 yield result 836 end 837 i += 1 838 end 839 end 840 self 841 end 842 843 ## 844 # call-seq: 845 # ary.combination(n) { |c| block } -> ary 846 # ary.combination(n) -> Enumerator 847 # 848 # When invoked with a block, yields all combinations of length +n+ of elements 849 # from the array and then returns the array itself. 850 # 851 # The implementation makes no guarantees about the order in which the 852 # combinations are yielded. 853 # 854 # If no block is given, an Enumerator is returned instead. 855 # 856 # Examples: 857 # 858 # a = [1, 2, 3, 4] 859 # a.combination(1).to_a #=> [[1],[2],[3],[4]] 860 # a.combination(2).to_a #=> [[1,2],[1,3],[1,4],[2,3],[2,4],[3,4]] 861 # a.combination(3).to_a #=> [[1,2,3],[1,2,4],[1,3,4],[2,3,4]] 862 # a.combination(4).to_a #=> [[1,2,3,4]] 863 # a.combination(0).to_a #=> [[]] # one combination of length 0 864 # a.combination(5).to_a #=> [] # no combinations of length 5 865 866 def combination(n, &block) 867 return to_enum(:combination, n) unless block 868 size = self.size 869 if n == 0 870 yield [] 871 elsif n == 1 872 i = 0 873 while i<size 874 yield [self[i]] 875 i += 1 876 end 877 elsif n <= size 878 i = 0 879 while i<size 880 result = [self[i]] 881 self[i+1..-1].combination(n-1) do |c| 882 yield result + c 883 end 884 i += 1 885 end 886 end 887 self 888 end 889 890 ## 891 # call-seq: 892 # ary.transpose -> new_ary 893 # 894 # Assumes that self is an array of arrays and transposes the rows and columns. 895 # 896 # If the length of the subarrays don't match, an IndexError is raised. 897 # 898 # Examples: 899 # 900 # a = [[1,2], [3,4], [5,6]] 901 # a.transpose #=> [[1, 3, 5], [2, 4, 6]] 902 903 def transpose 904 return [] if empty? 905 906 column_count = nil 907 self.each do |row| 908 raise TypeError unless row.is_a?(Array) 909 column_count ||= row.size 910 raise IndexError, 'element size differs' unless column_count == row.size 911 end 912 913 Array.new(column_count) do |column_index| 914 self.map { |row| row[column_index] } 915 end 916 end 917 918 ## 919 # call-seq: 920 # ary.to_h -> Hash 921 # ary.to_h{|item| ... } -> Hash 922 # 923 # Returns the result of interpreting <i>aray</i> as an array of 924 # <tt>[key, value]</tt> pairs. If a block is given, it should 925 # return <tt>[key, value]</tt> pairs to construct a hash. 926 # 927 # [[:foo, :bar], [1, 2]].to_h 928 # # => {:foo => :bar, 1 => 2} 929 # [1, 2].to_h{|x| [x, x*2]} 930 # # => {1 => 2, 2 => 4} 931 # 932 def to_h(&blk) 933 h = {} 934 self.each do |v| 935 v = blk.call(v) if blk 936 raise TypeError, "wrong element type #{v.class}" unless Array === v 937 raise ArgumentError, "wrong array length (expected 2, was #{v.length})" unless v.length == 2 938 h[v[0]] = v[1] 939 end 940 h 941 end 942 943 alias append push 944 alias prepend unshift 945 alias filter! select! 765 946 end -
EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-array-ext/src/array.c
r331 r439 66 66 for (i = 0; i < RARRAY_LEN(ary); ++i) { 67 67 v = RARRAY_PTR(ary)[i]; 68 if (mrb_ type(v) == MRB_TT_ARRAY&&68 if (mrb_array_p(v) && 69 69 RARRAY_LEN(v) > 1 && 70 70 mrb_equal(mrb, RARRAY_PTR(v)[1], value)) … … 107 107 } 108 108 109 /*110 * call-seq:111 * ary.to_h -> Hash112 *113 * Returns the result of interpreting <i>aray</i> as an array of114 * <tt>[key, value]</tt> paris.115 *116 * [[:foo, :bar], [1, 2]].to_h117 * # => {:foo => :bar, 1 => 2}118 *119 */120 121 static mrb_value122 mrb_ary_to_h(mrb_state *mrb, mrb_value ary)123 {124 mrb_int i;125 mrb_value v, hash;126 127 hash = mrb_hash_new_capa(mrb, 0);128 129 for (i = 0; i < RARRAY_LEN(ary); ++i) {130 v = mrb_check_array_type(mrb, RARRAY_PTR(ary)[i]);131 132 if (mrb_nil_p(v)) {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, ary_elt(ary, i))),135 mrb_fixnum_value(i)136 );137 }138 139 if (RARRAY_LEN(v) != 2) {140 mrb_raisef(mrb, E_ARGUMENT_ERROR, "wrong array length at %S (expected 2, was %S)",141 mrb_fixnum_value(i),142 mrb_fixnum_value(RARRAY_LEN(v))143 );144 }145 146 mrb_hash_set(mrb, hash, RARRAY_PTR(v)[0], RARRAY_PTR(v)[1]);147 }148 149 return hash;150 }151 109 152 110 /* … … 175 133 { 176 134 struct RArray *a = mrb_ary_ptr(self); 177 mrb_int i, j, k, len; 178 mrb_value index; 135 mrb_int i, j, k, len, alen; 179 136 mrb_value val; 180 137 mrb_value *ptr; … … 183 140 mrb_ary_modify(mrb, a); 184 141 185 if (mrb_get_args(mrb, "o|i", &index, &len) == 1) { 142 if (mrb_get_argc(mrb) == 1) { 143 mrb_value index; 144 145 mrb_get_args(mrb, "o|i", &index, &len); 186 146 switch (mrb_type(index)) { 187 147 case MRB_TT_RANGE: 188 if (mrb_range_beg_len(mrb, index, &i, &len, a->len, TRUE) == 1) {148 if (mrb_range_beg_len(mrb, index, &i, &len, ARY_LEN(a), TRUE) == MRB_RANGE_OK) { 189 149 goto delete_pos_len; 190 150 } … … 201 161 } 202 162 203 i = mrb_fixnum(index);163 mrb_get_args(mrb, "ii", &i, &len); 204 164 delete_pos_len: 205 if (i < 0) i += a->len; 206 if (i < 0 || a->len < i) return mrb_nil_value(); 165 alen = ARY_LEN(a); 166 if (i < 0) i += alen; 167 if (i < 0 || alen < i) return mrb_nil_value(); 207 168 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;169 if (alen == i) return mrb_ary_new(mrb); 170 if (len > alen - i) len = alen - i; 210 171 211 172 ary = mrb_ary_new_capa(mrb, len); 212 173 ptr = ARY_PTR(a); 213 174 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) {175 mrb_ary_push(mrb, ary, ptr[j]); 176 } 177 178 ptr += i; 179 for (j = i; j < alen - len; ++j) { 219 180 *ptr = *(ptr+len); 220 181 ++ptr; 221 182 } 222 183 223 mrb_ary_resize(mrb, self, a ->len - len);184 mrb_ary_resize(mrb, self, alen - len); 224 185 return ary; 225 186 } … … 234 195 mrb_define_method(mrb, a, "rassoc", mrb_ary_rassoc, MRB_ARGS_REQ(1)); 235 196 mrb_define_method(mrb, a, "values_at", mrb_ary_values_at, MRB_ARGS_ANY()); 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()); 197 mrb_define_method(mrb, a, "slice!", mrb_ary_slice_bang, MRB_ARGS_ARG(1,1)); 238 198 } 239 199 -
EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-array-ext/test/array.rb
r331 r439 2 2 # Array(Ext) Test 3 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]) 4 def assert_permutation_combination(exp, receiver, meth, *args) 5 act = [] 6 ret = receiver.__send__(meth, *args) { |v| act << v } 7 assert "assert_#{meth}" do 8 assert_equal(exp, act.sort) 9 assert_same(receiver, ret) 10 end 11 end 12 13 def assert_permutation(exp, receiver, *args) 14 assert_permutation_combination(exp, receiver, :permutation, *args) 15 end 16 17 def assert_combination(exp, receiver, *args) 18 assert_permutation_combination(exp, receiver, :combination, *args) 9 19 end 10 20 … … 76 86 end 77 87 88 assert("Array#union") do 89 a = [1, 2, 3, 1] 90 b = [1, 4] 91 c = [1, 5] 92 93 assert_equal [1, 2, 3, 4, 5], a.union(b,c) 94 end 95 96 assert("Array#difference") do 97 a = [1, 2, 3, 1, 6, 7] 98 b = [1, 4, 6] 99 c = [1, 5, 7] 100 101 assert_equal [2, 3], a.difference(b,c) 102 end 103 78 104 assert("Array#&") do 79 105 a = [1, 2, 3, 1] … … 84 110 assert_equal [1], (a & b) 85 111 assert_equal [1, 2, 3, 1], a 112 end 113 114 assert("Array#intersection") do 115 a = [1, 2, 3, 1, 8, 6, 7, 8] 116 b = [1, 4, 6, 8] 117 c = [1, 5, 7, 8] 118 119 assert_equal [1, 8], a.intersection(b,c) 86 120 end 87 121 … … 162 196 end 163 197 assert_equal [ "d", "c", "b", "a" ], b 164 165 if Object.const_defined?(:Enumerator)166 assert_equal [ "d", "c", "b", "a" ], a.reverse_each.to_a167 else168 true169 end170 198 end 171 199 … … 229 257 assert("Array#bsearch") do 230 258 # Find minimum mode 231 a = [0, 4, 7, 10, 12] 232 assert_include [4, 7], a.bsearch {|x| x >= 4 } 233 assert_equal 7, a.bsearch {|x| x >= 6 } 234 assert_equal 0, a.bsearch {|x| x >= -1 } 235 assert_nil a.bsearch {|x| x >= 100 } 259 a = [0, 2, 4] 260 assert_equal 0, a.bsearch{ |x| x >= -1 } 261 assert_equal 0, a.bsearch{ |x| x >= 0 } 262 assert_equal 2, a.bsearch{ |x| x >= 1 } 263 assert_equal 2, a.bsearch{ |x| x >= 2 } 264 assert_equal 4, a.bsearch{ |x| x >= 3 } 265 assert_equal 4, a.bsearch{ |x| x >= 4 } 266 assert_nil a.bsearch{ |x| x >= 5 } 236 267 237 268 # Find any mode 238 a = [0, 4, 7, 10, 12] 239 assert_include [4, 7], a.bsearch {|x| 1 - (x / 4).truncate } 240 assert_nil a.bsearch {|x| 4 - (x / 2).truncate } 241 assert_equal(nil, a.bsearch {|x| 1 }) 242 assert_equal(nil, a.bsearch {|x| -1 }) 243 end 244 245 assert("Array#delete_if") do 246 a = [1, 2, 3, 4, 5] 247 assert_equal [1, 2, 3, 4, 5], a.delete_if { false } 248 assert_equal [1, 2, 3, 4, 5], a 249 250 a = [1, 2, 3, 4, 5] 251 assert_equal [], a.delete_if { true } 252 assert_equal [], a 253 254 a = [ 1, 2, 3, 4, 5 ] 255 assert_equal [1, 2, 3], a.delete_if { |val| val > 3 } 256 end 269 a = [0, 4, 8] 270 def between(lo, x, hi) 271 if x < lo 272 1 273 elsif x > hi 274 -1 275 else 276 0 277 end 278 end 279 assert_nil a.bsearch{ |x| between(-3, x, -1) } 280 assert_equal 0, a.bsearch{ |x| between(-1, x, 1) } 281 assert_nil a.bsearch{ |x| between( 1, x, 3) } 282 assert_equal 4, a.bsearch{ |x| between( 3, x, 5) } 283 assert_nil a.bsearch{ |x| between( 5, x, 7) } 284 assert_equal 8, a.bsearch{ |x| between( 7, x, 9) } 285 assert_nil a.bsearch{ |x| between( 9, x, 11) } 286 287 assert_equal 0, a.bsearch{ |x| between( 0, x, 3) } 288 assert_equal 4, a.bsearch{ |x| between( 0, x, 4) } 289 assert_equal 4, a.bsearch{ |x| between( 4, x, 8) } 290 assert_equal 8, a.bsearch{ |x| between( 5, x, 8) } 291 292 # Invalid block result 293 assert_raise TypeError, 'invalid block result (must be numeric, true, false or nil)' do 294 a.bsearch{ 'I like to watch the world burn' } 295 end 296 end 297 298 # tested through Array#bsearch 299 #assert("Array#bsearch_index") do 300 #end 257 301 258 302 assert("Array#keep_if") do … … 302 346 end 303 347 304 assert('Array#to_h (Modified)') do305 class A306 def to_ary307 $a.clear308 nil309 end310 end311 $a = [A.new]312 assert_raise(TypeError) { $a.to_h }313 end314 315 348 assert("Array#index (block)") do 316 349 assert_nil (1..10).to_a.index { |i| i % 5 == 0 and i % 7 == 0 } 317 350 assert_equal 34, (1..100).to_a.index { |i| i % 5 == 0 and i % 7 == 0 } 318 end319 320 assert("Array#to_ary") do321 assert_equal [], [].to_ary322 assert_equal [1,2,3], [1,2,3].to_ary323 351 end 324 352 … … 353 381 assert_equal(j, nil) 354 382 end 383 384 assert("Array#permutation") do 385 a = [1, 2, 3] 386 assert_permutation([[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]], a) 387 assert_permutation([[1],[2],[3]], a, 1) 388 assert_permutation([[1,2],[1,3],[2,1],[2,3],[3,1],[3,2]], a, 2) 389 assert_permutation([[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]], a, 3) 390 assert_permutation([[]], a, 0) 391 assert_permutation([], a, 4) 392 assert_permutation([], a, -1) 393 end 394 395 assert("Array#combination") do 396 a = [1, 2, 3, 4] 397 assert_combination([[1],[2],[3],[4]], a, 1) 398 assert_combination([[1,2],[1,3],[1,4],[2,3],[2,4],[3,4]], a, 2) 399 assert_combination([[1,2,3],[1,2,4],[1,3,4],[2,3,4]], a, 3) 400 assert_combination([[1,2,3,4]], a, 4) 401 assert_combination([[]], a, 0) 402 assert_combination([], a, 5) 403 assert_combination([], a, -1) 404 end 405 406 assert('Array#transpose') do 407 assert_equal([].transpose, []) 408 assert_equal([[]].transpose, []) 409 assert_equal([[1]].transpose, [[1]]) 410 assert_equal([[1,2,3]].transpose, [[1], [2], [3]]) 411 assert_equal([[1], [2], [3]].transpose, [[1,2,3]]) 412 assert_equal([[1,2], [3,4], [5,6]].transpose, [[1,3,5], [2,4,6]]) 413 assert_raise(TypeError) { [1].transpose } 414 assert_raise(IndexError) { [[1], [2,3,4]].transpose } 415 end -
EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-bin-debugger/bintest/print.rb
r331 r439 1 1 require 'open3' 2 2 require 'tempfile' 3 require 'strscan' 3 4 4 5 class BinTest_MrubyBinDebugger 5 @debug1=false6 @debug2=true6 # @debug1=false 7 # @debug2=true 7 8 def self.test(rubysource, testcase) 8 9 script, bin = Tempfile.new(['test', '.rb']), Tempfile.new(['test', '.mrb']) … … 20 21 stdin_data = testcase.map{|t| t[:cmd]}.join("\n") << "\n" 21 22 23 prompt = /^\(#{Regexp.escape(script.path)}:\d+\) / 22 24 ["bin/mrdb #{script.path}","bin/mrdb -b #{bin.path}"].each do |cmd| 23 25 o, s = Open3.capture2(cmd, :stdin_data => stdin_data) 24 25 exp_vals = testcase.map{|t| t.fetch(:exp, nil)} 26 scanner = StringScanner.new(o) 27 scanner.skip_until(prompt) 28 testcase.each do |tc| 29 exp = tc[:exp] 30 if exp 31 act = scanner.scan_until(/\n/) 32 break unless assert_operator act, :start_with?, exp 33 end 34 scanner.skip_until(prompt) 35 end 36 26 37 =begin 27 38 if @debug1 … … 42 53 end 43 54 =end 44 idx = 045 exp_vals.each do |exp|46 next if exp.nil?47 idx = o.index(exp, idx)48 assert_false idx.nil?49 break unless idx50 idx += 151 end52 55 end 53 56 end … … 91 94 # test case 92 95 tc = [] 93 tc << {:cmd=>"p (1+2", :exp=>'$1 = SyntaxError'}94 tc << {:cmd=>"p bar", :exp=>'$2 = NoMethodError'}96 tc << {:cmd=>"p (1+2", :exp=>'$1 = line 1: syntax error'} 97 tc << {:cmd=>"p bar", :exp=>'$2 = undefined method'} 95 98 96 99 BinTest_MrubyBinDebugger.test(src, tc) … … 318 321 SRC 319 322 320 # todo: wait for 'break' to be impl imented323 # todo: wait for 'break' to be implemented 321 324 tc = [] 322 325 9.times { tc << {:cmd=>"s"} } … … 342 345 tc << {:cmd=>"p 0x100", :exp=>'$4 = 256'} 343 346 tc << {:cmd=>"p 1_234", :exp=>'$5 = 1234'} 344 tc << {:cmd=>"p 0b1000_0000", :exp=>"$6 = #{0b1000_0000 .to_s}"}345 tc << {:cmd=>"p 0x1000_0000", :exp=>"$7 = #{0x1000_0000 .to_s}"}347 tc << {:cmd=>"p 0b1000_0000", :exp=>"$6 = #{0b1000_0000}"} 348 tc << {:cmd=>"p 0x1000_0000", :exp=>"$7 = #{0x1000_0000}"} 346 349 347 350 tc << {:cmd=>"p 3.14", :exp=>'$8 = 3.14'} 348 351 tc << {:cmd=>"p -12.3", :exp=>'$9 = -12.3'} 349 tc << {:cmd=>"p +12.000", :exp=>'$10 = 12 .0'}350 tc << {:cmd=>"p 1e4", :exp=>'$11 = 10000 .0'}352 tc << {:cmd=>"p +12.000", :exp=>'$10 = 12'} 353 tc << {:cmd=>"p 1e4", :exp=>'$11 = 10000'} 351 354 tc << {:cmd=>"p -0.1e-2", :exp=>'$12 = -0.001'} 352 355 … … 369 372 tc << {:cmd=>'p "str"', :exp=>'$1 = "str"'} 370 373 tc << {:cmd=>'p "s\tt\rr\n"', :exp=>'$2 = "s\\tt\\rr\\n"'} 371 tc << {:cmd=>'p "\C-a\C-z"', :exp=>'$3 = "\\ 001\\032"'}374 tc << {:cmd=>'p "\C-a\C-z"', :exp=>'$3 = "\\x01\\x1a"'} 372 375 tc << {:cmd=>'p "#{foo+bar}"', :exp=>'$4 = "foobar"'} 373 376 … … 375 378 tc << {:cmd=>'p \'s\\tt\\rr\\n\'', :exp=>'$6 = "s\\\\tt\\\\rr\\\\n"'} 376 379 tc << {:cmd=>'p \'\\C-a\\C-z\'', :exp=>'$7 = "\\\\C-a\\\\C-z"'} 377 tc << {:cmd=>'p \'#{foo+bar}\'', :exp=>'$8 = " #{foo+bar}"'}380 tc << {:cmd=>'p \'#{foo+bar}\'', :exp=>'$8 = "\\#{foo+bar}"'} 378 381 379 382 tc << {:cmd=>'p %!str!', :exp=>'$9 = "str"'} 380 383 tc << {:cmd=>'p %!s\tt\rr\n!', :exp=>'$10 = "s\\tt\\rr\\n"'} 381 tc << {:cmd=>'p %!\C-a\C-z!', :exp=>'$11 = "\\ 001\\032"'}384 tc << {:cmd=>'p %!\C-a\C-z!', :exp=>'$11 = "\\x01\\x1a"'} 382 385 tc << {:cmd=>'p %!#{foo+bar}!', :exp=>'$12 = "foobar"'} 383 386 384 387 tc << {:cmd=>'p %Q!str!', :exp=>'$13 = "str"'} 385 388 tc << {:cmd=>'p %Q!s\tt\rr\n!', :exp=>'$14 = "s\\tt\\rr\\n"'} 386 tc << {:cmd=>'p %Q!\C-a\C-z!', :exp=>'$15 = "\\ 001\\032"'}389 tc << {:cmd=>'p %Q!\C-a\C-z!', :exp=>'$15 = "\\x01\\x1a"'} 387 390 tc << {:cmd=>'p %Q!#{foo+bar}!', :exp=>'$16 = "foobar"'} 388 391 … … 390 393 tc << {:cmd=>'p %q!s\\tt\\rr\\n!', :exp=>'$18 = "s\\\\tt\\\\rr\\\\n"'} 391 394 tc << {:cmd=>'p %q!\\C-a\\C-z!', :exp=>'$19 = "\\\\C-a\\\\C-z"'} 392 tc << {:cmd=>'p %q!#{foo+bar}!', :exp=>'$20 = " #{foo+bar}"'}395 tc << {:cmd=>'p %q!#{foo+bar}!', :exp=>'$20 = "\\#{foo+bar}"'} 393 396 394 397 BinTest_MrubyBinDebugger.test(src, tc) … … 411 414 tc << {:cmd=>'p [ 5, 12, 8, 10, ]', :exp=>'$2 = [5, 12, 8, 10]'} 412 415 tc << {:cmd=>'p [1,2.5,"#{foo+bar}"]', :exp=>'$3 = [1, 2.5, "foobar"]'} 413 tc << {:cmd=>'p %w[3.14 A\ &\ B #{foo}]', :exp=>'$4 = ["3.14", "A & B", " #{foo}"]'}416 tc << {:cmd=>'p %w[3.14 A\ &\ B #{foo}]', :exp=>'$4 = ["3.14", "A & B", "\#{foo}"]'} 414 417 tc << {:cmd=>'p %W[3.14 A\ &\ B #{foo}]', :exp=>'$5 = ["3.14", "A & B", "foo"]'} 415 418 … … 589 592 590 593 tc << {:cmd=>'p undefined=-1', :exp=>'$3 = -1'} 591 tc << {:cmd=>'p "#{undefined}"', :exp=>'$4 = NoMethodError'}594 tc << {:cmd=>'p "#{undefined}"', :exp=>'$4 = undefined method'} 592 595 593 596 BinTest_MrubyBinDebugger.test(src, tc) … … 627 630 628 631 tc << {:cmd=>'p undefined=-1', :exp=>'$14 = -1'} 629 tc << {:cmd=>'p "#{undefined}"', :exp=>'$15 = NoMethodError'}632 tc << {:cmd=>'p "#{undefined}"', :exp=>'$15 = undefined method'} 630 633 631 634 BinTest_MrubyBinDebugger.test(src, tc) … … 695 698 696 699 tc << {:cmd=>'p undefined=-1', :exp=>'$14 = -1'} 697 tc << {:cmd=>'p "#{undefined}"', :exp=>'$15 = NoMethodError'} 698 699 BinTest_MrubyBinDebugger.test(src, tc) 700 end 701 700 tc << {:cmd=>'p "#{undefined}"', :exp=>'$15 = undefined method'} 701 702 BinTest_MrubyBinDebugger.test(src, tc) 703 end -
EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-bin-debugger/tools/mrdb/apibreak.c
r331 r439 85 85 86 86 static uint16_t 87 check_file_lineno( struct mrb_irep *irep, const char *file, uint16_t lineno)87 check_file_lineno(mrb_state *mrb, struct mrb_irep *irep, const char *file, uint16_t lineno) 88 88 { 89 89 mrb_irep_debug_info_file *info_file; … … 94 94 95 95 for (f_idx = 0; f_idx < irep->debug_info->flen; ++f_idx) { 96 const char *filename; 96 97 info_file = irep->debug_info->files[f_idx]; 97 if (!strcmp(info_file->filename, file)) { 98 filename = mrb_sym_name_len(mrb, info_file->filename_sym, NULL); 99 if (!strcmp(filename, file)) { 98 100 result = MRB_DEBUG_BP_FILE_OK; 99 101 … … 104 106 } 105 107 for (i=0; i < irep->rlen; ++i) { 106 result |= check_file_lineno( irep->reps[i], file, lineno);108 result |= check_file_lineno(mrb, irep->reps[i], file, lineno); 107 109 if (result == (MRB_DEBUG_BP_FILE_OK | MRB_DEBUG_BP_LINENO_OK)) { 108 110 return result; … … 113 115 } 114 116 115 static const char*116 get_class_name(mrb_state *mrb, struct RClass *class_obj)117 {118 struct RClass *outer;119 mrb_sym class_sym;120 121 outer = mrb_class_outer_module(mrb, class_obj);122 class_sym = mrb_class_sym(mrb, class_obj, outer);123 return mrb_sym2name(mrb, class_sym);124 }125 126 117 static int32_t 127 118 compare_break_method(mrb_state *mrb, mrb_debug_breakpoint *bp, struct RClass *class_obj, mrb_sym method_sym, mrb_bool* isCfunc) … … 129 120 const char* class_name; 130 121 const char* method_name; 131 struct RProc*m;122 mrb_method_t m; 132 123 struct RClass* sc; 133 124 const char* sn; … … 136 127 mrb_bool is_defined; 137 128 138 method_name = mrb_sym 2name(mrb, method_sym);129 method_name = mrb_sym_name(mrb, method_sym); 139 130 140 131 method_p = &bp->point.methodpoint; 141 132 if (strcmp(method_p->method_name, method_name) == 0) { 142 class_name = get_class_name(mrb, class_obj);133 class_name = mrb_class_name(mrb, class_obj); 143 134 if (class_name == NULL) { 144 135 if (method_p->class_name == NULL) { … … 148 139 else if (method_p->class_name != NULL) { 149 140 m = mrb_method_search_vm(mrb, &class_obj, method_sym); 150 if ( m == NULL) {141 if (MRB_METHOD_UNDEF_P(m)) { 151 142 return MRB_DEBUG_OK; 152 143 } 153 if (MRB_ PROC_CFUNC_P(m)) {144 if (MRB_METHOD_CFUNC_P(m)) { 154 145 *isCfunc = TRUE; 155 146 } … … 163 154 ssym = mrb_symbol(mrb_check_intern_cstr(mrb, method_p->method_name)); 164 155 m = mrb_method_search_vm(mrb, &sc, ssym); 165 if ( m == NULL) {156 if (MRB_METHOD_UNDEF_P(m)) { 166 157 return MRB_DEBUG_OK; 167 158 } 168 159 169 class_name = get_class_name(mrb, class_obj);170 sn = get_class_name(mrb, sc);160 class_name = mrb_class_name(mrb, class_obj); 161 sn = mrb_class_name(mrb, sc); 171 162 if (strcmp(sn, class_name) == 0) { 172 163 return bp->bpno; … … 197 188 198 189 /* file and lineno check (line type mrb_debug_line_ary only.) */ 199 result = check_file_lineno( dbg->root_irep, file, lineno);190 result = check_file_lineno(mrb, dbg->root_irep, file, lineno); 200 191 if (result == 0) { 201 192 return MRB_DEBUG_BREAK_INVALID_FILE; … … 205 196 } 206 197 207 set_file = mrb_malloc(mrb, strlen(file) + 1);198 set_file = (char*)mrb_malloc(mrb, strlen(file) + 1); 208 199 209 200 index = dbg->bpnum; … … 242 233 243 234 if (class_name != NULL) { 244 set_class = mrb_malloc(mrb, strlen(class_name) + 1);235 set_class = (char*)mrb_malloc(mrb, strlen(class_name) + 1); 245 236 strncpy(set_class, class_name, strlen(class_name) + 1); 246 237 } … … 249 240 } 250 241 251 set_method = mrb_malloc(mrb, strlen(method_name) + 1);242 set_method = (char*)mrb_malloc(mrb, strlen(method_name) + 1); 252 243 253 244 strncpy(set_method, method_name, strlen(method_name) + 1); … … 438 429 439 430 static mrb_bool 440 check_start_pc_for_line(mrb_ irep *irep,mrb_code *pc, uint16_t line)431 check_start_pc_for_line(mrb_state *mrb, mrb_irep *irep, const mrb_code *pc, uint16_t line) 441 432 { 442 433 if (pc > irep->iseq) { 443 if (line == mrb_debug_get_line( irep, (uint32_t)(pc - irep->iseq - 1))) {434 if (line == mrb_debug_get_line(mrb, irep, pc - irep->iseq - 1)) { 444 435 return FALSE; 445 436 } … … 459 450 } 460 451 461 if (!check_start_pc_for_line( dbg->irep, dbg->pc, line)) {452 if (!check_start_pc_for_line(mrb, dbg->irep, dbg->pc, line)) { 462 453 return MRB_DEBUG_OK; 463 454 } … … 515 506 return 0; 516 507 } 517 518 -
EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-bin-debugger/tools/mrdb/apilist.c
r331 r439 49 49 } 50 50 51 path = mrb_malloc(mrb, len);51 path = (char*)mrb_malloc(mrb, len); 52 52 memset(path, 0, len); 53 53 … … 65 65 { 66 66 size_t len; 67 char *p, *dir; 67 const char *p; 68 char *dir; 68 69 69 70 if (path == NULL) { … … 74 75 len = p != NULL ? (size_t)(p - path) : strlen(path); 75 76 76 dir = mrb_malloc(mrb, len + 1);77 dir = (char*)mrb_malloc(mrb, len + 1); 77 78 strncpy(dir, path, len); 78 79 dir[len] = '\0'; … … 84 85 source_file_new(mrb_state *mrb, mrb_debug_context *dbg, char *filename) 85 86 { 86 source_file *file = NULL;87 88 file = mrb_malloc(mrb, sizeof(source_file));87 source_file *file; 88 89 file = (source_file*)mrb_malloc(mrb, sizeof(source_file)); 89 90 90 91 memset(file, '\0', sizeof(source_file)); … … 97 98 98 99 file->lineno = 1; 99 file->path = mrb_malloc(mrb, strlen(filename) + 1);100 file->path = (char*)mrb_malloc(mrb, strlen(filename) + 1); 100 101 strcpy(file->path, filename); 101 102 return file; … … 175 176 const char *search_path[3]; 176 177 char *path = NULL; 178 const char *srcname = strrchr(filename, '/'); 179 180 if (srcname) srcname++; 181 else srcname = filename; 177 182 178 183 search_path[0] = srcpath; 179 search_path[1] = dirname(mrb, mrb_debug_get_filename(mr db->dbg->root_irep, 0));184 search_path[1] = dirname(mrb, mrb_debug_get_filename(mrb, mrdb->dbg->irep, 0)); 180 185 search_path[2] = "."; 181 186 … … 185 190 } 186 191 187 if ((path = build_path(mrb, search_path[i], filename)) == NULL) {192 if ((path = build_path(mrb, search_path[i], srcname)) == NULL) { 188 193 continue; 189 194 } -
EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-bin-debugger/tools/mrdb/apiprint.c
r331 r439 22 22 c->no_exec = TRUE; 23 23 c->capture_errors = TRUE; 24 c->filename = (char*)dbg->prvfile;24 mrbc_filename(mrb, c, (const char*)dbg->prvfile); 25 25 c->lineno = dbg->prvline; 26 26 … … 32 32 33 33 mrb_value 34 mrb_debug_eval(mrb_state *mrb, mrb_debug_context *dbg, const char *expr, size_t len, mrb_bool *exc )34 mrb_debug_eval(mrb_state *mrb, mrb_debug_context *dbg, const char *expr, size_t len, mrb_bool *exc, int direct_eval) 35 35 { 36 void (*tmp)(struct mrb_state *, struct mrb_irep *, mrb_code *, mrb_value *);36 void (*tmp)(struct mrb_state *, struct mrb_irep *, const mrb_code *, mrb_value *); 37 37 mrb_value ruby_code; 38 38 mrb_value s; … … 48 48 v = mrb_obj_value(mrb->exc); 49 49 mrb->exc = 0; 50 } 51 else if (direct_eval) { 52 recv = dbg->regs[0]; 53 54 v = mrb_funcall(mrb, recv, expr, 0); 50 55 } 51 56 else { … … 70 75 } 71 76 72 s = mrb_ funcall(mrb, v, "inspect", 0);77 s = mrb_inspect(mrb, v); 73 78 74 79 /* enable code_fetch_hook */ -
EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-bin-debugger/tools/mrdb/apiprint.h
r331 r439 9 9 #include "mrdb.h" 10 10 11 mrb_value mrb_debug_eval(mrb_state*, mrb_debug_context*, const char*, size_t, mrb_bool* );11 mrb_value mrb_debug_eval(mrb_state*, mrb_debug_context*, const char*, size_t, mrb_bool*, int); 12 12 13 13 #endif /* APIPRINT_H_ */ -
EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-bin-debugger/tools/mrdb/cmdbreak.c
r331 r439 243 243 244 244 mrb_debug_bptype 245 parse_breakcommand(mr db_state *mrdb, const char **file, uint32_t *line, char **cname, char **method)245 parse_breakcommand(mrb_state *mrb, mrdb_state *mrdb, const char **file, uint32_t *line, char **cname, char **method) 246 246 { 247 247 mrb_debug_context *dbg = mrdb->dbg; … … 275 275 if (l <= 65535) { 276 276 *line = l; 277 *file = (body == args)? mrb_debug_get_filename( dbg->irep, (uint32_t)(dbg->pc - dbg->irep->iseq)): args;277 *file = (body == args)? mrb_debug_get_filename(mrb, dbg->irep, dbg->pc - dbg->irep->iseq): args; 278 278 } 279 279 else { … … 333 333 int32_t ret; 334 334 335 type = parse_breakcommand(mr db, &file, &line, &cname, &method);335 type = parse_breakcommand(mrb, mrdb, &file, &line, &cname, &method); 336 336 switch (type) { 337 337 case MRB_DEBUG_BPTYPE_LINE: -
EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-bin-debugger/tools/mrdb/cmdmisc.c
r331 r439 81 81 "Status of specified breakpoints (all user-settable breakpoints if no argument).\n" 82 82 "Arguments are breakpoint numbers with spaces in between.\n" 83 }, 84 { 85 "i[nfo]", "l[ocals]", "Print name of local variables", 86 "Usage: info locals\n" 87 "\n" 88 "Print name of local variables.\n" 83 89 }, 84 90 { … … 134 140 listcmd_parser_state_new(mrb_state *mrb) 135 141 { 136 listcmd_parser_state *st = mrb_malloc(mrb, sizeof(listcmd_parser_state));142 listcmd_parser_state *st = (listcmd_parser_state*)mrb_malloc(mrb, sizeof(listcmd_parser_state)); 137 143 memset(st, 0, sizeof(listcmd_parser_state)); 138 144 return st; … … 228 234 229 235 if (len > 0) { 230 st->filename = mrb_malloc(mrb, len + 1);236 st->filename = (char*)mrb_malloc(mrb, len + 1); 231 237 strncpy(st->filename, *sp, len); 232 238 st->filename[len] = '\0'; … … 243 249 { 244 250 size_t len; 245 char *p, *s; 251 const char *p; 252 char *s; 246 253 247 254 if (filename == NULL) { … … 256 263 } 257 264 258 s = mrb_malloc(mrb, len + strlen(ext) + 1);265 s = (char*)mrb_malloc(mrb, len + strlen(ext) + 1); 259 266 memset(s, '\0', len + strlen(ext) + 1); 260 267 strncpy(s, filename, len); … … 326 333 check_cmd_pattern(const char *pattern, const char *cmd) 327 334 { 328 c har *lbracket, *rbracket, *p, *q;335 const char *lbracket, *rbracket, *p, *q; 329 336 330 337 if (pattern == NULL && cmd == NULL) { … … 495 502 if (mrdb->dbg->xm == DBG_QUIT) { 496 503 struct RClass *exc; 497 exc = mrb_define_class(mrb, "DebuggerExit", mrb _class_get(mrb, "Exception"));504 exc = mrb_define_class(mrb, "DebuggerExit", mrb->eException_class); 498 505 mrb_raise(mrb, exc, "Exit mrdb."); 499 506 } -
EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-bin-debugger/tools/mrdb/cmdprint.c
r331 r439 19 19 mrb_value expr; 20 20 mrb_value result; 21 mrb_value s;22 21 uint8_t wcnt; 23 22 int ai; … … 37 36 } 38 37 39 result = mrb_debug_eval(mrb, mrdb->dbg, RSTRING_PTR(expr), RSTRING_LEN(expr), NULL );38 result = mrb_debug_eval(mrb, mrdb->dbg, RSTRING_PTR(expr), RSTRING_LEN(expr), NULL, 0); 40 39 41 40 /* $print_no = result */ 42 s = mrb_str_cat_lit(mrb, result, "\0"); 43 printf("$%lu = %s\n", (unsigned long)mrdb->print_no++, RSTRING_PTR(s)); 41 printf("$%lu = ", (unsigned long)mrdb->print_no++); 42 fwrite(RSTRING_PTR(result), RSTRING_LEN(result), 1, stdout); 43 putc('\n', stdout); 44 44 45 45 if (mrdb->print_no == 0) { … … 57 57 return dbgcmd_print(mrb, mrdb); 58 58 } 59 60 dbgcmd_state 61 dbgcmd_info_local(mrb_state *mrb, mrdb_state *mrdb) 62 { 63 mrb_value result; 64 mrb_value s; 65 int ai; 66 67 ai = mrb_gc_arena_save(mrb); 68 69 result = mrb_debug_eval(mrb, mrdb->dbg, "local_variables", 0, NULL, 1); 70 71 s = mrb_str_cat_lit(mrb, result, "\0"); 72 printf("$%lu = %s\n", (unsigned long)mrdb->print_no++, RSTRING_PTR(s)); 73 74 if (mrdb->print_no == 0) { 75 mrdb->print_no = 1; 76 } 77 78 mrb_gc_arena_restore(mrb, ai); 79 80 return DBGST_PROMPT; 81 } -
EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-bin-debugger/tools/mrdb/cmdrun.c
r331 r439 20 20 struct RClass *exc; 21 21 puts("Start it from the beginning."); 22 exc = mrb_define_class(mrb, "DebuggerRestart", mrb _class_get(mrb, "Exception"));22 exc = mrb_define_class(mrb, "DebuggerRestart", mrb->eException_class); 23 23 mrb_raise(mrb, exc, "Restart mrdb."); 24 24 } -
EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-bin-debugger/tools/mrdb/mrdb.c
r331 r439 6 6 #include <stdlib.h> 7 7 #include <string.h> 8 #include <stdio.h>9 8 #include <ctype.h> 10 9 … … 53 52 {"help", NULL, 1, 0, 1, DBGCMD_HELP, dbgcmd_help}, /* h[elp] */ 54 53 {"info", "breakpoints", 1, 1, 1, DBGCMD_INFO_BREAK, dbgcmd_info_break}, /* i[nfo] b[reakpoints] */ 54 {"info", "locals", 1, 1, 0, DBGCMD_INFO_LOCAL, dbgcmd_info_local}, /* i[nfo] l[ocals] */ 55 55 {"list", NULL, 1, 0, 1, DBGCMD_LIST, dbgcmd_list}, /* l[ist] */ 56 56 {"print", NULL, 1, 0, 0, DBGCMD_PRINT, dbgcmd_print}, /* p[rint] */ … … 185 185 mrb_debug_context_new(mrb_state *mrb) 186 186 { 187 mrb_debug_context *dbg = mrb_malloc(mrb, sizeof(mrb_debug_context));187 mrb_debug_context *dbg = (mrb_debug_context*)mrb_malloc(mrb, sizeof(mrb_debug_context)); 188 188 189 189 memset(dbg, 0, sizeof(mrb_debug_context)); … … 224 224 mrdb_state_new(mrb_state *mrb) 225 225 { 226 mrdb_state *mrdb = mrb_malloc(mrb, sizeof(mrdb_state));226 mrdb_state *mrdb = (mrdb_state*)mrb_malloc(mrb, sizeof(mrdb_state)); 227 227 228 228 memset(mrdb, 0, sizeof(mrdb_state)); 229 229 230 230 mrdb->dbg = mrb_debug_context_get(mrb); 231 mrdb->command = mrb_malloc(mrb, MAX_COMMAND_LINE+1);231 mrdb->command = (char*)mrb_malloc(mrb, MAX_COMMAND_LINE+1); 232 232 mrdb->print_no = 1; 233 233 … … 505 505 506 506 static int32_t 507 check_method_breakpoint(mrb_state *mrb, mrb_irep *irep, mrb_code *pc, mrb_value *regs)507 check_method_breakpoint(mrb_state *mrb, mrb_irep *irep, const mrb_code *pc, mrb_value *regs) 508 508 { 509 509 struct RClass* c; … … 511 511 int32_t bpno; 512 512 mrb_bool isCfunc; 513 struct mrb_insn_data insn; 513 514 514 515 mrb_debug_context *dbg = mrb_debug_context_get(mrb); … … 518 519 dbg->method_bpno = 0; 519 520 520 switch(GET_OPCODE(*pc)) { 521 insn = mrb_decode_insn(pc); 522 switch(insn.insn) { 521 523 case OP_SEND: 522 524 case OP_SENDB: 523 c = mrb_class(mrb, regs[ GETARG_A(*pc)]);524 sym = irep->syms[ GETARG_B(*pc)];525 c = mrb_class(mrb, regs[insn.a]); 526 sym = irep->syms[insn.b]; 525 527 break; 526 528 case OP_SUPER: … … 544 546 545 547 static void 546 mrb_code_fetch_hook(mrb_state *mrb, mrb_irep *irep, mrb_code *pc, mrb_value *regs)548 mrb_code_fetch_hook(mrb_state *mrb, mrb_irep *irep, const mrb_code *pc, mrb_value *regs) 547 549 { 548 550 const char *file; … … 567 569 } 568 570 569 file = mrb_debug_get_filename( irep, (uint32_t)(pc - irep->iseq));570 line = mrb_debug_get_line( irep, (uint32_t)(pc - irep->iseq));571 file = mrb_debug_get_filename(mrb, irep, pc - irep->iseq); 572 line = mrb_debug_get_line(mrb, irep, pc - irep->iseq); 571 573 572 574 switch (dbg->xm) { -
EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-bin-debugger/tools/mrdb/mrdb.h
r331 r439 24 24 DBGCMD_BREAK, 25 25 DBGCMD_INFO_BREAK, 26 DBGCMD_INFO_LOCAL, 26 27 DBGCMD_WATCH, 27 28 DBGCMD_INFO_WATCH, … … 105 106 struct mrb_irep *root_irep; 106 107 struct mrb_irep *irep; 107 mrb_code *pc;108 const mrb_code *pc; 108 109 mrb_value *regs; 109 110 … … 152 153 dbgcmd_state dbgcmd_break(mrb_state*, mrdb_state*); 153 154 dbgcmd_state dbgcmd_info_break(mrb_state*, mrdb_state*); 155 dbgcmd_state dbgcmd_info_local(mrb_state*, mrdb_state*); 154 156 dbgcmd_state dbgcmd_delete(mrb_state*, mrdb_state*); 155 157 dbgcmd_state dbgcmd_enable(mrb_state*, mrdb_state*); -
EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-bin-debugger/tools/mrdb/mrdbconf.h
r321 r439 6 6 #ifndef MRDBCONF_H 7 7 #define MRDBCONF_H 8 9 #ifndef MRB_ENABLE_DEBUG_HOOK 10 # error mruby-bin-debugger need 'MRB_ENABLE_DEBUG_HOOK' configuration in your 'build_config.rb' 11 #endif 12 13 #ifdef MRB_DISABLE_STDIO 14 # error mruby-bin-debugger conflicts 'MRB_DISABLE_STDIO' configuration in your 'build_config.rb' 15 #endif 8 16 9 17 /* configuration options: */ -
EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-bin-mirb/bintest/mirb.rb
r321 r439 11 11 assert_true o.include?('=> 3') 12 12 end 13 14 assert('mirb -d option') do 15 o, _ = Open3.capture2('bin/mirb', :stdin_data => "$DEBUG\n") 16 assert_true o.include?('=> false') 17 o, _ = Open3.capture2('bin/mirb -d', :stdin_data => "$DEBUG\n") 18 assert_true o.include?('=> true') 19 end 20 21 assert('mirb -r option') do 22 lib = Tempfile.new('lib.rb') 23 lib.write <<EOS 24 class Hoge 25 def hoge 26 :hoge 27 end 28 end 29 EOS 30 lib.flush 31 32 o, _ = Open3.capture2("bin/mirb -r #{lib.path}", :stdin_data => "Hoge.new.hoge\n") 33 assert_true o.include?('=> :hoge') 34 end -
EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c
r331 r439 7 7 */ 8 8 9 #include <mruby.h> 10 11 #ifdef MRB_DISABLE_STDIO 12 # error mruby-bin-mirb conflicts 'MRB_DISABLE_STDIO' configuration in your 'build_config.rb' 13 #endif 14 15 #include <mruby/array.h> 16 #include <mruby/proc.h> 17 #include <mruby/compile.h> 18 #include <mruby/dump.h> 19 #include <mruby/string.h> 20 #include <mruby/variable.h> 21 #include <mruby/throw.h> 22 9 23 #include <stdlib.h> 10 24 #include <string.h> 11 #include <stdio.h>12 25 #include <ctype.h> 13 26 … … 20 33 #define MIRB_ADD_HISTORY(line) add_history(line) 21 34 #define MIRB_READLINE(ch) readline(ch) 35 #if !defined(RL_READLINE_VERSION) || RL_READLINE_VERSION < 0x600 36 /* libedit & older readline do not have rl_free() */ 37 #define MIRB_LINE_FREE(line) free(line) 38 #else 39 #define MIRB_LINE_FREE(line) rl_free(line) 40 #endif 22 41 #define MIRB_WRITE_HISTORY(path) write_history(path) 23 42 #define MIRB_READ_HISTORY(path) read_history(path) … … 28 47 #define MIRB_ADD_HISTORY(line) linenoiseHistoryAdd(line) 29 48 #define MIRB_READLINE(ch) linenoise(ch) 49 #define MIRB_LINE_FREE(line) linenoiseFree(line) 30 50 #define MIRB_WRITE_HISTORY(path) linenoiseHistorySave(path) 31 51 #define MIRB_READ_HISTORY(path) linenoiseHistoryLoad(history_path) … … 42 62 #define SIGJMP_BUF jmp_buf 43 63 #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>50 64 51 65 #ifdef ENABLE_READLINE … … 89 103 { 90 104 mrb_value val; 105 char* msg; 91 106 92 107 val = mrb_funcall(mrb, obj, "inspect", 0); … … 102 117 val = mrb_obj_as_string(mrb, obj); 103 118 } 104 fwrite(RSTRING_PTR(val), RSTRING_LEN(val), 1, stdout); 119 msg = mrb_locale_from_utf8(RSTRING_PTR(val), (int)RSTRING_LEN(val)); 120 fwrite(msg, strlen(msg), 1, stdout); 121 mrb_locale_free(msg); 105 122 putc('\n', stdout); 106 123 } … … 115 132 /* check for heredoc */ 116 133 if (parser->parsing_heredoc != NULL) return TRUE; 117 if (parser->heredoc_end_now) {118 parser->heredoc_end_now = FALSE;119 return FALSE;120 }121 134 122 135 /* check for unterminated string */ … … 210 223 FILE *rfp; 211 224 mrb_bool verbose : 1; 225 mrb_bool debug : 1; 212 226 int argc; 213 227 char** argv; 228 int libc; 229 char **libv; 214 230 }; 215 231 … … 219 235 static const char *const usage_msg[] = { 220 236 "switches:", 237 "-d set $DEBUG to true (same as `mruby -d`)", 238 "-r library same as `mruby -r`", 221 239 "-v print version number, then run in verbose mode", 222 240 "--verbose run in verbose mode", … … 227 245 const char *const *p = usage_msg; 228 246 229 printf("Usage: %s [switches] \n", name);247 printf("Usage: %s [switches] [programfile] [arguments]\n", name); 230 248 while (*p) 231 249 printf(" %s\n", *p++); 232 250 } 233 251 252 static char * 253 dup_arg_item(mrb_state *mrb, const char *item) 254 { 255 size_t buflen = strlen(item) + 1; 256 char *buf = (char*)mrb_malloc(mrb, buflen); 257 memcpy(buf, item, buflen); 258 return buf; 259 } 260 234 261 static int 235 262 parse_args(mrb_state *mrb, int argc, char **argv, struct _args *args) 236 263 { 264 char **origargv = argv; 237 265 static const struct _args args_zero = { 0 }; 238 266 … … 245 273 item = argv[0] + 1; 246 274 switch (*item++) { 275 case 'd': 276 args->debug = TRUE; 277 break; 278 case 'r': 279 if (!item[0]) { 280 if (argc <= 1) { 281 printf("%s: No library specified for -r\n", *origargv); 282 return EXIT_FAILURE; 283 } 284 argc--; argv++; 285 item = argv[0]; 286 } 287 if (args->libc == 0) { 288 args->libv = (char**)mrb_malloc(mrb, sizeof(char*)); 289 } 290 else { 291 args->libv = (char**)mrb_realloc(mrb, args->libv, sizeof(char*) * (args->libc + 1)); 292 } 293 args->libv[args->libc++] = dup_arg_item(mrb, item); 294 break; 247 295 case 'v': 248 296 if (!args->verbose) mrb_show_version(mrb); … … 290 338 fclose(args->rfp); 291 339 mrb_free(mrb, args->argv); 340 if (args->libc) { 341 while (args->libc--) { 342 mrb_free(mrb, args->libv[args->libc]); 343 } 344 mrb_free(mrb, args->libv); 345 } 292 346 mrb_close(mrb); 293 347 } … … 324 378 325 379 /* skip preceding spaces */ 326 while (*p && isspace((unsigned char)*p)) {380 while (*p && ISSPACE(*p)) { 327 381 p++; 328 382 } … … 334 388 /* skip trailing spaces */ 335 389 while (*p) { 336 if (! isspace((unsigned char)*p)) return 0;390 if (!ISSPACE(*p)) return 0; 337 391 p++; 338 392 } … … 354 408 { 355 409 MIRB_SIGLONGJMP(ctrl_c_buf, 1); 410 } 411 #endif 412 413 #ifndef DISABLE_MIRB_UNDERSCORE 414 void decl_lv_underscore(mrb_state *mrb, mrbc_context *cxt) 415 { 416 struct RProc *proc; 417 struct mrb_parser_state *parser; 418 419 parser = mrb_parse_string(mrb, "_=nil", cxt); 420 if (parser == NULL) { 421 fputs("create parser state error\n", stderr); 422 mrb_close(mrb); 423 exit(EXIT_FAILURE); 424 } 425 426 proc = mrb_generate_code(mrb, parser); 427 mrb_vm_run(mrb, proc, mrb_top_self(mrb), 0); 428 429 mrb_parser_free(parser); 356 430 } 357 431 #endif … … 404 478 } 405 479 mrb_define_global_const(mrb, "ARGV", ARGV); 480 mrb_gv_set(mrb, mrb_intern_lit(mrb, "$DEBUG"), mrb_bool_value(args.debug)); 406 481 407 482 #ifdef ENABLE_READLINE … … 420 495 421 496 cxt = mrbc_context_new(mrb); 497 498 #ifndef DISABLE_MIRB_UNDERSCORE 499 decl_lv_underscore(mrb, cxt); 500 #endif 501 502 /* Load libraries */ 503 for (i = 0; i < args.libc; i++) { 504 FILE *lfp = fopen(args.libv[i], "r"); 505 if (lfp == NULL) { 506 printf("Cannot open library file. (%s)\n", args.libv[i]); 507 cleanup(mrb, &args); 508 return EXIT_FAILURE; 509 } 510 mrb_load_file_cxt(mrb, lfp, cxt); 511 fclose(lfp); 512 } 513 422 514 cxt->capture_errors = TRUE; 423 515 cxt->lineno = 1; … … 429 521 while (TRUE) { 430 522 char *utf8; 431 523 struct mrb_jmpbuf c_jmp; 524 525 MRB_TRY(&c_jmp); 526 mrb->jmp = &c_jmp; 432 527 if (args.rfp) { 433 528 if (fgets(last_code_line, sizeof(last_code_line)-1, args.rfp) != NULL) … … 490 585 strcat(last_code_line, "\n"); 491 586 MIRB_ADD_HISTORY(line); 492 free(line); 493 #endif 494 495 done: 496 587 MIRB_LINE_FREE(line); 588 #endif 589 590 done: 497 591 if (code_block_open) { 498 592 if (strlen(ruby_code)+strlen(last_code_line) > sizeof(ruby_code)-1) { … … 529 623 } 530 624 else { 625 if (0 < parser->nwarn) { 626 /* warning */ 627 char* msg = mrb_locale_from_utf8(parser->warn_buffer[0].message, -1); 628 printf("line %d: %s\n", parser->warn_buffer[0].lineno, msg); 629 mrb_locale_free(msg); 630 } 531 631 if (0 < parser->nerr) { 532 632 /* syntax error */ 533 printf("line %d: %s\n", parser->error_buffer[0].lineno, parser->error_buffer[0].message); 633 char* msg = mrb_locale_from_utf8(parser->error_buffer[0].message, -1); 634 printf("line %d: %s\n", parser->error_buffer[0].lineno, msg); 635 mrb_locale_free(msg); 534 636 } 535 637 else { … … 544 646 if (args.verbose) { 545 647 mrb_codedump_all(mrb, proc); 648 } 649 /* adjust stack length of toplevel environment */ 650 if (mrb->c->cibase->env) { 651 struct REnv *e = mrb->c->cibase->env; 652 if (e && MRB_ENV_STACK_LEN(e) < proc->body.irep->nlocals) { 653 MRB_ENV_SET_STACK_LEN(e, proc->body.irep->nlocals); 654 } 546 655 } 547 656 /* pass a proc for evaluation */ … … 563 672 } 564 673 p(mrb, result, 1); 674 #ifndef DISABLE_MIRB_UNDERSCORE 675 *(mrb->c->stack + 1) = result; 676 #endif 565 677 } 566 678 } … … 571 683 mrb_parser_free(parser); 572 684 cxt->lineno++; 685 MRB_CATCH(&c_jmp) { 686 p(mrb, mrb_obj_value(mrb->exc), 0); 687 mrb->exc = 0; 688 } 689 MRB_END_EXC(&c_jmp); 573 690 } 574 691 … … 578 695 #endif 579 696 697 if (args.rfp) fclose(args.rfp); 698 mrb_free(mrb, args.argv); 699 if (args.libv) { 700 for (i = 0; i < args.libc; ++i) { 701 mrb_free(mrb, args.libv[i]); 702 } 703 mrb_free(mrb, args.libv); 704 } 580 705 mrbc_context_free(mrb, cxt); 581 706 mrb_close(mrb); -
EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-bin-mrbc/mrbgem.rake
r321 r439 9 9 mrbc_objs = Dir.glob("#{spec.dir}/tools/mrbc/*.c").map { |f| objfile(f.pathmap("#{spec.build_dir}/tools/mrbc/%n")) }.flatten 10 10 11 file exec => mrbc_objs + [ libfile("#{build.build_dir}/lib/libmruby_core")] do |t|11 file exec => mrbc_objs + [build.libmruby_core_static] do |t| 12 12 build.linker.run t.name, t.prerequisites 13 13 end -
EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-bin-mrbc/tools/mrbc/mrbc.c
r331 r439 1 #include <stdio.h> 1 #include <mruby.h> 2 3 #ifdef MRB_DISABLE_STDIO 4 # error mruby-bin-mrbc conflicts 'MRB_DISABLE_STDIO' configuration in your 'build_config.rb' 5 #endif 6 2 7 #include <stdlib.h> 3 8 #include <string.h> 4 #include <mruby.h>5 9 #include <mruby/compile.h> 6 10 #include <mruby/dump.h> … … 19 23 mrb_bool check_syntax : 1; 20 24 mrb_bool verbose : 1; 25 mrb_bool remove_lv : 1; 21 26 unsigned int flags : 4; 22 27 }; … … 34 39 "-e generate little endian iseq data", 35 40 "-E generate big endian iseq data", 41 "--remove-lv remove local variables", 36 42 "--verbose run at verbose mode", 37 43 "--version print the version", … … 70 76 parse_args(mrb_state *mrb, int argc, char **argv, struct mrbc_args *args) 71 77 { 72 char *outfile = NULL;73 78 static const struct mrbc_args args_zero = { 0 }; 74 79 int i; … … 85 90 if (args->outfile) { 86 91 fprintf(stderr, "%s: an output file is already specified. (%s)\n", 87 args->prog, outfile);92 args->prog, args->outfile); 88 93 return -1; 89 94 } … … 143 148 exit(EXIT_SUCCESS); 144 149 } 150 else if (strcmp(argv[i] + 2, "remove-lv") == 0) { 151 args->remove_lv = TRUE; 152 break; 153 } 145 154 return -1; 146 155 default: … … 179 188 } 180 189 fn = args->argv[args->idx++]; 181 p->f = fopen(fn, "r ");190 p->f = fopen(fn, "rb"); 182 191 if (p->f == NULL) { 183 192 fprintf(stderr, "%s: cannot open program file. (%s)\n", args->prog, fn); … … 206 215 else { 207 216 need_close = TRUE; 208 if ((infile = fopen(input, "r ")) == NULL) {217 if ((infile = fopen(input, "rb")) == NULL) { 209 218 fprintf(stderr, "%s: cannot open program file. (%s)\n", args->prog, input); 210 219 return mrb_nil_value(); … … 233 242 mrb_irep *irep = proc->body.irep; 234 243 244 if (args->remove_lv) { 245 mrb_irep_remove_lv(mrb, irep); 246 } 235 247 if (args->initname) { 236 248 n = mrb_dump_irep_cfunc(mrb, irep, args->flags, wfp, args->initname); -
EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-bin-mruby/bintest/mruby.rb
r331 r439 1 1 require 'tempfile' 2 require 'open3' 3 4 def assert_mruby(exp_out, exp_err, exp_success, args) 5 out, err, stat = Open3.capture3(cmd("mruby"), *args) 6 assert "assert_mruby" do 7 assert_operator(exp_out, :===, out, "standard output") 8 assert_operator(exp_err, :===, err, "standard error") 9 assert_equal(exp_success, stat.success?, "exit success?") 10 end 11 end 2 12 3 13 assert('regression for #1564') do 4 o = `#{cmd('mruby')} -e #{shellquote('<<')} 2>&1` 5 assert_include o, "-e:1:2: syntax error" 6 o = `#{cmd('mruby')} -e #{shellquote('<<-')} 2>&1` 7 assert_include o, "-e:1:3: syntax error" 14 assert_mruby("", /\A-e:1:2: syntax error, .*\n\z/, false, %w[-e <<]) 15 assert_mruby("", /\A-e:1:3: syntax error, .*\n\z/, false, %w[-e <<-]) 8 16 end 9 17 … … 13 21 system "#{cmd('mrbc')} -g -o #{bin.path} #{script.path}" 14 22 o = `#{cmd('mruby')} -b #{bin.path}`.strip 15 assert_equal o, '"ok"'23 assert_equal '"ok"', o 16 24 end 17 25 … … 30 38 # one liner 31 39 assert_equal '"-e"', `#{cmd('mruby')} -e #{shellquote('p $0')}`.chomp 40 end 41 42 assert 'ARGV value' do 43 assert_mruby(%{["ab", "cde"]\n}, "", true, %w[-e p(ARGV) ab cde]) 44 assert_mruby("[]\n", "", true, %w[-e p(ARGV)]) 45 end 46 47 assert('float literal') do 48 script, bin = Tempfile.new('test.rb'), Tempfile.new('test.mrb') 49 File.write script.path, 'p [3.21, 2e308.infinite?, -2e308.infinite?]' 50 system "#{cmd('mrbc')} -g -o #{bin.path} #{script.path}" 51 assert_equal "[3.21, 1, -1]", `#{cmd('mruby')} -b #{bin.path}`.chomp! 32 52 end 33 53 … … 59 79 assert_equal 0, $?.exitstatus 60 80 end 81 82 assert('mruby -c option') do 83 assert_mruby("Syntax OK\n", "", true, ["-c", "-e", "p 1"]) 84 assert_mruby("", /\A-e:1:7: syntax error, .*\n\z/, false, ["-c", "-e", "p 1; 1."]) 85 end 86 87 assert('mruby -d option') do 88 assert_mruby("false\n", "", true, ["-e", "p $DEBUG"]) 89 assert_mruby("true\n", "", true, ["-dep $DEBUG"]) 90 end 91 92 assert('mruby -e option (no code specified)') do 93 assert_mruby("", /\A.*: No code specified for -e\n\z/, false, %w[-e]) 94 end 95 96 assert('mruby -h option') do 97 assert_mruby(/\AUsage: #{Regexp.escape cmd("mruby")} .*/m, "", true, %w[-h]) 98 end 99 100 assert('mruby -r option') do 101 lib = Tempfile.new('lib.rb') 102 lib.write <<EOS 103 class Hoge 104 def hoge 105 :hoge 106 end 107 end 108 EOS 109 lib.flush 110 111 script = Tempfile.new('test.rb') 112 script.write <<EOS 113 print Hoge.new.hoge 114 EOS 115 script.flush 116 assert_equal 'hoge', `#{cmd('mruby')} -r #{lib.path} #{script.path}` 117 assert_equal 0, $?.exitstatus 118 119 assert_equal 'hogeClass', `#{cmd('mruby')} -r #{lib.path} -r #{script.path} -e #{shellquote('print Hoge.class')}` 120 assert_equal 0, $?.exitstatus 121 end 122 123 assert('mruby -r option (no library specified)') do 124 assert_mruby("", /\A.*: No library specified for -r\n\z/, false, %w[-r]) 125 end 126 127 assert('mruby -r option (file not found)') do 128 assert_mruby("", /\A.*: Cannot open library file: .*\n\z/, false, %w[-r _no_exists_]) 129 end 130 131 assert('mruby -v option') do 132 ver_re = '\Amruby \d+\.\d+\.\d+ \(\d+-\d+-\d+\)\n' 133 assert_mruby(/#{ver_re}\z/, "", true, %w[-v]) 134 assert_mruby(/#{ver_re}^[^\n]*NODE.*\n:end\n\z/m, "", true, %w[-v -e p(:end)]) 135 end 136 137 assert('mruby --verbose option') do 138 assert_mruby(/\A[^\n]*NODE.*\n:end\n\z/m, "", true, %w[--verbose -e p(:end)]) 139 end 140 141 assert('mruby --') do 142 assert_mruby(%{["-x", "1"]\n}, "", true, %w[-e p(ARGV) -- -x 1]) 143 end 144 145 assert('mruby invalid short option') do 146 assert_mruby("", /\A.*: invalid option -1 .*\n\z/, false, %w[-1]) 147 end 148 149 assert('mruby invalid long option') do 150 assert_mruby("", /\A.*: invalid option --longopt .*\n\z/, false, %w[--longopt]) 151 end 152 153 assert('unhandled exception') do 154 assert_mruby("", /\bEXCEPTION\b.*\n\z/, false, %w[-e raise("EXCEPTION")]) 155 end 156 157 assert('program file not found') do 158 assert_mruby("", /\A.*: Cannot open program file: .*\n\z/, false, %w[_no_exists_]) 159 end 160 161 assert('codegen error') do 162 code = "def f(#{(1..100).map{|n| "a#{n}"} * ","}); end" 163 assert_mruby("", /\Acodegen error:.*\n\z/, false, ["-e", code]) 164 end -
EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-bin-mruby/mrbgem.rake
r331 r439 6 6 spec.add_dependency('mruby-compiler', :core => 'mruby-compiler') 7 7 spec.add_dependency('mruby-error', :core => 'mruby-error') 8 spec.add_test_dependency('mruby-print', :core => 'mruby-print') 8 9 9 10 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") } 11 build.compile_as_cxx("#{spec.dir}/tools/mruby/mruby.c", "#{spec.build_dir}/tools/mruby/mruby.cxx") 12 12 end 13 13 end -
EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-bin-mruby/tools/mruby/mruby.c
r331 r439 1 #include <stdio.h> 1 #include <mruby.h> 2 3 #ifdef MRB_DISABLE_STDIO 4 # error mruby-bin-mruby conflicts 'MRB_DISABLE_STDIO' configuration in your 'build_config.rb' 5 #endif 6 2 7 #include <stdlib.h> 3 8 #include <string.h> 4 #include <mruby.h>5 9 #include <mruby/array.h> 6 10 #include <mruby/compile.h> … … 8 12 #include <mruby/variable.h> 9 13 10 #ifdef MRB_DISABLE_STDIO11 static void12 p(mrb_state *mrb, mrb_value obj)13 {14 mrb_value val = mrb_inspect(mrb, obj);15 16 fwrite(RSTRING_PTR(val), RSTRING_LEN(val), 1, stdout);17 putc('\n', stdout);18 }19 #else20 #define p(mrb,obj) mrb_p(mrb,obj)21 #endif22 23 14 struct _args { 24 15 FILE *rfp; 25 char *cmdline;16 char *cmdline; 26 17 mrb_bool fname : 1; 27 18 mrb_bool mrbfile : 1; 28 19 mrb_bool check_syntax : 1; 29 20 mrb_bool verbose : 1; 21 mrb_bool version : 1; 22 mrb_bool debug : 1; 30 23 int argc; 31 char** argv; 24 char **argv; 25 int libc; 26 char **libv; 27 }; 28 29 struct options { 30 int argc; 31 char **argv; 32 char *program; 33 char *opt; 34 char short_opt[2]; 32 35 }; 33 36 … … 39 42 "-b load and execute RiteBinary (mrb) file", 40 43 "-c check syntax only", 44 "-d set debugging flags (set $DEBUG to true)", 41 45 "-e 'command' one line of script", 46 "-r library load the library before executing your script", 42 47 "-v print version number, then run in verbose mode", 43 48 "--verbose run in verbose mode", … … 48 53 const char *const *p = usage_msg; 49 54 50 printf("Usage: %s [switches] programfile\n", name);55 printf("Usage: %s [switches] [programfile] [arguments]\n", name); 51 56 while (*p) 52 57 printf(" %s\n", *p++); 53 58 } 54 59 60 static void 61 options_init(struct options *opts, int argc, char **argv) 62 { 63 opts->argc = argc; 64 opts->argv = argv; 65 opts->program = *argv; 66 *opts->short_opt = 0; 67 } 68 69 static const char * 70 options_opt(struct options *opts) 71 { 72 /* concatenated short options (e.g. `-cv`) */ 73 if (*opts->short_opt && *++opts->opt) { 74 short_opt: 75 opts->short_opt[0] = *opts->opt; 76 opts->short_opt[1] = 0; 77 return opts->short_opt; 78 } 79 80 while (++opts->argv, --opts->argc) { 81 opts->opt = *opts->argv; 82 83 /* empty || not start with `-` || `-` */ 84 if (!opts->opt[0] || opts->opt[0] != '-' || !opts->opt[1]) return NULL; 85 86 if (opts->opt[1] == '-') { 87 /* `--` */ 88 if (!opts->opt[2]) { 89 ++opts->argv, --opts->argc; 90 return NULL; 91 } 92 /* long option */ 93 opts->opt += 2; 94 *opts->short_opt = 0; 95 return opts->opt; 96 } 97 else { 98 /* short option */ 99 ++opts->opt; 100 goto short_opt; 101 } 102 } 103 return NULL; 104 } 105 106 static const char * 107 options_arg(struct options *opts) 108 { 109 if (*opts->short_opt && opts->opt[1]) { 110 /* concatenated short option and option argument (e.g. `-rLIBRARY`) */ 111 *opts->short_opt = 0; 112 return opts->opt + 1; 113 } 114 --opts->argc, ++opts->argv; 115 return opts->argc ? *opts->argv : NULL; 116 } 117 118 static char * 119 dup_arg_item(mrb_state *mrb, const char *item) 120 { 121 size_t buflen = strlen(item) + 1; 122 char *buf = (char*)mrb_malloc(mrb, buflen); 123 memcpy(buf, item, buflen); 124 return buf; 125 } 126 55 127 static int 56 128 parse_args(mrb_state *mrb, int argc, char **argv, struct _args *args) 57 129 { 58 char **origargv = argv;59 130 static const struct _args args_zero = { 0 }; 131 struct options opts[1]; 132 const char *opt, *item; 60 133 61 134 *args = args_zero; 62 63 for (argc--,argv++; argc > 0; argc--,argv++) { 64 char *item; 65 if (argv[0][0] != '-') break; 66 67 if (strlen(*argv) <= 1) { 68 argc--; argv++; 69 args->rfp = stdin; 70 break; 71 } 72 73 item = argv[0] + 1; 74 switch (*item++) { 75 case 'b': 135 options_init(opts, argc, argv); 136 while ((opt = options_opt(opts))) { 137 if (strcmp(opt, "b") == 0) { 76 138 args->mrbfile = TRUE; 77 break;78 case 'c':139 } 140 else if (strcmp(opt, "c") == 0) { 79 141 args->check_syntax = TRUE; 80 break; 81 case 'e': 82 if (item[0]) { 83 goto append_cmdline; 84 } 85 else if (argc > 1) { 86 argc--; argv++; 87 item = argv[0]; 88 append_cmdline: 142 } 143 else if (strcmp(opt, "d") == 0) { 144 args->debug = TRUE; 145 } 146 else if (strcmp(opt, "e") == 0) { 147 if ((item = options_arg(opts))) { 89 148 if (!args->cmdline) { 90 size_t buflen; 91 char *buf; 92 93 buflen = strlen(item) + 1; 94 buf = (char *)mrb_malloc(mrb, buflen); 95 memcpy(buf, item, buflen); 96 args->cmdline = buf; 149 args->cmdline = dup_arg_item(mrb, item); 97 150 } 98 151 else { … … 109 162 } 110 163 else { 111 printf("%s: No code specified for -e\n", *origargv); 112 return EXIT_SUCCESS; 113 } 114 break; 115 case 'v': 116 if (!args->verbose) mrb_show_version(mrb); 164 fprintf(stderr, "%s: No code specified for -e\n", opts->program); 165 return EXIT_FAILURE; 166 } 167 } 168 else if (strcmp(opt, "h") == 0) { 169 usage(opts->program); 170 exit(EXIT_SUCCESS); 171 } 172 else if (strcmp(opt, "r") == 0) { 173 if ((item = options_arg(opts))) { 174 if (args->libc == 0) { 175 args->libv = (char**)mrb_malloc(mrb, sizeof(char*)); 176 } 177 else { 178 args->libv = (char**)mrb_realloc(mrb, args->libv, sizeof(char*) * (args->libc + 1)); 179 } 180 args->libv[args->libc++] = dup_arg_item(mrb, item); 181 } 182 else { 183 fprintf(stderr, "%s: No library specified for -r\n", opts->program); 184 return EXIT_FAILURE; 185 } 186 } 187 else if (strcmp(opt, "v") == 0) { 188 if (!args->verbose) { 189 mrb_show_version(mrb); 190 args->version = TRUE; 191 } 117 192 args->verbose = TRUE; 118 break;119 case '-':120 if (strcmp((*argv) + 2, "version") == 0) {121 mrb_show_version(mrb);122 exit(EXIT_SUCCESS);123 }124 else if (strcmp((*argv) + 2, "verbose") == 0) {125 args->verbose = TRUE;126 break;127 }128 e lse if (strcmp((*argv) + 2, "copyright") == 0) {129 mrb_show_copyright(mrb);130 exit(EXIT_SUCCESS);131 }132 default:193 } 194 else if (strcmp(opt, "version") == 0) { 195 mrb_show_version(mrb); 196 exit(EXIT_SUCCESS); 197 } 198 else if (strcmp(opt, "verbose") == 0) { 199 args->verbose = TRUE; 200 } 201 else if (strcmp(opt, "copyright") == 0) { 202 mrb_show_copyright(mrb); 203 exit(EXIT_SUCCESS); 204 } 205 else { 206 fprintf(stderr, "%s: invalid option %s%s (-h will show valid options)\n", 207 opts->program, opt[1] ? "--" : "-", opt); 133 208 return EXIT_FAILURE; 134 209 } 135 210 } 136 211 137 if (args->rfp == NULL && args->cmdline == NULL) { 138 if (*argv == NULL) args->rfp = stdin; 139 else { 140 args->rfp = fopen(argv[0], args->mrbfile ? "rb" : "r"); 212 argc = opts->argc; argv = opts->argv; 213 if (args->cmdline == NULL) { 214 if (*argv == NULL) { 215 if (args->version) exit(EXIT_SUCCESS); 216 args->rfp = stdin; 217 } 218 else { 219 args->rfp = strcmp(argv[0], "-") == 0 ? 220 stdin : fopen(argv[0], args->mrbfile ? "rb" : "r"); 141 221 if (args->rfp == NULL) { 142 printf("%s: Cannot open program file. (%s)\n", *origargv, *argv);222 fprintf(stderr, "%s: Cannot open program file: %s\n", opts->program, argv[0]); 143 223 return EXIT_FAILURE; 144 224 } … … 163 243 mrb_free(mrb, args->cmdline); 164 244 mrb_free(mrb, args->argv); 245 if (args->libc) { 246 while (args->libc--) { 247 mrb_free(mrb, args->libv[args->libc]); 248 } 249 mrb_free(mrb, args->libv); 250 } 165 251 mrb_close(mrb); 166 252 } … … 179 265 180 266 if (mrb == NULL) { 181 fp uts("Invalid mrb_state, exiting mruby\n", stderr);267 fprintf(stderr, "%s: Invalid mrb_state, exiting mruby\n", *argv); 182 268 return EXIT_FAILURE; 183 269 } … … 186 272 if (n == EXIT_FAILURE || (args.cmdline == NULL && args.rfp == NULL)) { 187 273 cleanup(mrb, &args); 188 usage(argv[0]);189 274 return n; 190 275 } … … 200 285 } 201 286 mrb_define_global_const(mrb, "ARGV", ARGV); 287 mrb_gv_set(mrb, mrb_intern_lit(mrb, "$DEBUG"), mrb_bool_value(args.debug)); 202 288 203 289 c = mrbc_context_new(mrb); … … 220 306 } 221 307 308 /* Load libraries */ 309 for (i = 0; i < args.libc; i++) { 310 FILE *lfp = fopen(args.libv[i], args.mrbfile ? "rb" : "r"); 311 if (lfp == NULL) { 312 fprintf(stderr, "%s: Cannot open library file: %s\n", *argv, args.libv[i]); 313 mrbc_context_free(mrb, c); 314 cleanup(mrb, &args); 315 return EXIT_FAILURE; 316 } 317 if (args.mrbfile) { 318 v = mrb_load_irep_file_cxt(mrb, lfp, c); 319 } 320 else { 321 v = mrb_load_file_cxt(mrb, lfp, c); 322 } 323 fclose(lfp); 324 } 325 222 326 /* Load program */ 223 327 if (args.mrbfile) { … … 237 341 mrbc_context_free(mrb, c); 238 342 if (mrb->exc) { 239 if (mrb_undef_p(v)) { 240 mrb_p(mrb, mrb_obj_value(mrb->exc)); 241 } 242 else { 343 if (!mrb_undef_p(v)) { 243 344 mrb_print_error(mrb); 244 345 } 245 n = -1;346 n = EXIT_FAILURE; 246 347 } 247 348 else if (args.check_syntax) { 248 p rintf("Syntax OK\n");349 puts("Syntax OK"); 249 350 } 250 351 } 251 352 cleanup(mrb, &args); 252 353 253 return n == 0 ? EXIT_SUCCESS : EXIT_FAILURE;254 } 354 return n; 355 } -
EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-bin-strip/bintest/mruby-strip.rb
r321 r439 68 68 `#{cmd('mruby-strip')} -l #{without_lv.path}` 69 69 assert_true without_lv.size < with_lv.size 70 71 assert_equal '[:a, :b]', `#{cmd('mruby')} -b #{with_lv.path}`.chomp72 assert_equal '[]', `#{cmd('mruby')} -b #{without_lv.path}`.chomp70 # 71 # assert_equal '[:a, :b]', `#{cmd('mruby')} -b #{with_lv.path}`.chomp 72 # assert_equal '[]', `#{cmd('mruby')} -b #{without_lv.path}`.chomp 73 73 end -
EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-bin-strip/tools/mruby-strip/mruby-strip.c
r331 r439 1 #include <stdio.h> 1 #include <mruby.h> 2 3 #ifdef MRB_DISABLE_STDIO 4 # error mruby-bin-strip conflicts 'MRB_DISABLE_STDIO' configuration in your 'build_config.rb' 5 #endif 6 2 7 #include <stdlib.h> 3 8 #include <string.h> 4 #include <mruby.h>5 9 #include <mruby/irep.h> 6 10 #include <mruby/dump.h> … … 12 16 mrb_bool lvar; 13 17 }; 14 15 16 static void17 irep_remove_lv(mrb_state *mrb, mrb_irep *irep)18 {19 size_t i;20 21 if (irep->lv) {22 mrb_free(mrb, irep->lv);23 irep->lv = NULL;24 }25 26 for (i = 0; i < irep->rlen; ++i) {27 irep_remove_lv(mrb, irep->reps[i]);28 }29 }30 18 31 19 static void … … 100 88 /* clear lv if --lvar is enabled */ 101 89 if (args->lvar) { 102 irep_remove_lv(mrb, irep);90 mrb_irep_remove_lv(mrb, irep); 103 91 } 104 92 -
EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-class-ext/src/class.c
r331 r439 6 6 mrb_mod_name(mrb_state *mrb, mrb_value self) 7 7 { 8 mrb_value name = mrb_class_path(mrb, mrb_class_ptr(self)); 9 return mrb_nil_p(name)? name : mrb_str_dup(mrb, name); 8 mrb_value name = mrb_class_path(mrb, mrb_class_ptr(self)); 9 if (mrb_string_p(name)) { 10 MRB_SET_FROZEN_FLAG(mrb_basic_ptr(name)); 11 } 12 return name; 13 } 14 15 static mrb_value 16 mrb_mod_singleton_class_p(mrb_state *mrb, mrb_value self) 17 { 18 return mrb_bool_value(mrb_sclass_p(self)); 19 } 20 21 /* 22 * call-seq: 23 * module_exec(arg...) {|var...| block } -> obj 24 * class_exec(arg...) {|var...| block } -> obj 25 * 26 * Evaluates the given block in the context of the 27 * class/module. The method defined in the block will belong 28 * to the receiver. Any arguments passed to the method will be 29 * passed to the block. This can be used if the block needs to 30 * access instance variables. 31 * 32 * class Thing 33 * end 34 * Thing.class_exec{ 35 * def hello() "Hello there!" end 36 * } 37 * puts Thing.new.hello() 38 */ 39 40 static mrb_value 41 mrb_mod_module_exec(mrb_state *mrb, mrb_value self) 42 { 43 const mrb_value *argv; 44 mrb_int argc; 45 mrb_value blk; 46 47 mrb_get_args(mrb, "*&!", &argv, &argc, &blk); 48 49 mrb->c->ci->target_class = mrb_class_ptr(self); 50 return mrb_yield_cont(mrb, blk, self, argc, argv); 10 51 } 11 52 … … 16 57 17 58 mrb_define_method(mrb, mod, "name", mrb_mod_name, MRB_ARGS_NONE()); 59 mrb_define_method(mrb, mod, "singleton_class?", mrb_mod_singleton_class_p, MRB_ARGS_NONE()); 60 mrb_define_method(mrb, mod, "module_exec", mrb_mod_module_exec, MRB_ARGS_ANY()|MRB_ARGS_BLOCK()); 61 mrb_define_method(mrb, mod, "class_exec", mrb_mod_module_exec, MRB_ARGS_ANY()|MRB_ARGS_BLOCK()); 18 62 } 19 63 -
EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-class-ext/test/module.rb
r331 r439 1 assert 'Module#<' do 2 a = Class.new 3 b = Class.new(a) 4 c = Class.new(a) 5 d = Module.new 6 e = Class.new { include d } 7 f = Module.new { include d } 8 9 # compare class to class 10 assert_true b < a 11 assert_false b < b 12 assert_false a < b 13 assert_nil c < b 14 15 # compare class to module 16 assert_true e < d 17 assert_false d < e 18 assert_nil a < d 19 20 # compare module to module 21 assert_true f < d 22 assert_false f < f 23 assert_false d < f 24 25 assert_raise(TypeError) { a < Object.new } 26 end 27 28 assert 'Module#<=' do 29 a = Class.new 30 b = Class.new(a) 31 c = Class.new(a) 32 d = Module.new 33 e = Class.new { include d } 34 f = Module.new { include d } 35 36 # compare class to class 37 assert_true b <= a 38 assert_true b <= b 39 assert_false a <= b 40 assert_nil c <= b 41 42 # compare class to module 43 assert_true e <= d 44 assert_false d <= e 45 assert_nil a <= d 46 47 # compare module to module 48 assert_true f <= d 49 assert_true f <= f 50 assert_false d <= f 51 52 assert_raise(TypeError) { a <= Object.new } 53 end 54 1 55 assert 'Module#name' do 2 module A 3 class B 56 module Outer 57 class Inner; end 58 const_set :SetInner, Class.new 59 end 60 61 assert_equal 'Outer', Outer.name 62 assert_equal 'Outer::Inner', Outer::Inner.name 63 assert_equal 'Outer::SetInner', Outer::SetInner.name 64 65 outer = Module.new do 66 const_set :SetInner, Class.new 67 end 68 Object.const_set :SetOuter, outer 69 70 assert_equal 'SetOuter', SetOuter.name 71 assert_equal 'SetOuter::SetInner', SetOuter::SetInner.name 72 73 mod = Module.new 74 cls = Class.new 75 76 assert_nil mod.name 77 assert_nil cls.name 78 end 79 80 assert 'Module#singleton_class?' do 81 mod = Module.new 82 cls = Class.new 83 scl = (class <<cls; self; end) 84 85 assert_false mod.singleton_class? 86 assert_false cls.singleton_class? 87 assert_true scl.singleton_class? 88 end 89 90 assert 'Module#module_eval' do 91 mod = Module.new 92 mod.class_exec(1,2,3) do |a,b,c| 93 assert_equal([1,2,3], [a,b,c]) 94 def hi 95 "hi" 4 96 end 5 97 end 6 7 assert_nil A::B.singleton_class.name 8 assert_equal 'Fixnum', Fixnum.name 9 assert_equal 'A::B', A::B.name 98 cls = Class.new 99 cls.class_exec(42) do |x| 100 assert_equal(42, x) 101 include mod 102 def hello 103 "hello" 104 end 105 end 106 obj = cls.new 107 assert_equal("hi", obj.hi) 108 assert_equal("hello", obj.hello) 10 109 end -
EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-compiler/core/codegen.c
r331 r439 9 9 #include <stdlib.h> 10 10 #include <string.h> 11 #include <math.h> 11 12 #include <mruby.h> 12 13 #include <mruby/compile.h> … … 24 25 #endif 25 26 27 #define MAXARG_S (1<<16) 28 26 29 typedef mrb_ast_node node; 27 30 typedef struct mrb_parser_state parser_state; … … 37 40 struct loopinfo { 38 41 enum looptype type; 39 int pc 1, pc2, pc3, acc;42 int pc0, pc1, pc2, pc3, acc; 40 43 int ensure_level; 41 44 struct loopinfo *prev; … … 51 54 node *lv; 52 55 53 int sp; 54 int pc; 55 int lastlabel; 56 uint16_t sp; 57 uint16_t pc; 58 uint16_t lastpc; 59 uint16_t lastlabel; 56 60 int ainfo:15; 57 61 mrb_bool mscope:1; … … 59 63 struct loopinfo *loop; 60 64 int ensure_level; 61 char const *filename;65 mrb_sym filename_sym; 62 66 uint16_t lineno; 63 67 64 68 mrb_code *iseq; 65 69 uint16_t *lines; 66 int icapa;70 uint32_t icapa; 67 71 68 72 mrb_irep *irep; 69 size_t pcapa; 70 size_t scapa; 71 size_t rcapa; 73 uint32_t pcapa, scapa, rcapa; 72 74 73 75 uint16_t nlocals; … … 101 103 codegen_scope *tmp = s->prev; 102 104 mrb_free(s->mrb, s->iseq); 105 mrb_free(s->mrb, s->lines); 103 106 mrb_pool_close(s->mpool); 104 107 s = tmp; 105 108 } 106 109 #ifndef MRB_DISABLE_STDIO 107 if (s->filename && s->lineno) { 108 fprintf(stderr, "codegen error:%s:%d: %s\n", s->filename, s->lineno, message); 110 if (s->filename_sym && s->lineno) { 111 const char *filename = mrb_sym_name_len(s->mrb, s->filename_sym, NULL); 112 fprintf(stderr, "codegen error:%s:%d: %s\n", filename, s->lineno, message); 109 113 } 110 114 else { … … 125 129 126 130 static void* 127 codegen_malloc(codegen_scope *s, size_t len)128 {129 void *p = mrb_malloc_simple(s->mrb, len);130 131 if (!p) codegen_error(s, "mrb_malloc");132 return p;133 }134 135 static void*136 131 codegen_realloc(codegen_scope *s, void *p, size_t len) 137 132 { … … 145 140 new_label(codegen_scope *s) 146 141 { 147 s->lastlabel = s->pc; 148 return s->pc; 149 } 150 151 static inline int 152 genop(codegen_scope *s, mrb_code i) 153 { 154 if (s->pc == s->icapa) { 142 return s->lastlabel = s->pc; 143 } 144 145 static void 146 emit_B(codegen_scope *s, uint32_t pc, uint8_t i) 147 { 148 if (pc >= MAXARG_S || s->icapa >= MAXARG_S) { 149 codegen_error(s, "too big code block"); 150 } 151 if (pc >= s->icapa) { 155 152 s->icapa *= 2; 153 if (s->icapa > MAXARG_S) { 154 s->icapa = MAXARG_S; 155 } 156 156 s->iseq = (mrb_code *)codegen_realloc(s, s->iseq, sizeof(mrb_code)*s->icapa); 157 157 if (s->lines) { 158 s->lines = (uint16_t*)codegen_realloc(s, s->lines, sizeof(short)*s->icapa); 159 s->irep->lines = s->lines; 160 } 161 } 162 s->iseq[s->pc] = i; 158 s->lines = (uint16_t*)codegen_realloc(s, s->lines, sizeof(uint16_t)*s->icapa); 159 } 160 } 163 161 if (s->lines) { 164 s->lines[s->pc] = s->lineno; 165 } 166 return s->pc++; 162 if (s->lineno > 0 || pc == 0) 163 s->lines[pc] = s->lineno; 164 else 165 s->lines[pc] = s->lines[pc-1]; 166 } 167 s->iseq[pc] = i; 168 } 169 170 static void 171 emit_S(codegen_scope *s, int pc, uint16_t i) 172 { 173 uint8_t hi = i>>8; 174 uint8_t lo = i&0xff; 175 176 emit_B(s, pc, hi); 177 emit_B(s, pc+1, lo); 178 } 179 180 static void 181 gen_B(codegen_scope *s, uint8_t i) 182 { 183 emit_B(s, s->pc, i); 184 s->pc++; 185 } 186 187 static void 188 gen_S(codegen_scope *s, uint16_t i) 189 { 190 emit_S(s, s->pc, i); 191 s->pc += 2; 192 } 193 194 static void 195 genop_0(codegen_scope *s, mrb_code i) 196 { 197 s->lastpc = s->pc; 198 gen_B(s, i); 199 } 200 201 static void 202 genop_1(codegen_scope *s, mrb_code i, uint16_t a) 203 { 204 s->lastpc = s->pc; 205 if (a > 0xff) { 206 gen_B(s, OP_EXT1); 207 gen_B(s, i); 208 gen_S(s, a); 209 } 210 else { 211 gen_B(s, i); 212 gen_B(s, (uint8_t)a); 213 } 214 } 215 216 static void 217 genop_2(codegen_scope *s, mrb_code i, uint16_t a, uint16_t b) 218 { 219 s->lastpc = s->pc; 220 if (a > 0xff && b > 0xff) { 221 gen_B(s, OP_EXT3); 222 gen_B(s, i); 223 gen_S(s, a); 224 gen_S(s, b); 225 } 226 else if (b > 0xff) { 227 gen_B(s, OP_EXT2); 228 gen_B(s, i); 229 gen_B(s, (uint8_t)a); 230 gen_S(s, b); 231 } 232 else if (a > 0xff) { 233 gen_B(s, OP_EXT1); 234 gen_B(s, i); 235 gen_S(s, a); 236 gen_B(s, (uint8_t)b); 237 } 238 else { 239 gen_B(s, i); 240 gen_B(s, (uint8_t)a); 241 gen_B(s, (uint8_t)b); 242 } 243 } 244 245 static void 246 genop_3(codegen_scope *s, mrb_code i, uint16_t a, uint16_t b, uint8_t c) 247 { 248 genop_2(s, i, a, b); 249 gen_B(s, c); 250 } 251 252 static void 253 genop_2S(codegen_scope *s, mrb_code i, uint16_t a, uint16_t b) 254 { 255 genop_1(s, i, a); 256 gen_S(s, b); 257 } 258 259 static void 260 genop_W(codegen_scope *s, mrb_code i, uint32_t a) 261 { 262 uint8_t a1 = (a>>16) & 0xff; 263 uint8_t a2 = (a>>8) & 0xff; 264 uint8_t a3 = a & 0xff; 265 266 s->lastpc = s->pc; 267 gen_B(s, i); 268 gen_B(s, a1); 269 gen_B(s, a2); 270 gen_B(s, a3); 167 271 } 168 272 … … 178 282 } 179 283 180 static int 181 genop_peep(codegen_scope *s, mrb_code i, int val) 182 { 183 /* peephole optimization */ 184 if (!no_optimize(s) && s->lastlabel != s->pc && s->pc > 0) { 185 mrb_code i0 = s->iseq[s->pc-1]; 186 int c1 = GET_OPCODE(i); 187 int c0 = GET_OPCODE(i0); 188 189 switch (c1) { 284 static 285 mrb_bool 286 on_eval(codegen_scope *s) 287 { 288 if (s && s->parser && s->parser->on_eval) 289 return TRUE; 290 return FALSE; 291 } 292 293 struct mrb_insn_data 294 mrb_decode_insn(const mrb_code *pc) 295 { 296 struct mrb_insn_data data = { 0 }; 297 mrb_code insn = READ_B(); 298 uint16_t a = 0; 299 uint16_t b = 0; 300 uint8_t c = 0; 301 302 switch (insn) { 303 #define FETCH_Z() /* empty */ 304 #define OPCODE(i,x) case OP_ ## i: FETCH_ ## x (); break; 305 #include "mruby/ops.h" 306 #undef OPCODE 307 } 308 switch (insn) { 309 case OP_EXT1: 310 insn = READ_B(); 311 switch (insn) { 312 #define OPCODE(i,x) case OP_ ## i: FETCH_ ## x ## _1 (); break; 313 #include "mruby/ops.h" 314 #undef OPCODE 315 } 316 break; 317 case OP_EXT2: 318 insn = READ_B(); 319 switch (insn) { 320 #define OPCODE(i,x) case OP_ ## i: FETCH_ ## x ## _2 (); break; 321 #include "mruby/ops.h" 322 #undef OPCODE 323 } 324 break; 325 case OP_EXT3: 326 insn = READ_B(); 327 switch (insn) { 328 #define OPCODE(i,x) case OP_ ## i: FETCH_ ## x ## _3 (); break; 329 #include "mruby/ops.h" 330 #undef OPCODE 331 } 332 break; 333 default: 334 break; 335 } 336 data.insn = insn; 337 data.a = a; 338 data.b = b; 339 data.c = c; 340 return data; 341 } 342 343 static struct mrb_insn_data 344 mrb_last_insn(codegen_scope *s) 345 { 346 if (s->pc == s->lastpc) { 347 struct mrb_insn_data data; 348 349 data.insn = OP_NOP; 350 return data; 351 } 352 return mrb_decode_insn(&s->iseq[s->lastpc]); 353 } 354 355 static mrb_bool 356 no_peephole(codegen_scope *s) 357 { 358 return no_optimize(s) || s->lastlabel == s->pc || s->pc == 0 || s->pc == s->lastpc; 359 } 360 361 static uint16_t 362 genjmp(codegen_scope *s, mrb_code i, uint16_t pc) 363 { 364 uint16_t pos; 365 366 s->lastpc = s->pc; 367 gen_B(s, i); 368 pos = s->pc; 369 gen_S(s, pc); 370 return pos; 371 } 372 373 static uint16_t 374 genjmp2(codegen_scope *s, mrb_code i, uint16_t a, int pc, int val) 375 { 376 uint16_t pos; 377 378 if (!no_peephole(s) && !val) { 379 struct mrb_insn_data data = mrb_last_insn(s); 380 381 if (data.insn == OP_MOVE && data.a == a) { 382 s->pc = s->lastpc; 383 a = data.b; 384 } 385 } 386 387 s->lastpc = s->pc; 388 if (a > 0xff) { 389 gen_B(s, OP_EXT1); 390 gen_B(s, i); 391 gen_S(s, a); 392 pos = s->pc; 393 gen_S(s, pc); 394 } 395 else { 396 gen_B(s, i); 397 gen_B(s, (uint8_t)a); 398 pos = s->pc; 399 gen_S(s, pc); 400 } 401 return pos; 402 } 403 404 static void 405 gen_move(codegen_scope *s, uint16_t dst, uint16_t src, int nopeep) 406 { 407 if (no_peephole(s)) { 408 normal: 409 genop_2(s, OP_MOVE, dst, src); 410 if (on_eval(s)) { 411 genop_0(s, OP_NOP); 412 } 413 return; 414 } 415 else { 416 struct mrb_insn_data data = mrb_last_insn(s); 417 418 switch (data.insn) { 190 419 case OP_MOVE: 191 if (GETARG_A(i) == GETARG_B(i)) { 192 /* skip useless OP_MOVE */ 193 return 0; 194 } 195 if (val) break; 196 switch (c0) { 197 case OP_MOVE: 198 if (GETARG_A(i) == GETARG_A(i0)) { 199 /* skip overriden OP_MOVE */ 200 s->pc--; 201 s->iseq[s->pc] = i; 202 } 203 if (GETARG_B(i) == GETARG_A(i0) && GETARG_A(i) == GETARG_B(i0)) { 204 /* skip swapping OP_MOVE */ 205 return 0; 206 } 207 if (GETARG_B(i) == GETARG_A(i0) && GETARG_A(i0) >= s->nlocals) { 208 s->pc--; 209 return genop_peep(s, MKOP_AB(OP_MOVE, GETARG_A(i), GETARG_B(i0)), val); 210 } 211 break; 212 case OP_LOADI: 213 if (GETARG_B(i) == GETARG_A(i0) && GETARG_A(i0) >= s->nlocals) { 214 s->iseq[s->pc-1] = MKOP_AsBx(OP_LOADI, GETARG_A(i), GETARG_sBx(i0)); 215 return 0; 216 } 217 break; 218 case OP_ARRAY: 219 case OP_HASH: 220 case OP_RANGE: 221 case OP_AREF: 222 case OP_GETUPVAR: 223 if (GETARG_B(i) == GETARG_A(i0) && GETARG_A(i0) >= s->nlocals) { 224 s->iseq[s->pc-1] = MKOP_ABC(c0, GETARG_A(i), GETARG_B(i0), GETARG_C(i0)); 225 return 0; 226 } 227 break; 228 case OP_LOADSYM: 229 case OP_GETGLOBAL: 230 case OP_GETIV: 231 case OP_GETCV: 232 case OP_GETCONST: 233 case OP_GETSPECIAL: 234 case OP_LOADL: 235 case OP_STRING: 236 if (GETARG_B(i) == GETARG_A(i0) && GETARG_A(i0) >= s->nlocals) { 237 s->iseq[s->pc-1] = MKOP_ABx(c0, GETARG_A(i), GETARG_Bx(i0)); 238 return 0; 239 } 240 break; 241 case OP_SCLASS: 242 if (GETARG_B(i) == GETARG_A(i0) && GETARG_A(i0) >= s->nlocals) { 243 s->iseq[s->pc-1] = MKOP_AB(c0, GETARG_A(i), GETARG_B(i0)); 244 return 0; 245 } 246 break; 247 case OP_LOADNIL: 248 case OP_LOADSELF: 249 case OP_LOADT: 250 case OP_LOADF: 251 case OP_OCLASS: 252 if (GETARG_B(i) == GETARG_A(i0) && GETARG_A(i0) >= s->nlocals) { 253 s->iseq[s->pc-1] = MKOP_A(c0, GETARG_A(i)); 254 return 0; 255 } 256 break; 257 default: 258 break; 259 } 420 if (dst == src) return; /* remove useless MOVE */ 421 if (data.b == dst && data.a == src) /* skip swapping MOVE */ 422 return; 423 goto normal; 424 case OP_LOADNIL: case OP_LOADSELF: case OP_LOADT: case OP_LOADF: 425 case OP_LOADI__1: 426 case OP_LOADI_0: case OP_LOADI_1: case OP_LOADI_2: case OP_LOADI_3: 427 case OP_LOADI_4: case OP_LOADI_5: case OP_LOADI_6: case OP_LOADI_7: 428 if (nopeep || data.a != src || data.a < s->nlocals) goto normal; 429 s->pc = s->lastpc; 430 genop_1(s, data.insn, dst); 260 431 break; 261 case OP_SETIV: 262 case OP_SETCV: 263 case OP_SETCONST: 264 case OP_SETMCNST: 265 case OP_SETGLOBAL: 266 if (val) break; 267 if (c0 == OP_MOVE) { 268 if (GETARG_A(i) == GETARG_A(i0)) { 269 s->iseq[s->pc-1] = MKOP_ABx(c1, GETARG_B(i0), GETARG_Bx(i)); 270 return 0; 271 } 272 } 273 break; 274 case OP_SETUPVAR: 275 if (val) break; 276 if (c0 == OP_MOVE) { 277 if (GETARG_A(i) == GETARG_A(i0)) { 278 s->iseq[s->pc-1] = MKOP_ABC(c1, GETARG_B(i0), GETARG_B(i), GETARG_C(i)); 279 return 0; 280 } 281 } 282 break; 283 case OP_EPOP: 284 if (c0 == OP_EPOP) { 285 s->iseq[s->pc-1] = MKOP_A(OP_EPOP, GETARG_A(i0)+GETARG_A(i)); 286 return 0; 287 } 288 break; 289 case OP_POPERR: 290 if (c0 == OP_POPERR) { 291 s->iseq[s->pc-1] = MKOP_A(OP_POPERR, GETARG_A(i0)+GETARG_A(i)); 292 return 0; 293 } 294 break; 295 case OP_RETURN: 296 switch (c0) { 297 case OP_RETURN: 298 return 0; 299 case OP_MOVE: 300 if (GETARG_A(i0) >= s->nlocals) { 301 s->iseq[s->pc-1] = MKOP_AB(OP_RETURN, GETARG_B(i0), OP_R_NORMAL); 302 return 0; 303 } 304 break; 305 case OP_SETIV: 306 case OP_SETCV: 307 case OP_SETCONST: 308 case OP_SETMCNST: 309 case OP_SETUPVAR: 310 case OP_SETGLOBAL: 311 s->pc--; 312 genop_peep(s, i0, NOVAL); 313 i0 = s->iseq[s->pc-1]; 314 return genop(s, MKOP_AB(OP_RETURN, GETARG_A(i0), OP_R_NORMAL)); 315 #if 0 316 case OP_SEND: 317 if (GETARG_B(i) == OP_R_NORMAL && GETARG_A(i) == GETARG_A(i0)) { 318 s->iseq[s->pc-1] = MKOP_ABC(OP_TAILCALL, GETARG_A(i0), GETARG_B(i0), GETARG_C(i0)); 319 return; 320 } 321 break; 322 #endif 323 default: 324 break; 325 } 326 break; 327 case OP_ADD: 328 case OP_SUB: 329 if (c0 == OP_LOADI) { 330 int c = GETARG_sBx(i0); 331 332 if (c1 == OP_SUB) c = -c; 333 if (c > 127 || c < -127) break; 334 if (0 <= c) 335 s->iseq[s->pc-1] = MKOP_ABC(OP_ADDI, GETARG_A(i), GETARG_B(i), c); 336 else 337 s->iseq[s->pc-1] = MKOP_ABC(OP_SUBI, GETARG_A(i), GETARG_B(i), -c); 338 return 0; 339 } 340 case OP_STRCAT: 341 if (c0 == OP_STRING) { 342 mrb_value v = s->irep->pool[GETARG_Bx(i0)]; 343 344 if (mrb_string_p(v) && RSTRING_LEN(v) == 0) { 345 s->pc--; 346 return 0; 347 } 348 } 349 if (c0 == OP_LOADNIL) { 350 if (GETARG_B(i) == GETARG_A(i0)) { 351 s->pc--; 352 return 0; 353 } 354 } 355 break; 356 case OP_JMPIF: 357 case OP_JMPNOT: 358 if (c0 == OP_MOVE && GETARG_A(i) == GETARG_A(i0)) { 359 s->iseq[s->pc-1] = MKOP_AsBx(c1, GETARG_B(i0), GETARG_sBx(i)); 360 return s->pc-1; 361 } 432 case OP_LOADI: case OP_LOADINEG: case OP_LOADL: case OP_LOADSYM: 433 case OP_GETGV: case OP_GETSV: case OP_GETIV: case OP_GETCV: 434 case OP_GETCONST: case OP_STRING: 435 case OP_LAMBDA: case OP_BLOCK: case OP_METHOD: case OP_BLKPUSH: 436 if (nopeep || data.a != src || data.a < s->nlocals) goto normal; 437 s->pc = s->lastpc; 438 genop_2(s, data.insn, dst, data.b); 362 439 break; 363 440 default: 441 goto normal; 442 } 443 } 444 } 445 446 static void 447 gen_return(codegen_scope *s, uint8_t op, uint16_t src) 448 { 449 if (no_peephole(s)) { 450 genop_1(s, op, src); 451 } 452 else { 453 struct mrb_insn_data data = mrb_last_insn(s); 454 455 if (data.insn == OP_MOVE && src == data.a) { 456 s->pc = s->lastpc; 457 genop_1(s, op, data.b); 458 } 459 else if (data.insn != OP_RETURN) { 460 genop_1(s, op, src); 461 } 462 } 463 } 464 465 static void 466 gen_addsub(codegen_scope *s, uint8_t op, uint16_t dst) 467 { 468 if (no_peephole(s)) { 469 normal: 470 genop_1(s, op, dst); 471 return; 472 } 473 else { 474 struct mrb_insn_data data = mrb_last_insn(s); 475 476 switch (data.insn) { 477 case OP_LOADI__1: 478 if (op == OP_ADD) op = OP_SUB; 479 else op = OP_ADD; 480 data.b = 1; 481 goto replace; 482 case OP_LOADI_0: case OP_LOADI_1: case OP_LOADI_2: case OP_LOADI_3: 483 case OP_LOADI_4: case OP_LOADI_5: case OP_LOADI_6: case OP_LOADI_7: 484 data.b = data.insn - OP_LOADI_0; 485 /* fall through */ 486 case OP_LOADI: 487 replace: 488 if (data.b >= 128) goto normal; 489 s->pc = s->lastpc; 490 if (op == OP_ADD) { 491 genop_2(s, OP_ADDI, dst, (uint8_t)data.b); 492 } 493 else { 494 genop_2(s, OP_SUBI, dst, (uint8_t)data.b); 495 } 364 496 break; 365 } 366 } 367 return genop(s, i); 497 default: 498 goto normal; 499 } 500 } 501 } 502 503 static int 504 dispatch(codegen_scope *s, uint16_t pos0) 505 { 506 uint16_t newpos; 507 508 s->lastlabel = s->pc; 509 newpos = PEEK_S(s->iseq+pos0); 510 emit_S(s, pos0, s->pc); 511 return newpos; 368 512 } 369 513 370 514 static void 371 scope_error(codegen_scope *s) 372 { 373 exit(EXIT_FAILURE); 374 } 375 376 static inline void 377 dispatch(codegen_scope *s, int pc) 378 { 379 int diff = s->pc - pc; 380 mrb_code i = s->iseq[pc]; 381 int c = GET_OPCODE(i); 382 383 s->lastlabel = s->pc; 384 switch (c) { 385 case OP_JMP: 386 case OP_JMPIF: 387 case OP_JMPNOT: 388 case OP_ONERR: 389 break; 390 default: 391 #ifndef MRB_DISABLE_STDIO 392 fprintf(stderr, "bug: dispatch on non JMP op\n"); 393 #endif 394 scope_error(s); 395 break; 396 } 397 if (diff > MAXARG_sBx) { 398 codegen_error(s, "too distant jump address"); 399 } 400 s->iseq[pc] = MKOP_AsBx(c, GETARG_A(i), diff); 401 } 402 403 static void 404 dispatch_linked(codegen_scope *s, int pc) 405 { 406 mrb_code i; 407 int pos; 408 409 if (!pc) return; 515 dispatch_linked(codegen_scope *s, uint16_t pos) 516 { 517 if (pos==0) return; 410 518 for (;;) { 411 i = s->iseq[pc]; 412 pos = GETARG_sBx(i); 413 dispatch(s, pc); 414 if (!pos) break; 415 pc = pos; 519 pos = dispatch(s, pos); 520 if (pos==0) break; 416 521 } 417 522 } … … 419 524 #define nregs_update do {if (s->sp > s->nregs) s->nregs = s->sp;} while (0) 420 525 static void 421 push_(codegen_scope *s) 422 { 423 if (s->sp > 511) { 424 codegen_error(s, "too complex expression"); 425 } 426 s->sp++; 427 nregs_update; 428 } 429 430 static void 431 push_n_(codegen_scope *s, size_t n) 432 { 433 if (s->sp+n > 511) { 526 push_n_(codegen_scope *s, int n) 527 { 528 if (s->sp+n >= 0xffff) { 434 529 codegen_error(s, "too complex expression"); 435 530 } … … 438 533 } 439 534 440 #define push() push_(s) 535 static void 536 pop_n_(codegen_scope *s, int n) 537 { 538 if ((int)s->sp-n < 0) { 539 codegen_error(s, "stack pointer underflow"); 540 } 541 s->sp-=n; 542 } 543 544 #define push() push_n_(s,1) 441 545 #define push_n(n) push_n_(s,n) 442 #define pop_(s) ((s)->sp--) 443 #define pop() pop_(s) 444 #define pop_n(n) (s->sp-=(n)) 546 #define pop() pop_n_(s,1) 547 #define pop_n(n) pop_n_(s,n) 445 548 #define cursp() (s->sp) 446 549 … … 448 551 new_lit(codegen_scope *s, mrb_value val) 449 552 { 450 size_t i;553 int i; 451 554 mrb_value *pv; 452 555 … … 457 560 pv = &s->irep->pool[i]; 458 561 459 if ( mrb_type(*pv) != MRB_TT_STRING) continue;562 if (!mrb_string_p(*pv)) continue; 460 563 if ((len = RSTRING_LEN(*pv)) != RSTRING_LEN(val)) continue; 461 564 if (memcmp(RSTRING_PTR(*pv), RSTRING_PTR(val), len) == 0) … … 463 566 } 464 567 break; 568 #ifndef MRB_WITHOUT_FLOAT 465 569 case MRB_TT_FLOAT: 466 570 for (i=0; i<s->irep->plen; i++) { 571 mrb_float f1, f2; 467 572 pv = &s->irep->pool[i]; 468 if (mrb_type(*pv) != MRB_TT_FLOAT) continue; 469 if (mrb_float(*pv) == mrb_float(val)) return i; 470 } 471 break; 573 if (!mrb_float_p(*pv)) continue; 574 f1 = mrb_float(*pv); 575 f2 = mrb_float(val); 576 if (f1 == f2 && !signbit(f1) == !signbit(f2)) return i; 577 } 578 break; 579 #endif 472 580 case MRB_TT_FIXNUM: 473 581 for (i=0; i<s->irep->plen; i++) { … … 492 600 switch (mrb_type(val)) { 493 601 case MRB_TT_STRING: 494 *pv = mrb_str_pool(s->mrb, val); 495 break; 496 602 *pv = mrb_str_pool(s->mrb, RSTRING_PTR(val), RSTRING_LEN(val), RSTR_NOFREE_P(RSTRING(val))); 603 break; 604 605 #ifndef MRB_WITHOUT_FLOAT 497 606 case MRB_TT_FLOAT: 498 607 #ifdef MRB_WORD_BOXING … … 500 609 break; 501 610 #endif 611 #endif 502 612 case MRB_TT_FIXNUM: 503 613 *pv = val; … … 511 621 } 512 622 513 /* method symbols should be fit in 9 bits */514 #define MAXMSYMLEN 512515 623 /* maximum symbol numbers */ 516 #define MAXSYMLEN 65536624 #define MAXSYMLEN 0x10000 517 625 518 626 static int 519 new_ msym(codegen_scope *s, mrb_sym sym)520 { 521 size_t i, len;627 new_sym(codegen_scope *s, mrb_sym sym) 628 { 629 int i, len; 522 630 523 631 mrb_assert(s->irep); 524 632 525 633 len = s->irep->slen; 526 if (len > MAXMSYMLEN) len = MAXMSYMLEN;527 634 for (i=0; i<len; i++) { 528 635 if (s->irep->syms[i] == sym) return i; 529 if (s->irep->syms[i] == 0) break; 530 } 531 if (i == MAXMSYMLEN) { 532 codegen_error(s, "too many symbols (max " MRB_STRINGIZE(MAXMSYMLEN) ")"); 533 } 534 s->irep->syms[i] = sym; 535 if (i == s->irep->slen) s->irep->slen++; 536 return i; 537 } 538 539 static int 540 new_sym(codegen_scope *s, mrb_sym sym) 541 { 542 size_t i; 543 544 for (i=0; i<s->irep->slen; i++) { 545 if (s->irep->syms[i] == sym) return i; 546 } 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++) { 555 static const mrb_sym mrb_sym_zero = { 0 }; 556 s->irep->syms[i] = mrb_sym_zero; 557 } 558 s->irep->slen = MAXMSYMLEN; 636 } 637 if (s->irep->slen >= s->scapa) { 638 s->scapa *= 2; 639 s->irep->syms = (mrb_sym*)codegen_realloc(s, s->irep->syms, sizeof(mrb_sym)*s->scapa); 559 640 } 560 641 s->irep->syms[s->irep->slen] = sym; … … 574 655 } 575 656 576 #define sym(x) ((mrb_sym)(intptr_t)(x)) 577 #define lv_name(lv) sym((lv)->car) 657 #define nint(x) ((int)(intptr_t)(x)) 658 #define nchar(x) ((char)(intptr_t)(x)) 659 #define nsym(x) ((mrb_sym)(intptr_t)(x)) 660 661 #define lv_name(lv) nsym((lv)->car) 662 578 663 static int 579 664 lv_idx(codegen_scope *s, mrb_sym id) … … 597 682 struct loopinfo *lp; 598 683 node *n2; 599 mrb_code c;600 684 601 685 /* generate receiver */ … … 603 687 /* generate loop-block */ 604 688 s = scope_new(s->mrb, s, NULL); 605 if (s == NULL) {606 raise_error(prev, "unexpected scope");607 }608 689 609 690 push(); /* push for a block parameter */ … … 611 692 /* generate loop variable */ 612 693 n2 = tree->car; 613 genop (s, MKOP_Ax(OP_ENTER, 0x40000));694 genop_W(s, OP_ENTER, 0x40000); 614 695 if (n2->car && !n2->car->cdr && !n2->cdr) { 615 696 gen_assignment(s, n2->car->car, 1, NOVAL); … … 625 706 codegen(s, tree->cdr->cdr->car, VAL); 626 707 pop(); 627 if (s->pc > 0) { 628 c = s->iseq[s->pc-1]; 629 if (GET_OPCODE(c) != OP_RETURN || GETARG_B(c) != OP_R_NORMAL || s->pc == s->lastlabel) 630 genop_peep(s, MKOP_AB(OP_RETURN, cursp(), OP_R_NORMAL), NOVAL); 631 } 708 gen_return(s, OP_RETURN, cursp()); 632 709 loop_pop(s, NOVAL); 633 710 scope_finish(s); 634 711 s = prev; 635 genop(s, MKOP_Abc(OP_LAMBDA, cursp(), s->irep->rlen-1, OP_L_BLOCK)); 712 genop_2(s, OP_BLOCK, cursp(), s->irep->rlen-1); 713 push();pop(); /* space for a block */ 636 714 pop(); 637 idx = new_ msym(s, mrb_intern_lit(s->mrb, "each"));638 genop (s, MKOP_ABC(OP_SENDB, cursp(), idx, 0));715 idx = new_sym(s, mrb_intern_lit(s->mrb, "each")); 716 genop_3(s, OP_SENDB, cursp(), idx, 0); 639 717 } 640 718 … … 642 720 lambda_body(codegen_scope *s, node *tree, int blk) 643 721 { 644 mrb_code c;645 722 codegen_scope *parent = s; 646 723 s = scope_new(s->mrb, s, tree->car); 647 if (s == NULL) {648 raise_error(parent, "unexpected scope");649 }650 724 651 725 s->mscope = !blk; … … 653 727 if (blk) { 654 728 struct loopinfo *lp = loop_push(s, LOOP_BLOCK); 655 lp->pc 1= new_label(s);729 lp->pc0 = new_label(s); 656 730 } 657 731 tree = tree->cdr; 658 if (tree->car) { 732 if (tree->car == NULL) { 733 genop_W(s, OP_ENTER, 0); 734 } 735 else { 659 736 mrb_aspec a; 660 737 int ma, oa, ra, pa, ka, kd, ba; 661 738 int pos, i; 662 node *n, *opt; 663 739 node *opt; 740 node *margs, *pargs; 741 node *tail; 742 743 /* mandatory arguments */ 664 744 ma = node_len(tree->car->car); 665 n= tree->car->car;666 while (n) {667 n = n->cdr; 668 }745 margs = tree->car->car; 746 tail = tree->car->cdr->cdr->cdr->cdr; 747 748 /* optional arguments */ 669 749 oa = node_len(tree->car->cdr->car); 750 /* rest argument? */ 670 751 ra = tree->car->cdr->cdr->car ? 1 : 0; 752 /* mandatory arugments after rest argument */ 671 753 pa = node_len(tree->car->cdr->cdr->cdr->car); 672 ka = kd = 0; 673 ba = tree->car->cdr->cdr->cdr->cdr ? 1 : 0; 754 pargs = tree->car->cdr->cdr->cdr->car; 755 /* keyword arguments */ 756 ka = tail? node_len(tail->cdr->car) : 0; 757 /* keyword dictionary? */ 758 kd = tail && tail->cdr->cdr->car? 1 : 0; 759 /* block argument? */ 760 ba = tail && tail->cdr->cdr->cdr->car ? 1 : 0; 674 761 675 762 if (ma > 0x1f || oa > 0x1f || pa > 0x1f || ka > 0x1f) { 676 763 codegen_error(s, "too many formal arguments"); 677 764 } 678 a = ((mrb_aspec)(ma & 0x1f) << 18) 679 | ((mrb_aspec)(oa & 0x1f) << 13) 680 | ((ra & 1) << 12) 681 | ((pa & 0x1f) << 7) 682 | ((ka & 0x1f) << 2) 683 | ((kd & 1)<< 1) 684 | (ba & 1); 685 s->ainfo = (((ma+oa) & 0x3f) << 6) /* (12bits = 6:1:5) */ 686 | ((ra & 1) << 5) 687 | (pa & 0x1f); 688 genop(s, MKOP_Ax(OP_ENTER, a)); 765 a = MRB_ARGS_REQ(ma) 766 | MRB_ARGS_OPT(oa) 767 | (ra? MRB_ARGS_REST() : 0) 768 | MRB_ARGS_POST(pa) 769 | MRB_ARGS_KEY(ka, kd) 770 | (ba? MRB_ARGS_BLOCK() : 0); 771 s->ainfo = (((ma+oa) & 0x3f) << 7) /* (12bits = 5:1:5:1) */ 772 | ((ra & 0x1) << 6) 773 | ((pa & 0x1f) << 1) 774 | ((ka | kd) != 0 ? 0x01 : 0x00); 775 genop_W(s, OP_ENTER, a); 776 /* generate jump table for optional arguments initializer */ 689 777 pos = new_label(s); 690 778 for (i=0; i<oa; i++) { 691 779 new_label(s); 692 gen op(s, MKOP_sBx(OP_JMP, 0));780 genjmp(s, OP_JMP, 0); 693 781 } 694 782 if (oa > 0) { 695 gen op(s, MKOP_sBx(OP_JMP, 0));783 genjmp(s, OP_JMP, 0); 696 784 } 697 785 opt = tree->car->cdr->car; … … 700 788 int idx; 701 789 702 dispatch(s, pos+i );790 dispatch(s, pos+i*3+1); 703 791 codegen(s, opt->car->cdr, VAL); 704 idx = lv_idx(s, (mrb_sym)(intptr_t)opt->car->car);705 792 pop(); 706 genop_peep(s, MKOP_AB(OP_MOVE, idx, cursp()), NOVAL); 793 idx = lv_idx(s, nsym(opt->car->car)); 794 gen_move(s, idx, cursp(), 0); 707 795 i++; 708 796 opt = opt->cdr; 709 797 } 710 798 if (oa > 0) { 711 dispatch(s, pos+i); 712 } 713 } 799 dispatch(s, pos+i*3+1); 800 } 801 802 /* keyword arguments */ 803 if (tail) { 804 node *kwds = tail->cdr->car; 805 int kwrest = 0; 806 807 if (tail->cdr->cdr->car) { 808 kwrest = 1; 809 } 810 mrb_assert(nint(tail->car) == NODE_ARGS_TAIL); 811 mrb_assert(node_len(tail) == 4); 812 813 while (kwds) { 814 int jmpif_key_p, jmp_def_set = -1; 815 node *kwd = kwds->car, *def_arg = kwd->cdr->cdr->car; 816 mrb_sym kwd_sym = nsym(kwd->cdr->car); 817 818 mrb_assert(nint(kwd->car) == NODE_KW_ARG); 819 820 if (def_arg) { 821 genop_2(s, OP_KEY_P, lv_idx(s, kwd_sym), new_sym(s, kwd_sym)); 822 jmpif_key_p = genjmp2(s, OP_JMPIF, lv_idx(s, kwd_sym), 0, 0); 823 codegen(s, def_arg, VAL); 824 pop(); 825 gen_move(s, lv_idx(s, kwd_sym), cursp(), 0); 826 jmp_def_set = genjmp(s, OP_JMP, 0); 827 dispatch(s, jmpif_key_p); 828 } 829 genop_2(s, OP_KARG, lv_idx(s, kwd_sym), new_sym(s, kwd_sym)); 830 if (jmp_def_set != -1) { 831 dispatch(s, jmp_def_set); 832 } 833 i++; 834 835 kwds = kwds->cdr; 836 } 837 if (tail->cdr->car && !kwrest) { 838 genop_0(s, OP_KEYEND); 839 } 840 } 841 842 /* argument destructuring */ 843 if (margs) { 844 node *n = margs; 845 846 pos = 1; 847 while (n) { 848 if (nint(n->car->car) == NODE_MASGN) { 849 gen_vmassignment(s, n->car->cdr->car, pos, NOVAL); 850 } 851 pos++; 852 n = n->cdr; 853 } 854 } 855 if (pargs) { 856 node *n = margs; 857 858 pos = ma+oa+ra+1; 859 while (n) { 860 if (nint(n->car->car) == NODE_MASGN) { 861 gen_vmassignment(s, n->car->cdr->car, pos, NOVAL); 862 } 863 pos++; 864 n = n->cdr; 865 } 866 } 867 } 868 714 869 codegen(s, tree->cdr->car, VAL); 715 870 pop(); 716 871 if (s->pc > 0) { 717 c = s->iseq[s->pc-1]; 718 if (GET_OPCODE(c) != OP_RETURN || GETARG_B(c) != OP_R_NORMAL || s->pc == s->lastlabel) { 719 if (s->nregs == 0) { 720 genop(s, MKOP_A(OP_LOADNIL, 0)); 721 genop(s, MKOP_AB(OP_RETURN, 0, OP_R_NORMAL)); 722 } 723 else { 724 genop_peep(s, MKOP_AB(OP_RETURN, cursp(), OP_R_NORMAL), NOVAL); 725 } 726 } 872 gen_return(s, OP_RETURN, cursp()); 727 873 } 728 874 if (blk) { … … 737 883 { 738 884 codegen_scope *scope = scope_new(s->mrb, s, tree->car); 739 if (scope == NULL) {740 raise_error(s, "unexpected scope");741 }742 885 743 886 codegen(scope, tree->cdr, VAL); 887 gen_return(scope, OP_RETURN, scope->sp-1); 744 888 if (!s->iseq) { 745 genop(scope, MKOP_A(OP_STOP, 0)); 746 } 747 else if (!val) { 748 genop(scope, MKOP_AB(OP_RETURN, 0, OP_R_NORMAL)); 749 } 750 else { 751 if (scope->nregs == 0) { 752 genop(scope, MKOP_A(OP_LOADNIL, 0)); 753 genop(scope, MKOP_AB(OP_RETURN, 0, OP_R_NORMAL)); 754 } 755 else { 756 genop_peep(scope, MKOP_AB(OP_RETURN, scope->sp-1, OP_R_NORMAL), NOVAL); 757 } 889 genop_0(scope, OP_STOP); 758 890 } 759 891 scope_finish(scope); … … 769 901 { 770 902 while (t) { 771 if ( (intptr_t)t->car->car== NODE_SPLAT) return FALSE;903 if (nint(t->car->car) == NODE_SPLAT) return FALSE; 772 904 t = t->cdr; 773 905 } … … 782 914 char *name2; 783 915 784 name = mrb_sym 2name_len(s->mrb, a, &len);916 name = mrb_sym_name_len(s->mrb, a, &len); 785 917 name2 = (char *)codegen_palloc(s, 786 918 (size_t)len … … 805 937 806 938 while (t) { 807 is_splat = (intptr_t)t->car->car== NODE_SPLAT; /* splat mode */939 is_splat = nint(t->car->car) == NODE_SPLAT; /* splat mode */ 808 940 if ( 809 941 n+extra >= CALL_MAXARGS - 1 /* need to subtract one because vm.c expects an array if n == CALL_MAXARGS */ 810 942 || is_splat) { 811 943 if (val) { 812 if (is_splat && n == 0 && (intptr_t)t->car->cdr->car== NODE_ARRAY) {944 if (is_splat && n == 0 && nint(t->car->cdr->car) == NODE_ARRAY) { 813 945 codegen(s, t->car->cdr, VAL); 814 946 pop(); … … 816 948 else { 817 949 pop_n(n); 818 genop(s, MKOP_ABC(OP_ARRAY, cursp(), cursp(), n)); 950 if (n == 0 && is_splat) { 951 genop_1(s, OP_LOADNIL, cursp()); 952 } 953 else { 954 genop_2(s, OP_ARRAY, cursp(), n); 955 } 819 956 push(); 820 957 codegen(s, t->car, VAL); 821 958 pop(); pop(); 822 959 if (is_splat) { 823 genop (s, MKOP_AB(OP_ARYCAT, cursp(), cursp()+1));960 genop_1(s, OP_ARYCAT, cursp()); 824 961 } 825 962 else { 826 genop (s, MKOP_AB(OP_ARYPUSH, cursp(), cursp()+1));963 genop_1(s, OP_ARYPUSH, cursp()); 827 964 } 828 965 } … … 832 969 codegen(s, t->car, VAL); 833 970 pop(); pop(); 834 if ( (intptr_t)t->car->car== NODE_SPLAT) {835 genop (s, MKOP_AB(OP_ARYCAT, cursp(), cursp()+1));971 if (nint(t->car->car) == NODE_SPLAT) { 972 genop_1(s, OP_ARYCAT, cursp()); 836 973 } 837 974 else { 838 genop (s, MKOP_AB(OP_ARYPUSH, cursp(), cursp()+1));975 genop_1(s, OP_ARYPUSH, cursp()); 839 976 } 840 977 t = t->cdr; … … 860 997 gen_call(codegen_scope *s, node *tree, mrb_sym name, int sp, int val, int safe) 861 998 { 862 mrb_sym sym = name ? name : sym(tree->cdr->car);863 int idx,skip = 0;999 mrb_sym sym = name ? name : nsym(tree->cdr->car); 1000 int skip = 0; 864 1001 int n = 0, noop = 0, sendv = 0, blk = 0; 865 1002 … … 867 1004 if (safe) { 868 1005 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 } 878 idx = new_msym(s, sym); 1006 gen_move(s, cursp(), recv, 1); 1007 skip = genjmp2(s, OP_JMPNIL, cursp(), 0, val); 1008 } 879 1009 tree = tree->cdr->cdr->car; 880 1010 if (tree) { … … 885 1015 } 886 1016 } 887 if (sp) { 1017 if (sp) { /* last argument pushed (attr=) */ 888 1018 if (sendv) { 1019 gen_move(s, cursp(), sp, 0); 889 1020 pop(); 890 genop (s, MKOP_AB(OP_ARYPUSH, cursp(), sp));1021 genop_1(s, OP_ARYPUSH, cursp()); 891 1022 push(); 892 1023 } 893 1024 else { 894 gen op(s, MKOP_AB(OP_MOVE, cursp(), sp));1025 gen_move(s, cursp(), sp, 0); 895 1026 push(); 896 1027 n++; … … 901 1032 codegen(s, tree->cdr, VAL); 902 1033 pop(); 903 } 904 else { 905 blk = cursp(); 1034 blk = 1; 906 1035 } 907 1036 push();pop(); … … 909 1038 { 910 1039 mrb_int symlen; 911 const char *symname = mrb_sym 2name_len(s->mrb, sym, &symlen);1040 const char *symname = mrb_sym_name_len(s->mrb, sym, &symlen); 912 1041 913 1042 if (!noop && symlen == 1 && symname[0] == '+' && n == 1) { 914 gen op_peep(s, MKOP_ABC(OP_ADD, cursp(), idx, n), val);1043 gen_addsub(s, OP_ADD, cursp()); 915 1044 } 916 1045 else if (!noop && symlen == 1 && symname[0] == '-' && n == 1) { 917 gen op_peep(s, MKOP_ABC(OP_SUB, cursp(), idx, n), val);1046 gen_addsub(s, OP_SUB, cursp()); 918 1047 } 919 1048 else if (!noop && symlen == 1 && symname[0] == '*' && n == 1) { 920 genop (s, MKOP_ABC(OP_MUL, cursp(), idx, n));1049 genop_1(s, OP_MUL, cursp()); 921 1050 } 922 1051 else if (!noop && symlen == 1 && symname[0] == '/' && n == 1) { 923 genop (s, MKOP_ABC(OP_DIV, cursp(), idx, n));1052 genop_1(s, OP_DIV, cursp()); 924 1053 } 925 1054 else if (!noop && symlen == 1 && symname[0] == '<' && n == 1) { 926 genop (s, MKOP_ABC(OP_LT, cursp(), idx, n));1055 genop_1(s, OP_LT, cursp()); 927 1056 } 928 1057 else if (!noop && symlen == 2 && symname[0] == '<' && symname[1] == '=' && n == 1) { 929 genop (s, MKOP_ABC(OP_LE, cursp(), idx, n));1058 genop_1(s, OP_LE, cursp()); 930 1059 } 931 1060 else if (!noop && symlen == 1 && symname[0] == '>' && n == 1) { 932 genop (s, MKOP_ABC(OP_GT, cursp(), idx, n));1061 genop_1(s, OP_GT, cursp()); 933 1062 } 934 1063 else if (!noop && symlen == 2 && symname[0] == '>' && symname[1] == '=' && n == 1) { 935 genop (s, MKOP_ABC(OP_GE, cursp(), idx, n));1064 genop_1(s, OP_GE, cursp()); 936 1065 } 937 1066 else if (!noop && symlen == 2 && symname[0] == '=' && symname[1] == '=' && n == 1) { 938 genop (s, MKOP_ABC(OP_EQ, cursp(), idx, n));1067 genop_1(s, OP_EQ, cursp()); 939 1068 } 940 1069 else { 941 if (sendv) n = CALL_MAXARGS; 942 if (blk > 0) { /* no block */ 943 genop(s, MKOP_ABC(OP_SEND, cursp(), idx, n)); 1070 int idx = new_sym(s, sym); 1071 1072 if (sendv) { 1073 genop_2(s, blk ? OP_SENDVB : OP_SENDV, cursp(), idx); 944 1074 } 945 1075 else { 946 genop (s, MKOP_ABC(OP_SENDB, cursp(), idx, n));1076 genop_3(s, blk ? OP_SENDB : OP_SEND, cursp(), idx, n); 947 1077 } 948 1078 } … … 960 1090 { 961 1091 int idx; 962 int type = (intptr_t)tree->car;1092 int type = nint(tree->car); 963 1093 964 1094 tree = tree->cdr; 965 1095 switch (type) { 966 1096 case NODE_GVAR: 967 idx = new_sym(s, sym(tree)); 968 genop_peep(s, MKOP_ABx(OP_SETGLOBAL, sp, idx), val); 969 break; 1097 idx = new_sym(s, nsym(tree)); 1098 genop_2(s, OP_SETGV, sp, idx); 1099 break; 1100 case NODE_ARG: 970 1101 case NODE_LVAR: 971 idx = lv_idx(s, sym(tree));1102 idx = lv_idx(s, nsym(tree)); 972 1103 if (idx > 0) { 973 1104 if (idx != sp) { 974 genop_peep(s, MKOP_AB(OP_MOVE, idx, sp), val); 1105 gen_move(s, idx, sp, val); 1106 if (val && on_eval(s)) genop_0(s, OP_NOP); 975 1107 } 976 1108 break; … … 981 1113 982 1114 while (up) { 983 idx = lv_idx(up, sym(tree));1115 idx = lv_idx(up, nsym(tree)); 984 1116 if (idx > 0) { 985 genop_ peep(s, MKOP_ABC(OP_SETUPVAR, sp, idx, lv), val);1117 genop_3(s, OP_SETUPVAR, sp, idx, lv); 986 1118 break; 987 1119 } … … 991 1123 } 992 1124 break; 1125 case NODE_NVAR: 1126 idx = nint(tree); 1127 codegen_error(s, "Can't assign to numbered parameter"); 1128 break; 993 1129 case NODE_IVAR: 994 idx = new_sym(s, sym(tree));995 genop_ peep(s, MKOP_ABx(OP_SETIV, sp, idx), val);1130 idx = new_sym(s, nsym(tree)); 1131 genop_2(s, OP_SETIV, sp, idx); 996 1132 break; 997 1133 case NODE_CVAR: 998 idx = new_sym(s, sym(tree));999 genop_ peep(s, MKOP_ABx(OP_SETCV, sp, idx), val);1134 idx = new_sym(s, nsym(tree)); 1135 genop_2(s, OP_SETCV, sp, idx); 1000 1136 break; 1001 1137 case NODE_CONST: 1002 idx = new_sym(s, sym(tree));1003 genop_ peep(s, MKOP_ABx(OP_SETCONST, sp, idx), val);1138 idx = new_sym(s, nsym(tree)); 1139 genop_2(s, OP_SETCONST, sp, idx); 1004 1140 break; 1005 1141 case NODE_COLON2: 1006 idx = new_sym(s, sym(tree->cdr)); 1007 genop_peep(s, MKOP_AB(OP_MOVE, cursp(), sp), NOVAL); 1142 gen_move(s, cursp(), sp, 0); 1008 1143 push(); 1009 1144 codegen(s, tree->car, VAL); 1010 1145 pop_n(2); 1011 genop_peep(s, MKOP_ABx(OP_SETMCNST, cursp(), idx), val); 1146 idx = new_sym(s, nsym(tree->cdr)); 1147 genop_2(s, OP_SETMCNST, sp, idx); 1012 1148 break; 1013 1149 … … 1015 1151 case NODE_SCALL: 1016 1152 push(); 1017 gen_call(s, tree, attrsym(s, sym(tree->cdr->car)), sp, NOVAL,1153 gen_call(s, tree, attrsym(s, nsym(tree->cdr->car)), sp, NOVAL, 1018 1154 type == NODE_SCALL); 1019 1155 pop(); 1020 1156 if (val) { 1021 gen op_peep(s, MKOP_AB(OP_MOVE, cursp(), sp), val);1157 gen_move(s, cursp(), sp, 0); 1022 1158 } 1023 1159 break; … … 1050 1186 n = 0; 1051 1187 while (t) { 1052 genop(s, MKOP_ABC(OP_AREF, cursp(), rhs, n)); 1053 gen_assignment(s, t->car, cursp(), NOVAL); 1188 int sp = cursp(); 1189 1190 genop_3(s, OP_AREF, sp, rhs, n); 1191 push(); 1192 gen_assignment(s, t->car, sp, NOVAL); 1193 pop(); 1054 1194 n++; 1055 1195 t = t->cdr; … … 1065 1205 } 1066 1206 } 1067 if (val) { 1068 genop(s, MKOP_AB(OP_MOVE, cursp(), rhs)); 1069 } 1070 else { 1071 pop(); 1072 } 1073 push_n(post); 1074 pop_n(post); 1075 genop(s, MKOP_ABC(OP_APOST, cursp(), n, post)); 1207 gen_move(s, cursp(), rhs, val); 1208 push_n(post+1); 1209 pop_n(post+1); 1210 genop_3(s, OP_APOST, cursp(), n, post); 1076 1211 n = 1; 1077 if (t->car ) {/* rest */1212 if (t->car && t->car != (node*)-1) { /* rest */ 1078 1213 gen_assignment(s, t->car, cursp(), NOVAL); 1079 1214 } … … 1086 1221 } 1087 1222 } 1088 if ( !val) {1089 push();1223 if (val) { 1224 gen_move(s, cursp(), rhs, 0); 1090 1225 } 1091 1226 } … … 1093 1228 1094 1229 static void 1095 gen_ send_intern(codegen_scope *s)1230 gen_intern(codegen_scope *s) 1096 1231 { 1097 1232 pop(); 1098 genop (s, MKOP_ABC(OP_SEND, cursp(), new_msym(s, mrb_intern_lit(s->mrb, "intern")), 0));1233 genop_1(s, OP_INTERN, cursp()); 1099 1234 push(); 1100 1235 } 1236 1101 1237 static void 1102 1238 gen_literal_array(codegen_scope *s, node *tree, mrb_bool sym, int val) … … 1106 1242 1107 1243 while (tree) { 1108 switch ( (intptr_t)tree->car->car) {1244 switch (nint(tree->car->car)) { 1109 1245 case NODE_STR: 1110 if ((tree->cdr == NULL) && ( (intptr_t)tree->car->cdr->cdr== 0))1246 if ((tree->cdr == NULL) && (nint(tree->car->cdr->cdr) == 0)) 1111 1247 break; 1112 1248 /* fall through */ … … 1121 1257 ++i; 1122 1258 if (sym) 1123 gen_ send_intern(s);1259 gen_intern(s); 1124 1260 } 1125 1261 break; 1126 1262 } 1127 if(j >= 2) {1263 while (j >= 2) { 1128 1264 pop(); pop(); 1129 genop_ peep(s, MKOP_AB(OP_STRCAT, cursp(), cursp()+1), VAL);1265 genop_1(s, OP_STRCAT, cursp()); 1130 1266 push(); 1131 j = 1;1267 j--; 1132 1268 } 1133 1269 tree = tree->cdr; … … 1136 1272 ++i; 1137 1273 if (sym) 1138 gen_ send_intern(s);1274 gen_intern(s); 1139 1275 } 1140 1276 pop_n(i); 1141 genop (s, MKOP_ABC(OP_ARRAY, cursp(), cursp(), i));1277 genop_2(s, OP_ARRAY, cursp(), i); 1142 1278 push(); 1143 1279 } 1144 1280 else { 1145 1281 while (tree) { 1146 switch ( (intptr_t)tree->car->car) {1282 switch (nint(tree->car->car)) { 1147 1283 case NODE_BEGIN: case NODE_BLOCK: 1148 1284 codegen(s, tree->car, NOVAL); … … 1158 1294 int idx = new_lit(s, mrb_str_new_cstr(s->mrb, msg)); 1159 1295 1160 genop(s, MKOP_ABx(OP_ERR, 1, idx)); 1161 } 1162 1296 genop_1(s, OP_ERR, idx); 1297 } 1298 1299 #ifndef MRB_WITHOUT_FLOAT 1163 1300 static double 1164 1301 readint_float(codegen_scope *s, const char *p, int base) … … 1186 1323 return f; 1187 1324 } 1325 #endif 1188 1326 1189 1327 static mrb_int … … 1233 1371 gen_retval(codegen_scope *s, node *tree) 1234 1372 { 1235 if ((intptr_t)tree->car == NODE_SPLAT) { 1236 genop(s, MKOP_ABC(OP_ARRAY, cursp(), cursp(), 0)); 1237 push(); 1373 if (nint(tree->car) == NODE_SPLAT) { 1238 1374 codegen(s, tree, VAL); 1239 pop(); pop();1240 genop (s, MKOP_AB(OP_ARYCAT, cursp(), cursp()+1));1375 pop(); 1376 genop_1(s, OP_ARYDUP, cursp()); 1241 1377 } 1242 1378 else { … … 1254 1390 if (!tree) { 1255 1391 if (val) { 1256 genop (s, MKOP_A(OP_LOADNIL, cursp()));1392 genop_1(s, OP_LOADNIL, cursp()); 1257 1393 push(); 1258 1394 } … … 1265 1401 } 1266 1402 if (s->irep && s->filename_index != tree->filename_index) { 1267 s->irep->filename = mrb_parser_get_filename(s->parser, s->filename_index); 1268 mrb_debug_info_append_file(s->mrb, s->irep, s->debug_start_pos, s->pc); 1403 mrb_sym fname = mrb_parser_get_filename(s->parser, s->filename_index); 1404 const char *filename = mrb_sym_name_len(s->mrb, fname, NULL); 1405 1406 mrb_debug_info_append_file(s->mrb, s->irep->debug_info, 1407 filename, s->lines, s->debug_start_pos, s->pc); 1269 1408 s->debug_start_pos = s->pc; 1270 1409 s->filename_index = tree->filename_index; 1271 s->filename = mrb_parser_get_filename(s->parser, tree->filename_index);1272 } 1273 1274 nt = (intptr_t)tree->car;1410 s->filename_sym = mrb_parser_get_filename(s->parser, tree->filename_index); 1411 } 1412 1413 nt = nint(tree->car); 1275 1414 s->lineno = tree->lineno; 1276 1415 tree = tree->cdr; … … 1278 1417 case NODE_BEGIN: 1279 1418 if (val && !tree) { 1280 genop (s, MKOP_A(OP_LOADNIL, cursp()));1419 genop_1(s, OP_LOADNIL, cursp()); 1281 1420 push(); 1282 1421 } … … 1289 1428 case NODE_RESCUE: 1290 1429 { 1291 int onerr,noexc, exend, pos1, pos2, tmp;1430 int noexc, exend, pos1, pos2, tmp; 1292 1431 struct loopinfo *lp; 1293 1432 1294 1433 if (tree->car == NULL) goto exit; 1295 onerr = genop(s, MKOP_Bx(OP_ONERR, 0));1296 1434 lp = loop_push(s, LOOP_BEGIN); 1297 lp->pc1 = onerr; 1435 lp->pc0 = new_label(s); 1436 lp->pc1 = genjmp(s, OP_ONERR, 0); 1298 1437 codegen(s, tree->car, VAL); 1299 1438 pop(); 1300 1439 lp->type = LOOP_RESCUE; 1301 noexc = gen op(s, MKOP_Bx(OP_JMP, 0));1302 dispatch(s, onerr);1440 noexc = genjmp(s, OP_JMP, 0); 1441 dispatch(s, lp->pc1); 1303 1442 tree = tree->cdr; 1304 1443 exend = 0; … … 1308 1447 int exc = cursp(); 1309 1448 1310 genop (s, MKOP_ABC(OP_RESCUE, exc, 0, 0));1449 genop_1(s, OP_EXCEPT, exc); 1311 1450 push(); 1312 1451 while (n2) { … … 1317 1456 pos2 = 0; 1318 1457 do { 1319 if (n4 && n4->car && (intptr_t)n4->car->car== NODE_SPLAT) {1458 if (n4 && n4->car && nint(n4->car->car) == NODE_SPLAT) { 1320 1459 codegen(s, n4->car, VAL); 1321 genop(s, MKOP_AB(OP_MOVE, cursp(), exc)); 1460 gen_move(s, cursp(), exc, 0); 1461 push_n(2); pop_n(2); /* space for one arg and a block */ 1322 1462 pop(); 1323 genop (s, MKOP_ABC(OP_SEND, cursp(), new_msym(s, mrb_intern_lit(s->mrb, "__case_eqq")), 1));1463 genop_3(s, OP_SEND, cursp(), new_sym(s, mrb_intern_lit(s->mrb, "__case_eqq")), 1); 1324 1464 } 1325 1465 else { … … 1328 1468 } 1329 1469 else { 1330 genop (s, MKOP_ABx(OP_GETCONST, cursp(), new_msym(s, mrb_intern_lit(s->mrb, "StandardError"))));1470 genop_2(s, OP_GETCONST, cursp(), new_sym(s, mrb_intern_lit(s->mrb, "StandardError"))); 1331 1471 push(); 1332 1472 } 1333 1473 pop(); 1334 genop (s, MKOP_ABC(OP_RESCUE, exc, cursp(), 1));1474 genop_2(s, OP_RESCUE, exc, cursp()); 1335 1475 } 1336 tmp = gen op(s, MKOP_AsBx(OP_JMPIF, cursp(), pos2));1476 tmp = genjmp2(s, OP_JMPIF, cursp(), pos2, val); 1337 1477 pos2 = tmp; 1338 1478 if (n4) { … … 1340 1480 } 1341 1481 } while (n4); 1342 pos1 = gen op(s, MKOP_sBx(OP_JMP, 0));1482 pos1 = genjmp(s, OP_JMP, 0); 1343 1483 dispatch_linked(s, pos2); 1344 1484 … … 1351 1491 if (val) pop(); 1352 1492 } 1353 tmp = gen op(s, MKOP_sBx(OP_JMP, exend));1493 tmp = genjmp(s, OP_JMP, exend); 1354 1494 exend = tmp; 1355 1495 n2 = n2->cdr; … … 1358 1498 if (pos1) { 1359 1499 dispatch(s, pos1); 1360 genop (s, MKOP_A(OP_RAISE, exc));1500 genop_1(s, OP_RAISE, exc); 1361 1501 } 1362 1502 } … … 1364 1504 tree = tree->cdr; 1365 1505 dispatch(s, noexc); 1366 genop (s, MKOP_A(OP_POPERR, 1));1506 genop_1(s, OP_POPERR, 1); 1367 1507 if (tree->car) { 1368 1508 codegen(s, tree->car, val); … … 1378 1518 case NODE_ENSURE: 1379 1519 if (!tree->cdr || !tree->cdr->cdr || 1380 ( (intptr_t)tree->cdr->cdr->car== NODE_BEGIN &&1520 (nint(tree->cdr->cdr->car) == NODE_BEGIN && 1381 1521 tree->cdr->cdr->cdr)) { 1382 1522 int idx; 1383 int epush = s->pc; 1384 1385 genop(s, MKOP_Bx(OP_EPUSH, 0)); 1523 1386 1524 s->ensure_level++; 1525 idx = scope_body(s, tree->cdr, NOVAL); 1526 genop_1(s, OP_EPUSH, idx); 1387 1527 codegen(s, tree->car, val); 1388 idx = scope_body(s, tree->cdr, NOVAL);1389 s->iseq[epush] = MKOP_Bx(OP_EPUSH, idx);1390 1528 s->ensure_level--; 1391 genop_ peep(s, MKOP_A(OP_EPOP, 1), NOVAL);1529 genop_1(s, OP_EPOP, 1); 1392 1530 } 1393 1531 else { /* empty ensure ignored */ … … 1400 1538 int idx = lambda_body(s, tree, 1); 1401 1539 1402 genop (s, MKOP_Abc(OP_LAMBDA, cursp(), idx, OP_L_LAMBDA));1540 genop_2(s, OP_LAMBDA, cursp(), idx); 1403 1541 push(); 1404 1542 } … … 1409 1547 int idx = lambda_body(s, tree, 1); 1410 1548 1411 genop (s, MKOP_Abc(OP_LAMBDA, cursp(), idx, OP_L_BLOCK));1549 genop_2(s, OP_BLOCK, cursp(), idx); 1412 1550 push(); 1413 1551 } … … 1416 1554 case NODE_IF: 1417 1555 { 1418 int pos1, pos2 ;1419 node *e = tree->cdr->cdr->car;1556 int pos1, pos2, nil_p = FALSE; 1557 node *elsepart = tree->cdr->cdr->car; 1420 1558 1421 1559 if (!tree->car) { 1422 codegen(s, e , val);1560 codegen(s, elsepart, val); 1423 1561 goto exit; 1424 1562 } 1425 switch ( (intptr_t)tree->car->car) {1563 switch (nint(tree->car->car)) { 1426 1564 case NODE_TRUE: 1427 1565 case NODE_INT: … … 1431 1569 case NODE_FALSE: 1432 1570 case NODE_NIL: 1433 codegen(s, e , val);1571 codegen(s, elsepart, val); 1434 1572 goto exit; 1435 } 1436 codegen(s, tree->car, VAL); 1573 case NODE_CALL: 1574 { 1575 node *n = tree->car->cdr; 1576 mrb_sym mid = nsym(n->cdr->car); 1577 mrb_sym mnil = mrb_intern_lit(s->mrb, "nil?"); 1578 if (mid == mnil && n->cdr->cdr->car == NULL) { 1579 nil_p = TRUE; 1580 codegen(s, n->car, VAL); 1581 } 1582 } 1583 break; 1584 } 1585 if (!nil_p) { 1586 codegen(s, tree->car, VAL); 1587 } 1437 1588 pop(); 1438 pos1 = genop_peep(s, MKOP_AsBx(OP_JMPNOT, cursp(), 0), NOVAL); 1439 1440 codegen(s, tree->cdr->car, val); 1441 if (e) { 1589 if (val || tree->cdr->car) { 1590 if (nil_p) { 1591 pos2 = genjmp2(s, OP_JMPNIL, cursp(), 0, val); 1592 pos1 = genjmp(s, OP_JMP, 0); 1593 dispatch(s, pos2); 1594 } 1595 else { 1596 pos1 = genjmp2(s, OP_JMPNOT, cursp(), 0, val); 1597 } 1598 codegen(s, tree->cdr->car, val); 1442 1599 if (val) pop(); 1443 pos2 = genop(s, MKOP_sBx(OP_JMP, 0)); 1444 dispatch(s, pos1); 1445 codegen(s, e, val); 1446 dispatch(s, pos2); 1447 } 1448 else { 1449 if (val) { 1450 pop(); 1451 pos2 = genop(s, MKOP_sBx(OP_JMP, 0)); 1600 if (elsepart || val) { 1601 pos2 = genjmp(s, OP_JMP, 0); 1452 1602 dispatch(s, pos1); 1453 genop(s, MKOP_A(OP_LOADNIL, cursp()));1603 codegen(s, elsepart, val); 1454 1604 dispatch(s, pos2); 1455 push();1456 1605 } 1457 1606 else { 1458 1607 dispatch(s, pos1); 1608 } 1609 } 1610 else { /* empty then-part */ 1611 if (elsepart) { 1612 if (nil_p) { 1613 pos1 = genjmp2(s, OP_JMPNIL, cursp(), 0, val); 1614 } 1615 else { 1616 pos1 = genjmp2(s, OP_JMPIF, cursp(), 0, val); 1617 } 1618 codegen(s, elsepart, val); 1619 dispatch(s, pos1); 1620 } 1621 else if (val && !nil_p) { 1622 genop_1(s, OP_LOADNIL, cursp()); 1623 push(); 1459 1624 } 1460 1625 } … … 1468 1633 codegen(s, tree->car, VAL); 1469 1634 pop(); 1470 pos = gen op(s, MKOP_AsBx(OP_JMPNOT, cursp(), 0));1635 pos = genjmp2(s, OP_JMPNOT, cursp(), 0, val); 1471 1636 codegen(s, tree->cdr, val); 1472 1637 dispatch(s, pos); … … 1480 1645 codegen(s, tree->car, VAL); 1481 1646 pop(); 1482 pos = gen op(s, MKOP_AsBx(OP_JMPIF, cursp(), 0));1647 pos = genjmp2(s, OP_JMPIF, cursp(), 0, val); 1483 1648 codegen(s, tree->cdr, val); 1484 1649 dispatch(s, pos); … … 1490 1655 struct loopinfo *lp = loop_push(s, LOOP_NORMAL); 1491 1656 1492 lp->pc1 = genop(s, MKOP_sBx(OP_JMP, 0)); 1657 lp->pc0 = new_label(s); 1658 lp->pc1 = genjmp(s, OP_JMP, 0); 1493 1659 lp->pc2 = new_label(s); 1494 1660 codegen(s, tree->cdr, NOVAL); … … 1496 1662 codegen(s, tree->car, VAL); 1497 1663 pop(); 1498 gen op(s, MKOP_AsBx(OP_JMPIF, cursp(), lp->pc2 - s->pc));1664 genjmp2(s, OP_JMPIF, cursp(), lp->pc2, NOVAL); 1499 1665 1500 1666 loop_pop(s, val); … … 1506 1672 struct loopinfo *lp = loop_push(s, LOOP_NORMAL); 1507 1673 1508 lp->pc1 = genop(s, MKOP_sBx(OP_JMP, 0)); 1674 lp->pc0 = new_label(s); 1675 lp->pc1 = genjmp(s, OP_JMP, 0); 1509 1676 lp->pc2 = new_label(s); 1510 1677 codegen(s, tree->cdr, NOVAL); … … 1512 1679 codegen(s, tree->car, VAL); 1513 1680 pop(); 1514 gen op(s, MKOP_AsBx(OP_JMPNOT, cursp(), lp->pc2 - s->pc));1681 genjmp2(s, OP_JMPNOT, cursp(), lp->pc2, NOVAL); 1515 1682 1516 1683 loop_pop(s, val); … … 1541 1708 codegen(s, n->car, VAL); 1542 1709 if (head) { 1543 gen op(s, MKOP_AB(OP_MOVE, cursp(), head));1544 p op();1545 if ( (intptr_t)n->car->car== NODE_SPLAT) {1546 genop (s, MKOP_ABC(OP_SEND, cursp(), new_msym(s, mrb_intern_lit(s->mrb, "__case_eqq")), 1));1710 gen_move(s, cursp(), head, 0); 1711 push(); push(); pop(); pop(); pop(); 1712 if (nint(n->car->car) == NODE_SPLAT) { 1713 genop_3(s, OP_SEND, cursp(), new_sym(s, mrb_intern_lit(s->mrb, "__case_eqq")), 1); 1547 1714 } 1548 1715 else { 1549 genop (s, MKOP_ABC(OP_SEND, cursp(), new_msym(s, mrb_intern_lit(s->mrb, "===")), 1));1716 genop_3(s, OP_SEND, cursp(), new_sym(s, mrb_intern_lit(s->mrb, "===")), 1); 1550 1717 } 1551 1718 } … … 1553 1720 pop(); 1554 1721 } 1555 tmp = gen op(s, MKOP_AsBx(OP_JMPIF, cursp(), pos2));1722 tmp = genjmp2(s, OP_JMPIF, cursp(), pos2, NOVAL); 1556 1723 pos2 = tmp; 1557 1724 n = n->cdr; 1558 1725 } 1559 1726 if (tree->car->car) { 1560 pos1 = gen op(s, MKOP_sBx(OP_JMP, 0));1727 pos1 = genjmp(s, OP_JMP, 0); 1561 1728 dispatch_linked(s, pos2); 1562 1729 } 1563 1730 codegen(s, tree->car->cdr, val); 1564 1731 if (val) pop(); 1565 tmp = gen op(s, MKOP_sBx(OP_JMP, pos3));1732 tmp = genjmp(s, OP_JMP, pos3); 1566 1733 pos3 = tmp; 1567 1734 if (pos1) dispatch(s, pos1); … … 1570 1737 if (val) { 1571 1738 int pos = cursp(); 1572 genop (s, MKOP_A(OP_LOADNIL, cursp()));1739 genop_1(s, OP_LOADNIL, cursp()); 1573 1740 if (pos3) dispatch_linked(s, pos3); 1574 1741 if (head) pop(); 1575 1742 if (cursp() != pos) { 1576 gen op(s, MKOP_AB(OP_MOVE, cursp(), pos));1743 gen_move(s, cursp(), pos, 0); 1577 1744 } 1578 1745 push(); … … 1606 1773 if (val) { 1607 1774 pop(); pop(); 1608 genop (s, MKOP_ABC(OP_RANGE, cursp(), cursp(), FALSE));1775 genop_1(s, OP_RANGE_INC, cursp()); 1609 1776 push(); 1610 1777 } … … 1616 1783 if (val) { 1617 1784 pop(); pop(); 1618 genop (s, MKOP_ABC(OP_RANGE, cursp(), cursp(), TRUE));1785 genop_1(s, OP_RANGE_EXC, cursp()); 1619 1786 push(); 1620 1787 } … … 1623 1790 case NODE_COLON2: 1624 1791 { 1625 int sym = new_sym(s, sym(tree->cdr));1792 int sym = new_sym(s, nsym(tree->cdr)); 1626 1793 1627 1794 codegen(s, tree->car, VAL); 1628 1795 pop(); 1629 genop (s, MKOP_ABx(OP_GETMCNST, cursp(), sym));1796 genop_2(s, OP_GETMCNST, cursp(), sym); 1630 1797 if (val) push(); 1631 1798 } … … 1634 1801 case NODE_COLON3: 1635 1802 { 1636 int sym = new_sym(s, sym(tree));1637 1638 genop (s, MKOP_A(OP_OCLASS, cursp()));1639 genop (s, MKOP_ABx(OP_GETMCNST, cursp(), sym));1803 int sym = new_sym(s, nsym(tree)); 1804 1805 genop_1(s, OP_OCLASS, cursp()); 1806 genop_2(s, OP_GETMCNST, cursp(), sym); 1640 1807 if (val) push(); 1641 1808 } … … 1650 1817 if (val) { 1651 1818 pop_n(n); 1652 genop (s, MKOP_ABC(OP_ARRAY, cursp(), cursp(), n));1819 genop_2(s, OP_ARRAY, cursp(), n); 1653 1820 push(); 1654 1821 } … … 1661 1828 1662 1829 case NODE_HASH: 1830 case NODE_KW_HASH: 1663 1831 { 1664 1832 int len = 0; … … 1666 1834 1667 1835 while (tree) { 1668 codegen(s, tree->car->car, val); 1669 codegen(s, tree->car->cdr, val); 1670 len++; 1836 if (nint(tree->car->car->car) == NODE_KW_REST_ARGS) { 1837 if (len > 0) { 1838 pop_n(len*2); 1839 if (!update) { 1840 genop_2(s, OP_HASH, cursp(), len); 1841 } 1842 else { 1843 pop(); 1844 genop_2(s, OP_HASHADD, cursp(), len); 1845 } 1846 push(); 1847 } 1848 codegen(s, tree->car->cdr, VAL); 1849 if (len > 0 || update) { 1850 pop(); pop(); 1851 genop_1(s, OP_HASHCAT, cursp()); 1852 push(); 1853 } 1854 update = TRUE; 1855 len = 0; 1856 } 1857 else { 1858 codegen(s, tree->car->car, val); 1859 codegen(s, tree->car->cdr, val); 1860 len++; 1861 } 1671 1862 tree = tree->cdr; 1672 if (val && len == 126) {1863 if (val && len == 255) { 1673 1864 pop_n(len*2); 1674 genop(s, MKOP_ABC(OP_HASH, cursp(), cursp(), len)); 1675 if (update) { 1865 if (!update) { 1866 genop_2(s, OP_HASH, cursp(), len); 1867 } 1868 else { 1676 1869 pop(); 1677 genop (s, MKOP_ABC(OP_SEND, cursp(), new_msym(s, mrb_intern_lit(s->mrb, "__update")), 1));1870 genop_2(s, OP_HASHADD, cursp(), len); 1678 1871 } 1679 1872 push(); … … 1684 1877 if (val) { 1685 1878 pop_n(len*2); 1686 genop(s, MKOP_ABC(OP_HASH, cursp(), cursp(), len)); 1687 if (update) { 1879 if (!update) { 1880 genop_2(s, OP_HASH, cursp(), len); 1881 } 1882 else { 1688 1883 pop(); 1689 genop(s, MKOP_ABC(OP_SEND, cursp(), new_msym(s, mrb_intern_lit(s->mrb, "__update")), 1)); 1884 if (len > 0) { 1885 genop_2(s, OP_HASHADD, cursp(), len); 1886 } 1690 1887 } 1691 1888 push(); … … 1710 1907 int rhs = cursp(); 1711 1908 1712 if ( (intptr_t)t->car== NODE_ARRAY && t->cdr && nosplat(t->cdr)) {1909 if (nint(t->car) == NODE_ARRAY && t->cdr && nosplat(t->cdr)) { 1713 1910 /* fixed rhs */ 1714 1911 t = t->cdr; … … 1728 1925 } 1729 1926 else { 1730 genop (s, MKOP_A(OP_LOADNIL, rhs+n));1927 genop_1(s, OP_LOADNIL, rhs+n); 1731 1928 gen_assignment(s, t->car, rhs+n, NOVAL); 1732 1929 } … … 1752 1949 rn = len - post - n; 1753 1950 } 1754 genop (s, MKOP_ABC(OP_ARRAY, cursp(), rhs+n, rn));1951 genop_3(s, OP_ARRAY2, cursp(), rhs+n, rn); 1755 1952 gen_assignment(s, t->car, cursp(), NOVAL); 1756 1953 n += rn; … … 1767 1964 pop_n(len); 1768 1965 if (val) { 1769 genop (s, MKOP_ABC(OP_ARRAY, rhs, rhs, len));1966 genop_2(s, OP_ARRAY, rhs, len); 1770 1967 push(); 1771 1968 } … … 1784 1981 case NODE_OP_ASGN: 1785 1982 { 1786 mrb_sym sym = sym(tree->cdr->car);1983 mrb_sym sym = nsym(tree->cdr->car); 1787 1984 mrb_int len; 1788 const char *name = mrb_sym 2name_len(s->mrb, sym, &len);1985 const char *name = mrb_sym_name_len(s->mrb, sym, &len); 1789 1986 int idx, callargs = -1, vsp = -1; 1790 1987 1791 1988 if ((len == 2 && name[0] == '|' && name[1] == '|') && 1792 ( (intptr_t)tree->car->car== NODE_CONST ||1793 (intptr_t)tree->car->car== NODE_CVAR)) {1989 (nint(tree->car->car) == NODE_CONST || 1990 nint(tree->car->car) == NODE_CVAR)) { 1794 1991 int onerr, noexc, exc; 1795 1992 struct loopinfo *lp; 1796 1993 1797 onerr = gen op(s, MKOP_Bx(OP_ONERR, 0));1994 onerr = genjmp(s, OP_ONERR, 0); 1798 1995 lp = loop_push(s, LOOP_BEGIN); 1799 1996 lp->pc1 = onerr; … … 1801 1998 codegen(s, tree->car, VAL); 1802 1999 lp->type = LOOP_RESCUE; 1803 genop (s, MKOP_A(OP_POPERR, 1));1804 noexc = gen op(s, MKOP_Bx(OP_JMP, 0));2000 genop_1(s, OP_POPERR, 1); 2001 noexc = genjmp(s, OP_JMP, 0); 1805 2002 dispatch(s, onerr); 1806 genop (s, MKOP_ABC(OP_RESCUE, exc, 0, 0));1807 genop (s, MKOP_A(OP_LOADF, exc));2003 genop_1(s, OP_EXCEPT, exc); 2004 genop_1(s, OP_LOADF, exc); 1808 2005 dispatch(s, noexc); 1809 2006 loop_pop(s, NOVAL); 1810 2007 } 1811 else if ( (intptr_t)tree->car->car== NODE_CALL) {2008 else if (nint(tree->car->car) == NODE_CALL) { 1812 2009 node *n = tree->car->cdr; 2010 int base, i, nargs = 0; 2011 callargs = 0; 1813 2012 1814 2013 if (val) { … … 1817 2016 } 1818 2017 codegen(s, n->car, VAL); /* receiver */ 1819 idx = new_msym(s, sym(n->cdr->car)); 2018 idx = new_sym(s, nsym(n->cdr->car)); 2019 base = cursp()-1; 1820 2020 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 */ 2021 nargs = gen_values(s, n->cdr->cdr->car->car, VAL, 1); 1825 2022 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 2023 callargs = nargs; 1835 2024 } 1836 else { 1837 /* varargs */ 2025 else { /* varargs */ 1838 2026 push(); 1839 genop(s, MKOP_AB(OP_MOVE, cursp(), base)); 1840 genop(s, MKOP_AB(OP_MOVE, cursp()+1, base+1)); 2027 nargs = 1; 1841 2028 callargs = CALL_MAXARGS; 1842 2029 } 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 } 2030 } 2031 /* copy receiver and arguments */ 2032 gen_move(s, cursp(), base, 1); 2033 for (i=0; i<nargs; i++) { 2034 gen_move(s, cursp()+i+1, base+i+1, 1); 2035 } 2036 push_n(nargs+2);pop_n(nargs+2); /* space for receiver, arguments and a block */ 2037 genop_3(s, OP_SEND, cursp(), idx, callargs); 1850 2038 push(); 1851 2039 } … … 1861 2049 if (val) { 1862 2050 if (vsp >= 0) { 1863 gen op(s, MKOP_AB(OP_MOVE, vsp, cursp()));1864 } 1865 pos = gen op(s, MKOP_AsBx(name[0]=='|'?OP_JMPIF:OP_JMPNOT, cursp(), 0));2051 gen_move(s, vsp, cursp(), 1); 2052 } 2053 pos = genjmp2(s, name[0]=='|'?OP_JMPIF:OP_JMPNOT, cursp(), 0, val); 1866 2054 } 1867 2055 else { 1868 pos = gen op_peep(s, MKOP_AsBx(name[0]=='|'?OP_JMPIF:OP_JMPNOT, cursp(), 0), NOVAL);2056 pos = genjmp2(s, name[0]=='|'?OP_JMPIF:OP_JMPNOT, cursp(), 0, val); 1869 2057 } 1870 2058 codegen(s, tree->cdr->cdr->car, VAL); 1871 2059 pop(); 1872 2060 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(); 2061 gen_move(s, vsp, cursp(), 1); 2062 } 2063 if (nint(tree->car->car) == NODE_CALL) { 1881 2064 if (callargs == CALL_MAXARGS) { 1882 genop(s, MKOP_AB(OP_ARYPUSH, cursp(), cursp()+1));1883 2065 pop(); 1884 genop (s, MKOP_ABC(OP_SEND, cursp(), idx, callargs));2066 genop_1(s, OP_ARYPUSH, cursp()); 1885 2067 } 1886 2068 else { 1887 2069 pop_n(callargs); 1888 genop(s, MKOP_ABC(OP_SEND, cursp(), idx, callargs+1)); 1889 } 2070 callargs++; 2071 } 2072 pop(); 2073 idx = new_sym(s, attrsym(s, nsym(tree->car->cdr->cdr->car))); 2074 genop_3(s, OP_SEND, cursp(), idx, callargs); 1890 2075 } 1891 2076 else { … … 1899 2084 pop(); pop(); 1900 2085 1901 idx = new_msym(s, sym);1902 2086 if (len == 1 && name[0] == '+') { 1903 gen op_peep(s, MKOP_ABC(OP_ADD, cursp(), idx, 1), val);2087 gen_addsub(s, OP_ADD, cursp()); 1904 2088 } 1905 2089 else if (len == 1 && name[0] == '-') { 1906 gen op_peep(s, MKOP_ABC(OP_SUB, cursp(), idx, 1), val);2090 gen_addsub(s, OP_SUB, cursp()); 1907 2091 } 1908 2092 else if (len == 1 && name[0] == '*') { 1909 genop (s, MKOP_ABC(OP_MUL, cursp(), idx, 1));2093 genop_1(s, OP_MUL, cursp()); 1910 2094 } 1911 2095 else if (len == 1 && name[0] == '/') { 1912 genop (s, MKOP_ABC(OP_DIV, cursp(), idx, 1));2096 genop_1(s, OP_DIV, cursp()); 1913 2097 } 1914 2098 else if (len == 1 && name[0] == '<') { 1915 genop (s, MKOP_ABC(OP_LT, cursp(), idx, 1));2099 genop_1(s, OP_LT, cursp()); 1916 2100 } 1917 2101 else if (len == 2 && name[0] == '<' && name[1] == '=') { 1918 genop (s, MKOP_ABC(OP_LE, cursp(), idx, 1));2102 genop_1(s, OP_LE, cursp()); 1919 2103 } 1920 2104 else if (len == 1 && name[0] == '>') { 1921 genop (s, MKOP_ABC(OP_GT, cursp(), idx, 1));2105 genop_1(s, OP_GT, cursp()); 1922 2106 } 1923 2107 else if (len == 2 && name[0] == '>' && name[1] == '=') { 1924 genop (s, MKOP_ABC(OP_GE, cursp(), idx, 1));2108 genop_1(s, OP_GE, cursp()); 1925 2109 } 1926 2110 else { 1927 genop(s, MKOP_ABC(OP_SEND, cursp(), idx, 1)); 2111 idx = new_sym(s, sym); 2112 genop_3(s, OP_SEND, cursp(), idx, 1); 1928 2113 } 1929 2114 if (callargs < 0) { … … 1932 2117 else { 1933 2118 if (val && vsp >= 0) { 1934 gen op(s, MKOP_AB(OP_MOVE, vsp, cursp()));2119 gen_move(s, vsp, cursp(), 0); 1935 2120 } 1936 2121 if (callargs == CALL_MAXARGS) { 1937 2122 pop(); 1938 genop (s, MKOP_AB(OP_ARYPUSH, cursp(), cursp()+1));2123 genop_1(s, OP_ARYPUSH, cursp()); 1939 2124 } 1940 2125 else { … … 1943 2128 } 1944 2129 pop(); 1945 idx = new_ msym(s, attrsym(s,sym(tree->car->cdr->cdr->car)));1946 genop (s, MKOP_ABC(OP_SEND, cursp(), idx, callargs));2130 idx = new_sym(s, attrsym(s,nsym(tree->car->cdr->cdr->car))); 2131 genop_3(s, OP_SEND, cursp(), idx, callargs); 1947 2132 } 1948 2133 } … … 1961 2146 if (!s2) break; 1962 2147 } 1963 genop (s, MKOP_ABx(OP_ARGARY, cursp(), (lv & 0xf)));2148 genop_2S(s, OP_ARGARY, cursp(), (lv & 0xf)); 1964 2149 push(); push(); /* ARGARY pushes two values */ 1965 2150 pop(); pop(); … … 1979 2164 } 1980 2165 else { 1981 genop (s, MKOP_A(OP_LOADNIL, cursp()));2166 genop_1(s, OP_LOADNIL, cursp()); 1982 2167 push(); pop(); 1983 2168 } 1984 2169 pop_n(n+1); 1985 2170 if (sendv) n = CALL_MAXARGS; 1986 genop (s, MKOP_ABC(OP_SUPER, cursp(), 0, n));2171 genop_2(s, OP_SUPER, cursp(), n); 1987 2172 if (val) push(); 1988 2173 } … … 2001 2186 } 2002 2187 if (s2) ainfo = s2->ainfo; 2003 genop (s, MKOP_ABx(OP_ARGARY, cursp(), (ainfo<<4)|(lv & 0xf)));2188 genop_2S(s, OP_ARGARY, cursp(), (ainfo<<4)|(lv & 0xf)); 2004 2189 push(); push(); pop(); /* ARGARY pushes two values */ 2005 2190 if (tree && tree->cdr) { … … 2008 2193 } 2009 2194 pop(); pop(); 2010 genop (s, MKOP_ABC(OP_SUPER, cursp(), 0, CALL_MAXARGS));2195 genop_2(s, OP_SUPER, cursp(), CALL_MAXARGS); 2011 2196 if (val) push(); 2012 2197 } … … 2018 2203 } 2019 2204 else { 2020 genop (s, MKOP_A(OP_LOADNIL, cursp()));2205 genop_1(s, OP_LOADNIL, cursp()); 2021 2206 } 2022 2207 if (s->loop) { 2023 gen op(s, MKOP_AB(OP_RETURN, cursp(), OP_R_RETURN));2208 gen_return(s, OP_RETURN_BLK, cursp()); 2024 2209 } 2025 2210 else { 2026 gen op_peep(s, MKOP_AB(OP_RETURN, cursp(), OP_R_NORMAL), NOVAL);2211 gen_return(s, OP_RETURN, cursp()); 2027 2212 } 2028 2213 if (val) push(); … … 2049 2234 } 2050 2235 } 2236 push();pop(); /* space for a block */ 2051 2237 pop_n(n+1); 2052 genop (s, MKOP_ABx(OP_BLKPUSH, cursp(), (ainfo<<4)|(lv & 0xf)));2238 genop_2S(s, OP_BLKPUSH, cursp(), (ainfo<<4)|(lv & 0xf)); 2053 2239 if (sendv) n = CALL_MAXARGS; 2054 genop (s, MKOP_ABC(OP_SEND, cursp(), new_msym(s, mrb_intern_lit(s->mrb, "call")), n));2240 genop_3(s, OP_SEND, cursp(), new_sym(s, mrb_intern_lit(s->mrb, "call")), n); 2055 2241 if (val) push(); 2056 2242 } … … 2068 2254 else if (s->loop->type == LOOP_NORMAL) { 2069 2255 if (s->ensure_level > s->loop->ensure_level) { 2070 genop_ peep(s, MKOP_A(OP_EPOP, s->ensure_level - s->loop->ensure_level), NOVAL);2256 genop_1(s, OP_EPOP, s->ensure_level - s->loop->ensure_level); 2071 2257 } 2072 2258 codegen(s, tree, NOVAL); 2073 gen op(s, MKOP_sBx(OP_JMP, s->loop->pc1 - s->pc));2259 genjmp(s, OP_JMP, s->loop->pc0); 2074 2260 } 2075 2261 else { … … 2079 2265 } 2080 2266 else { 2081 genop (s, MKOP_A(OP_LOADNIL, cursp()));2082 } 2083 gen op_peep(s, MKOP_AB(OP_RETURN, cursp(), OP_R_NORMAL), NOVAL);2267 genop_1(s, OP_LOADNIL, cursp()); 2268 } 2269 gen_return(s, OP_RETURN, cursp()); 2084 2270 } 2085 2271 if (val) push(); … … 2092 2278 else { 2093 2279 if (s->ensure_level > s->loop->ensure_level) { 2094 genop_ peep(s, MKOP_A(OP_EPOP, s->ensure_level - s->loop->ensure_level), NOVAL);2095 } 2096 gen op(s, MKOP_sBx(OP_JMP, s->loop->pc2 - s->pc));2280 genop_1(s, OP_EPOP, s->ensure_level - s->loop->ensure_level); 2281 } 2282 genjmp(s, OP_JMP, s->loop->pc2); 2097 2283 } 2098 2284 if (val) push(); … … 2121 2307 else { 2122 2308 if (n > 0) { 2123 while (n--) { 2124 genop_peep(s, MKOP_A(OP_POPERR, 1), NOVAL); 2125 } 2309 genop_1(s, OP_POPERR, n); 2126 2310 } 2127 2311 if (s->ensure_level > lp->ensure_level) { 2128 genop_ peep(s, MKOP_A(OP_EPOP, s->ensure_level - lp->ensure_level), NOVAL);2129 } 2130 gen op(s, MKOP_sBx(OP_JMP, lp->pc1 - s->pc));2312 genop_1(s, OP_EPOP, s->ensure_level - lp->ensure_level); 2313 } 2314 genjmp(s, OP_JMP, lp->pc0); 2131 2315 } 2132 2316 } … … 2137 2321 case NODE_LVAR: 2138 2322 if (val) { 2139 int idx = lv_idx(s, sym(tree));2323 int idx = lv_idx(s, nsym(tree)); 2140 2324 2141 2325 if (idx > 0) { 2142 genop_peep(s, MKOP_AB(OP_MOVE, cursp(), idx), NOVAL); 2326 gen_move(s, cursp(), idx, val); 2327 if (val && on_eval(s)) genop_0(s, OP_NOP); 2143 2328 } 2144 2329 else { … … 2147 2332 2148 2333 while (up) { 2149 idx = lv_idx(up, sym(tree));2334 idx = lv_idx(up, nsym(tree)); 2150 2335 if (idx > 0) { 2151 genop (s, MKOP_ABC(OP_GETUPVAR, cursp(), idx, lv));2336 genop_3(s, OP_GETUPVAR, cursp(), idx, lv); 2152 2337 break; 2153 2338 } … … 2160 2345 break; 2161 2346 2347 case NODE_NVAR: 2348 if (val) { 2349 int idx = nint(tree); 2350 2351 gen_move(s, cursp(), idx, val); 2352 if (val && on_eval(s)) genop_0(s, OP_NOP); 2353 2354 push(); 2355 } 2356 break; 2357 2162 2358 case NODE_GVAR: 2163 if (val){2164 int sym = new_sym(s, sym(tree));2165 2166 genop (s, MKOP_ABx(OP_GETGLOBAL, cursp(), sym));2167 push();2359 { 2360 int sym = new_sym(s, nsym(tree)); 2361 2362 genop_2(s, OP_GETGV, cursp(), sym); 2363 if (val) push(); 2168 2364 } 2169 2365 break; 2170 2366 2171 2367 case NODE_IVAR: 2172 if (val){2173 int sym = new_sym(s, sym(tree));2174 2175 genop (s, MKOP_ABx(OP_GETIV, cursp(), sym));2176 push();2368 { 2369 int sym = new_sym(s, nsym(tree)); 2370 2371 genop_2(s, OP_GETIV, cursp(), sym); 2372 if (val) push(); 2177 2373 } 2178 2374 break; 2179 2375 2180 2376 case NODE_CVAR: 2181 if (val){2182 int sym = new_sym(s, sym(tree));2183 2184 genop (s, MKOP_ABx(OP_GETCV, cursp(), sym));2185 push();2377 { 2378 int sym = new_sym(s, nsym(tree)); 2379 2380 genop_2(s, OP_GETCV, cursp(), sym); 2381 if (val) push(); 2186 2382 } 2187 2383 break; … … 2189 2385 case NODE_CONST: 2190 2386 { 2191 int sym = new_sym(s, sym(tree)); 2192 2193 genop(s, MKOP_ABx(OP_GETCONST, cursp(), sym)); 2194 if (val) { 2195 push(); 2196 } 2197 } 2198 break; 2199 2200 case NODE_DEFINED: 2201 codegen(s, tree, VAL); 2387 int sym = new_sym(s, nsym(tree)); 2388 2389 genop_2(s, OP_GETCONST, cursp(), sym); 2390 if (val) push(); 2391 } 2202 2392 break; 2203 2393 2204 2394 case NODE_BACK_REF: 2205 2395 if (val) { 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)); 2396 char buf[] = {'$', nchar(tree)}; 2397 int sym = new_sym(s, mrb_intern(s->mrb, buf, sizeof(buf))); 2398 2399 genop_2(s, OP_GETGV, cursp(), sym); 2214 2400 push(); 2215 2401 } … … 2222 2408 int sym; 2223 2409 2224 str = mrb_format(mrb, "$% S", mrb_fixnum_value((mrb_int)(intptr_t)tree));2410 str = mrb_format(mrb, "$%d", nint(tree)); 2225 2411 sym = new_sym(s, mrb_intern_str(mrb, str)); 2226 genop (s, MKOP_ABx(OP_GETGLOBAL, cursp(), sym));2412 genop_2(s, OP_GETGV, cursp(), sym); 2227 2413 push(); 2228 2414 } … … 2234 2420 2235 2421 case NODE_BLOCK_ARG: 2236 codegen(s, tree, VAL);2422 codegen(s, tree, val); 2237 2423 break; 2238 2424 … … 2240 2426 if (val) { 2241 2427 char *p = (char*)tree->car; 2242 int base = (intptr_t)tree->cdr->car;2428 int base = nint(tree->cdr->car); 2243 2429 mrb_int i; 2244 mrb_code co;2245 2430 mrb_bool overflow; 2246 2431 2247 2432 i = readint_mrb_int(s, p, base, FALSE, &overflow); 2433 #ifndef MRB_WITHOUT_FLOAT 2248 2434 if (overflow) { 2249 2435 double f = readint_float(s, p, base); 2250 2436 int off = new_lit(s, mrb_float_value(s->mrb, f)); 2251 2437 2252 genop(s, MKOP_ABx(OP_LOADL, cursp(), off)); 2253 } 2254 else { 2255 if (i < MAXARG_sBx && i > -MAXARG_sBx) { 2256 co = MKOP_AsBx(OP_LOADI, cursp(), i); 2257 } 2438 genop_2(s, OP_LOADL, cursp(), off); 2439 } 2440 else 2441 #endif 2442 { 2443 if (i == -1) genop_1(s, OP_LOADI__1, cursp()); 2444 else if (i < 0) genop_2(s, OP_LOADINEG, cursp(), (uint16_t)-i); 2445 else if (i < 8) genop_1(s, OP_LOADI_0 + (uint8_t)i, cursp()); 2446 else if (i <= 0xffff) genop_2(s, OP_LOADI, cursp(), (uint16_t)i); 2258 2447 else { 2259 2448 int off = new_lit(s, mrb_fixnum_value(i)); 2260 co = MKOP_ABx(OP_LOADL, cursp(), off); 2261 } 2262 genop(s, co); 2449 genop_2(s, OP_LOADL, cursp(), off); 2450 } 2263 2451 } 2264 2452 push(); … … 2266 2454 break; 2267 2455 2456 #ifndef MRB_WITHOUT_FLOAT 2268 2457 case NODE_FLOAT: 2269 2458 if (val) { … … 2272 2461 int off = new_lit(s, mrb_float_value(s->mrb, f)); 2273 2462 2274 genop (s, MKOP_ABx(OP_LOADL, cursp(), off));2463 genop_2(s, OP_LOADL, cursp(), off); 2275 2464 push(); 2276 2465 } 2277 2466 break; 2467 #endif 2278 2468 2279 2469 case NODE_NEGATE: 2280 2470 { 2281 nt = (intptr_t)tree->car; 2282 tree = tree->cdr; 2471 nt = nint(tree->car); 2283 2472 switch (nt) { 2473 #ifndef MRB_WITHOUT_FLOAT 2284 2474 case NODE_FLOAT: 2285 2475 if (val) { 2286 char *p = (char*)tree ;2476 char *p = (char*)tree->cdr; 2287 2477 mrb_float f = mrb_float_read(p, NULL); 2288 2478 int off = new_lit(s, mrb_float_value(s->mrb, -f)); 2289 2479 2290 genop (s, MKOP_ABx(OP_LOADL, cursp(), off));2480 genop_2(s, OP_LOADL, cursp(), off); 2291 2481 push(); 2292 2482 } 2293 2483 break; 2484 #endif 2294 2485 2295 2486 case NODE_INT: 2296 2487 if (val) { 2297 char *p = (char*)tree->c ar;2298 int base = (intptr_t)tree->cdr->car;2488 char *p = (char*)tree->cdr->car; 2489 int base = nint(tree->cdr->cdr->car); 2299 2490 mrb_int i; 2300 mrb_code co;2301 2491 mrb_bool overflow; 2302 2492 2303 2493 i = readint_mrb_int(s, p, base, TRUE, &overflow); 2494 #ifndef MRB_WITHOUT_FLOAT 2304 2495 if (overflow) { 2305 2496 double f = readint_float(s, p, base); 2306 2497 int off = new_lit(s, mrb_float_value(s->mrb, -f)); 2307 2498 2308 genop (s, MKOP_ABx(OP_LOADL, cursp(), off));2499 genop_2(s, OP_LOADL, cursp(), off); 2309 2500 } 2310 2501 else { 2311 if (i < MAXARG_sBx && i > -MAXARG_sBx) { 2312 co = MKOP_AsBx(OP_LOADI, cursp(), i); 2502 #endif 2503 if (i == -1) genop_1(s, OP_LOADI__1, cursp()); 2504 else if (i >= -0xffff) { 2505 genop_2(s, OP_LOADINEG, cursp(), (uint16_t)-i); 2313 2506 } 2314 2507 else { 2315 2508 int off = new_lit(s, mrb_fixnum_value(i)); 2316 co = MKOP_ABx(OP_LOADL, cursp(), off);2509 genop_2(s, OP_LOADL, cursp(), off); 2317 2510 } 2318 genop(s, co); 2319 } 2511 #ifndef MRB_WITHOUT_FLOAT 2512 } 2513 #endif 2320 2514 push(); 2321 2515 } … … 2324 2518 default: 2325 2519 if (val) { 2326 int sym = new_msym(s, mrb_intern_lit(s->mrb, "-")); 2327 2328 genop(s, MKOP_ABx(OP_LOADI, cursp(), 0)); 2520 int sym = new_sym(s, mrb_intern_lit(s->mrb, "-@")); 2521 codegen(s, tree, VAL); 2522 pop(); 2523 genop_3(s, OP_SEND, cursp(), sym, 0); 2329 2524 push(); 2330 codegen(s, tree, VAL);2331 pop(); pop();2332 genop(s, MKOP_ABC(OP_SUB, cursp(), sym, 2));2333 2525 } 2334 2526 else { … … 2348 2540 2349 2541 mrb_gc_arena_restore(s->mrb, ai); 2350 genop (s, MKOP_ABx(OP_STRING, cursp(), off));2542 genop_2(s, OP_STRING, cursp(), off); 2351 2543 push(); 2352 2544 } … … 2361 2553 2362 2554 if (!n) { 2363 genop (s, MKOP_A(OP_LOADNIL, cursp()));2555 genop_1(s, OP_LOADNIL, cursp()); 2364 2556 push(); 2365 2557 break; … … 2370 2562 codegen(s, n->car, VAL); 2371 2563 pop(); pop(); 2372 genop_ peep(s, MKOP_AB(OP_STRCAT, cursp(), cursp()+1), VAL);2564 genop_1(s, OP_STRCAT, cursp()); 2373 2565 push(); 2374 2566 n = n->cdr; … … 2379 2571 2380 2572 while (n) { 2381 if ( (intptr_t)n->car->car!= NODE_STR) {2573 if (nint(n->car->car) != NODE_STR) { 2382 2574 codegen(s, n->car, NOVAL); 2383 2575 } … … 2401 2593 int sym = new_sym(s, mrb_intern_lit(s->mrb, "Kernel")); 2402 2594 2403 genop (s, MKOP_A(OP_LOADSELF, cursp()));2595 genop_1(s, OP_LOADSELF, cursp()); 2404 2596 push(); 2405 2597 codegen(s, tree->car, VAL); 2406 2598 n = tree->cdr; 2407 2599 while (n) { 2408 if ( (intptr_t)n->car->car== NODE_XSTR) {2600 if (nint(n->car->car) == NODE_XSTR) { 2409 2601 n->car->car = (struct mrb_ast_node*)(intptr_t)NODE_STR; 2410 2602 mrb_assert(!n->cdr); /* must be the end */ … … 2412 2604 codegen(s, n->car, VAL); 2413 2605 pop(); pop(); 2414 genop_ peep(s, MKOP_AB(OP_STRCAT, cursp(), cursp()+1), VAL);2606 genop_1(s, OP_STRCAT, cursp()); 2415 2607 push(); 2416 2608 n = n->cdr; … … 2419 2611 pop_n(3); 2420 2612 sym = new_sym(s, mrb_intern_lit(s->mrb, "`")); 2421 genop (s, MKOP_ABC(OP_SEND, cursp(), sym, 1));2613 genop_3(s, OP_SEND, cursp(), sym, 1); 2422 2614 if (val) push(); 2423 2615 mrb_gc_arena_restore(s->mrb, ai); … … 2433 2625 int sym; 2434 2626 2435 genop (s, MKOP_A(OP_LOADSELF, cursp()));2627 genop_1(s, OP_LOADSELF, cursp()); 2436 2628 push(); 2437 genop (s, MKOP_ABx(OP_STRING, cursp(), off));2629 genop_2(s, OP_STRING, cursp(), off); 2438 2630 push(); push(); 2439 2631 pop_n(3); 2440 2632 sym = new_sym(s, mrb_intern_lit(s->mrb, "`")); 2441 genop (s, MKOP_ABC(OP_SEND, cursp(), sym, 1));2633 genop_3(s, OP_SEND, cursp(), sym, 1); 2442 2634 if (val) push(); 2443 2635 mrb_gc_arena_restore(s->mrb, ai); … … 2455 2647 int argc = 1; 2456 2648 2457 genop (s, MKOP_A(OP_OCLASS, cursp()));2458 genop (s, MKOP_ABx(OP_GETMCNST, cursp(), sym));2649 genop_1(s, OP_OCLASS, cursp()); 2650 genop_2(s, OP_GETMCNST, cursp(), sym); 2459 2651 push(); 2460 genop(s, MKOP_ABx(OP_STRING, cursp(), off)); 2652 genop_2(s, OP_STRING, cursp(), off); 2653 push(); 2461 2654 if (p2 || p3) { 2655 if (p2) { /* opt */ 2656 off = new_lit(s, mrb_str_new_cstr(s->mrb, p2)); 2657 genop_2(s, OP_STRING, cursp(), off); 2658 } 2659 else { 2660 genop_1(s, OP_LOADNIL, cursp()); 2661 } 2462 2662 push(); 2463 if (p2) {2464 off = new_lit(s, mrb_str_new_cstr(s->mrb, p2));2465 genop(s, MKOP_ABx(OP_STRING, cursp(), off));2466 }2467 else {2468 genop(s, MKOP_A(OP_LOADNIL, cursp()));2469 }2470 2663 argc++; 2471 if (p3) { 2664 if (p3) { /* enc */ 2665 off = new_lit(s, mrb_str_new(s->mrb, p3, 1)); 2666 genop_2(s, OP_STRING, cursp(), off); 2472 2667 push(); 2473 off = new_lit(s, mrb_str_new(s->mrb, p3, 1));2474 genop(s, MKOP_ABx(OP_STRING, cursp(), off));2475 2668 argc++; 2476 pop(); 2477 } 2478 pop(); 2479 } 2480 pop(); 2669 } 2670 } 2671 push(); /* space for a block */ 2672 pop_n(argc+2); 2481 2673 sym = new_sym(s, mrb_intern_lit(s->mrb, "compile")); 2482 genop (s, MKOP_ABC(OP_SEND, cursp(), sym, argc));2674 genop_3(s, OP_SEND, cursp(), sym, argc); 2483 2675 mrb_gc_arena_restore(s->mrb, ai); 2484 2676 push(); … … 2495 2687 char *p; 2496 2688 2497 genop (s, MKOP_A(OP_OCLASS, cursp()));2498 genop (s, MKOP_ABx(OP_GETMCNST, cursp(), sym));2689 genop_1(s, OP_OCLASS, cursp()); 2690 genop_2(s, OP_GETMCNST, cursp(), sym); 2499 2691 push(); 2500 2692 codegen(s, n->car, VAL); … … 2503 2695 codegen(s, n->car, VAL); 2504 2696 pop(); pop(); 2505 genop_ peep(s, MKOP_AB(OP_STRCAT, cursp(), cursp()+1), VAL);2697 genop_1(s, OP_STRCAT, cursp()); 2506 2698 push(); 2507 2699 n = n->cdr; 2508 2700 } 2509 2701 n = tree->cdr->cdr; 2510 if (n->car) { 2702 if (n->car) { /* tail */ 2511 2703 p = (char*)n->car; 2512 2704 off = new_lit(s, mrb_str_new_cstr(s->mrb, p)); 2513 2705 codegen(s, tree->car, VAL); 2514 genop (s, MKOP_ABx(OP_STRING, cursp(), off));2706 genop_2(s, OP_STRING, cursp(), off); 2515 2707 pop(); 2516 genop_peep(s, MKOP_AB(OP_STRCAT, cursp(), cursp()+1), VAL); 2517 } 2518 if (n->cdr->car) { 2708 genop_1(s, OP_STRCAT, cursp()); 2709 push(); 2710 } 2711 if (n->cdr->car) { /* opt */ 2519 2712 char *p2 = (char*)n->cdr->car; 2520 2713 off = new_lit(s, mrb_str_new_cstr(s->mrb, p2)); 2714 genop_2(s, OP_STRING, cursp(), off); 2521 2715 push(); 2716 argc++; 2717 } 2718 if (n->cdr->cdr) { /* enc */ 2719 char *p2 = (char*)n->cdr->cdr; 2522 2720 off = new_lit(s, mrb_str_new_cstr(s->mrb, p2)); 2523 genop(s, MKOP_ABx(OP_STRING, cursp(), off)); 2721 genop_2(s, OP_STRING, cursp(), off); 2722 push(); 2524 2723 argc++; 2525 2724 } 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); 2725 push(); /* space for a block */ 2726 pop_n(argc+2); 2535 2727 sym = new_sym(s, mrb_intern_lit(s->mrb, "compile")); 2536 genop (s, MKOP_ABC(OP_SEND, cursp(), sym, argc));2728 genop_3(s, OP_SEND, cursp(), sym, argc); 2537 2729 mrb_gc_arena_restore(s->mrb, ai); 2538 2730 push(); … … 2542 2734 2543 2735 while (n) { 2544 if ( (intptr_t)n->car->car!= NODE_STR) {2736 if (nint(n->car->car) != NODE_STR) { 2545 2737 codegen(s, n->car, NOVAL); 2546 2738 } … … 2552 2744 case NODE_SYM: 2553 2745 if (val) { 2554 int sym = new_sym(s, sym(tree));2555 2556 genop (s, MKOP_ABx(OP_LOADSYM, cursp(), sym));2746 int sym = new_sym(s, nsym(tree)); 2747 2748 genop_2(s, OP_LOADSYM, cursp(), sym); 2557 2749 push(); 2558 2750 } … … 2562 2754 codegen(s, tree, val); 2563 2755 if (val) { 2564 gen_ send_intern(s);2756 gen_intern(s); 2565 2757 } 2566 2758 break; … … 2568 2760 case NODE_SELF: 2569 2761 if (val) { 2570 genop (s, MKOP_A(OP_LOADSELF, cursp()));2762 genop_1(s, OP_LOADSELF, cursp()); 2571 2763 push(); 2572 2764 } … … 2575 2767 case NODE_NIL: 2576 2768 if (val) { 2577 genop (s, MKOP_A(OP_LOADNIL, cursp()));2769 genop_1(s, OP_LOADNIL, cursp()); 2578 2770 push(); 2579 2771 } … … 2582 2774 case NODE_TRUE: 2583 2775 if (val) { 2584 genop (s, MKOP_A(OP_LOADT, cursp()));2776 genop_1(s, OP_LOADT, cursp()); 2585 2777 push(); 2586 2778 } … … 2589 2781 case NODE_FALSE: 2590 2782 if (val) { 2591 genop (s, MKOP_A(OP_LOADF, cursp()));2783 genop_1(s, OP_LOADF, cursp()); 2592 2784 push(); 2593 2785 } … … 2596 2788 case NODE_ALIAS: 2597 2789 { 2598 int a = new_msym(s, sym(tree->car)); 2599 int b = new_msym(s, sym(tree->cdr)); 2600 int c = new_msym(s, mrb_intern_lit(s->mrb, "alias_method")); 2601 2602 genop(s, MKOP_A(OP_TCLASS, cursp())); 2603 push(); 2604 genop(s, MKOP_ABx(OP_LOADSYM, cursp(), a)); 2605 push(); 2606 genop(s, MKOP_ABx(OP_LOADSYM, cursp(), b)); 2607 push(); 2608 genop(s, MKOP_A(OP_LOADNIL, cursp())); 2609 push(); 2610 pop_n(4); 2611 genop(s, MKOP_ABC(OP_SEND, cursp(), c, 2)); 2790 int a = new_sym(s, nsym(tree->car)); 2791 int b = new_sym(s, nsym(tree->cdr)); 2792 2793 genop_2(s, OP_ALIAS, a, b); 2612 2794 if (val) { 2795 genop_1(s, OP_LOADNIL, cursp()); 2613 2796 push(); 2614 2797 } … … 2618 2801 case NODE_UNDEF: 2619 2802 { 2620 int undef = new_msym(s, mrb_intern_lit(s->mrb, "undef_method"));2621 int num = 0;2622 2803 node *t = tree; 2623 2804 2624 genop(s, MKOP_A(OP_TCLASS, cursp()));2625 push();2626 2805 while (t) { 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)); 2643 genop(s, MKOP_ABx(OP_LOADSYM, cursp(), symbol)); 2644 push(); 2806 int symbol = new_sym(s, nsym(t->car)); 2807 genop_1(s, OP_UNDEF, symbol); 2645 2808 t = t->cdr; 2646 num++; 2647 } 2648 pop(); 2649 if (num < CALL_MAXARGS) { 2650 pop_n(num); 2651 } 2652 genop(s, MKOP_ABC(OP_SEND, cursp(), undef, num)); 2809 } 2653 2810 if (val) { 2811 genop_1(s, OP_LOADNIL, cursp()); 2654 2812 push(); 2655 2813 } … … 2660 2818 { 2661 2819 int idx; 2820 node *body; 2662 2821 2663 2822 if (tree->car->car == (node*)0) { 2664 genop (s, MKOP_A(OP_LOADNIL, cursp()));2823 genop_1(s, OP_LOADNIL, cursp()); 2665 2824 push(); 2666 2825 } 2667 2826 else if (tree->car->car == (node*)1) { 2668 genop (s, MKOP_A(OP_OCLASS, cursp()));2827 genop_1(s, OP_OCLASS, cursp()); 2669 2828 push(); 2670 2829 } … … 2676 2835 } 2677 2836 else { 2678 genop (s, MKOP_A(OP_LOADNIL, cursp()));2837 genop_1(s, OP_LOADNIL, cursp()); 2679 2838 push(); 2680 2839 } 2681 2840 pop(); pop(); 2682 idx = new_msym(s, sym(tree->car->cdr)); 2683 genop(s, MKOP_AB(OP_CLASS, cursp(), idx)); 2684 idx = scope_body(s, tree->cdr->cdr->car, val); 2685 genop(s, MKOP_ABx(OP_EXEC, cursp(), idx)); 2841 idx = new_sym(s, nsym(tree->car->cdr)); 2842 genop_2(s, OP_CLASS, cursp(), idx); 2843 body = tree->cdr->cdr->car; 2844 if (nint(body->cdr->car) == NODE_BEGIN && body->cdr->cdr == NULL) { 2845 genop_1(s, OP_LOADNIL, cursp()); 2846 } 2847 else { 2848 idx = scope_body(s, body, val); 2849 genop_2(s, OP_EXEC, cursp(), idx); 2850 } 2686 2851 if (val) { 2687 2852 push(); … … 2695 2860 2696 2861 if (tree->car->car == (node*)0) { 2697 genop (s, MKOP_A(OP_LOADNIL, cursp()));2862 genop_1(s, OP_LOADNIL, cursp()); 2698 2863 push(); 2699 2864 } 2700 2865 else if (tree->car->car == (node*)1) { 2701 genop (s, MKOP_A(OP_OCLASS, cursp()));2866 genop_1(s, OP_OCLASS, cursp()); 2702 2867 push(); 2703 2868 } … … 2706 2871 } 2707 2872 pop(); 2708 idx = new_msym(s, sym(tree->car->cdr)); 2709 genop(s, MKOP_AB(OP_MODULE, cursp(), idx)); 2710 idx = scope_body(s, tree->cdr->car, val); 2711 genop(s, MKOP_ABx(OP_EXEC, cursp(), idx)); 2873 idx = new_sym(s, nsym(tree->car->cdr)); 2874 genop_2(s, OP_MODULE, cursp(), idx); 2875 if (nint(tree->cdr->car->cdr->car) == NODE_BEGIN && 2876 tree->cdr->car->cdr->cdr == NULL) { 2877 genop_1(s, OP_LOADNIL, cursp()); 2878 } 2879 else { 2880 idx = scope_body(s, tree->cdr->car, val); 2881 genop_2(s, OP_EXEC, cursp(), idx); 2882 } 2712 2883 if (val) { 2713 2884 push(); … … 2722 2893 codegen(s, tree->car, VAL); 2723 2894 pop(); 2724 genop(s, MKOP_AB(OP_SCLASS, cursp(), cursp())); 2725 idx = scope_body(s, tree->cdr->car, val); 2726 genop(s, MKOP_ABx(OP_EXEC, cursp(), idx)); 2895 genop_1(s, OP_SCLASS, cursp()); 2896 if (nint(tree->cdr->car->cdr->car) == NODE_BEGIN && 2897 tree->cdr->car->cdr->cdr == NULL) { 2898 genop_1(s, OP_LOADNIL, cursp()); 2899 } 2900 else { 2901 idx = scope_body(s, tree->cdr->car, val); 2902 genop_2(s, OP_EXEC, cursp(), idx); 2903 } 2727 2904 if (val) { 2728 2905 push(); … … 2733 2910 case NODE_DEF: 2734 2911 { 2735 int sym = new_ msym(s,sym(tree->car));2912 int sym = new_sym(s, nsym(tree->car)); 2736 2913 int idx = lambda_body(s, tree->cdr, 0); 2737 2914 2738 genop (s, MKOP_A(OP_TCLASS, cursp()));2915 genop_1(s, OP_TCLASS, cursp()); 2739 2916 push(); 2740 genop (s, MKOP_Abc(OP_LAMBDA, cursp(), idx, OP_L_METHOD));2917 genop_2(s, OP_METHOD, cursp(), idx); 2741 2918 push(); pop(); 2742 2919 pop(); 2743 genop (s, MKOP_AB(OP_METHOD, cursp(), sym));2920 genop_2(s, OP_DEF, cursp(), sym); 2744 2921 if (val) { 2745 genop (s, MKOP_ABx(OP_LOADSYM, cursp(), sym));2922 genop_2(s, OP_LOADSYM, cursp(), sym); 2746 2923 push(); 2747 2924 } … … 2752 2929 { 2753 2930 node *recv = tree->car; 2754 int sym = new_ msym(s,sym(tree->cdr->car));2931 int sym = new_sym(s, nsym(tree->cdr->car)); 2755 2932 int idx = lambda_body(s, tree->cdr->cdr, 0); 2756 2933 2757 2934 codegen(s, recv, VAL); 2758 2935 pop(); 2759 genop (s, MKOP_AB(OP_SCLASS, cursp(), cursp()));2936 genop_1(s, OP_SCLASS, cursp()); 2760 2937 push(); 2761 genop (s, MKOP_Abc(OP_LAMBDA, cursp(), idx, OP_L_METHOD));2938 genop_2(s, OP_METHOD, cursp(), idx); 2762 2939 pop(); 2763 genop (s, MKOP_AB(OP_METHOD, cursp(), sym));2940 genop_2(s, OP_DEF, cursp(), sym); 2764 2941 if (val) { 2765 genop (s, MKOP_ABx(OP_LOADSYM, cursp(), sym));2942 genop_2(s, OP_LOADSYM, cursp(), sym); 2766 2943 push(); 2767 2944 } … … 2802 2979 codegen_scope *p = (codegen_scope *)mrb_pool_alloc(pool, sizeof(codegen_scope)); 2803 2980 2804 if (!p) return NULL; 2981 if (!p) { 2982 if (prev) 2983 codegen_error(prev, "unexpected scope"); 2984 return NULL; 2985 } 2805 2986 *p = codegen_scope_zero; 2806 2987 p->mrb = mrb; … … 2825 3006 p->irep->plen = 0; 2826 3007 2827 p->scapa = MAXMSYMLEN;3008 p->scapa = 256; 2828 3009 p->irep->syms = (mrb_sym*)mrb_malloc(mrb, sizeof(mrb_sym)*p->scapa); 2829 3010 p->irep->slen = 0; … … 2850 3031 p->ai = mrb_gc_arena_save(mrb); 2851 3032 2852 p->filename = prev->filename;2853 if (p->filename ) {3033 p->filename_sym = prev->filename_sym; 3034 if (p->filename_sym) { 2854 3035 p->lines = (uint16_t*)mrb_malloc(mrb, sizeof(short)*p->icapa); 2855 3036 } … … 2858 3039 /* debug setting */ 2859 3040 p->debug_start_pos = 0; 2860 if (p->filename ) {3041 if (p->filename_sym) { 2861 3042 mrb_debug_info_alloc(mrb, p->irep); 2862 p->irep->filename = p->filename;2863 p->irep->lines = p->lines;2864 3043 } 2865 3044 else { … … 2879 3058 mrb_state *mrb = s->mrb; 2880 3059 mrb_irep *irep = s->irep; 2881 size_t fname_len; 2882 char *fname; 2883 3060 3061 if (s->nlocals >= 0x3ff) { 3062 codegen_error(s, "too many local variables"); 3063 } 2884 3064 irep->flags = 0; 2885 3065 if (s->iseq) { 2886 3066 irep->iseq = (mrb_code *)codegen_realloc(s, s->iseq, sizeof(mrb_code)*s->pc); 2887 3067 irep->ilen = s->pc; 2888 if (s->lines) {2889 irep->lines = (uint16_t *)codegen_realloc(s, s->lines, sizeof(uint16_t)*s->pc);2890 }2891 else {2892 irep->lines = 0;2893 }2894 3068 } 2895 3069 irep->pool = (mrb_value*)codegen_realloc(s, irep->pool, sizeof(mrb_value)*irep->plen); 2896 3070 irep->syms = (mrb_sym*)codegen_realloc(s, irep->syms, sizeof(mrb_sym)*irep->slen); 2897 3071 irep->reps = (mrb_irep**)codegen_realloc(s, irep->reps, sizeof(mrb_irep*)*irep->rlen); 2898 if (s->filename) { 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); 2901 2902 fname_len = strlen(s->filename); 2903 fname = (char*)codegen_malloc(s, fname_len + 1); 2904 memcpy(fname, s->filename, fname_len); 2905 fname[fname_len] = '\0'; 2906 irep->filename = fname; 2907 irep->own_filename = TRUE; 2908 } 3072 if (s->filename_sym) { 3073 mrb_sym fname = mrb_parser_get_filename(s->parser, s->filename_index); 3074 const char *filename = mrb_sym_name_len(s->mrb, fname, NULL); 3075 3076 mrb_debug_info_append_file(s->mrb, s->irep->debug_info, 3077 filename, s->lines, s->debug_start_pos, s->pc); 3078 } 3079 mrb_free(s->mrb, s->lines); 2909 3080 2910 3081 irep->nlocals = s->nlocals; … … 2921 3092 2922 3093 p->type = t; 2923 p->pc 1 = p->pc2 = p->pc3 = 0;3094 p->pc0 = p->pc1 = p->pc2 = p->pc3 = 0; 2924 3095 p->prev = s->loop; 2925 3096 p->ensure_level = s->ensure_level; … … 2939 3110 else { 2940 3111 struct loopinfo *loop; 3112 int n = 0; 2941 3113 2942 3114 if (tree) { … … 2945 3117 2946 3118 loop = s->loop; 2947 while (loop && loop->type == LOOP_BEGIN) { 2948 genop_peep(s, MKOP_A(OP_POPERR, 1), NOVAL); 2949 loop = loop->prev; 2950 } 2951 while (loop && loop->type == LOOP_RESCUE) { 2952 loop = loop->prev; 3119 while (loop) { 3120 if (loop->type == LOOP_BEGIN) { 3121 n++; 3122 loop = loop->prev; 3123 } 3124 else if (loop->type == LOOP_RESCUE) { 3125 loop = loop->prev; 3126 } 3127 else{ 3128 break; 3129 } 2953 3130 } 2954 3131 if (!loop) { … … 2956 3133 return; 2957 3134 } 3135 if (n > 0) { 3136 genop_1(s, OP_POPERR, n); 3137 } 2958 3138 2959 3139 if (loop->type == LOOP_NORMAL) { … … 2961 3141 2962 3142 if (s->ensure_level > s->loop->ensure_level) { 2963 genop_ peep(s, MKOP_A(OP_EPOP, s->ensure_level - s->loop->ensure_level), NOVAL);3143 genop_1(s, OP_EPOP, s->ensure_level - s->loop->ensure_level); 2964 3144 } 2965 3145 if (tree) { 2966 gen op_peep(s, MKOP_AB(OP_MOVE, loop->acc, cursp()), NOVAL);2967 } 2968 tmp = gen op(s, MKOP_sBx(OP_JMP, loop->pc3));3146 gen_move(s, loop->acc, cursp(), 0); 3147 } 3148 tmp = genjmp(s, OP_JMP, loop->pc3); 2969 3149 loop->pc3 = tmp; 2970 3150 } 2971 3151 else { 2972 3152 if (!tree) { 2973 genop (s, MKOP_A(OP_LOADNIL, cursp()));2974 } 2975 gen op(s, MKOP_AB(OP_RETURN, cursp(), OP_R_BREAK));3153 genop_1(s, OP_LOADNIL, cursp()); 3154 } 3155 gen_return(s, OP_BREAK, cursp()); 2976 3156 } 2977 3157 } … … 2981 3161 loop_pop(codegen_scope *s, int val) 2982 3162 { 3163 if (val) { 3164 genop_1(s, OP_LOADNIL, cursp()); 3165 } 2983 3166 dispatch_linked(s, s->loop->pc3); 2984 if (val) {2985 genop(s, MKOP_A(OP_LOADNIL, cursp()));2986 }2987 3167 s->loop = s->loop->prev; 2988 3168 if (val) push(); 2989 3169 } 2990 3170 2991 MRB_APIstruct RProc*2992 mrb_generate_code(mrb_state *mrb, parser_state *p)3171 static struct RProc* 3172 generate_code(mrb_state *mrb, parser_state *p, int val) 2993 3173 { 2994 3174 codegen_scope *scope = scope_new(mrb, 0, 0); … … 2996 3176 struct mrb_jmpbuf *prev_jmp = mrb->jmp; 2997 3177 2998 if (!scope) {2999 return NULL;3000 }3001 3178 scope->mrb = mrb; 3002 3179 scope->parser = p; 3003 scope->filename = p->filename;3180 scope->filename_sym = p->filename_sym; 3004 3181 scope->filename_index = p->current_filename_index; 3005 3182 3006 3183 MRB_TRY(&scope->jmp) { 3007 mrb->jmp = &scope->jmp; 3184 mrb->jmp = &scope->jmp; 3008 3185 /* prepare irep */ 3009 codegen(scope, p->tree, NOVAL);3186 codegen(scope, p->tree, val); 3010 3187 proc = mrb_proc_new(mrb, scope->irep); 3011 3188 mrb_irep_decref(mrb, scope->irep); 3012 3189 mrb_pool_close(scope->mpool); 3013 3190 proc->c = NULL; 3191 if (mrb->c->cibase && mrb->c->cibase->proc == proc->upper) { 3192 proc->upper = NULL; 3193 } 3014 3194 mrb->jmp = prev_jmp; 3015 3195 return proc; … … 3023 3203 MRB_END_EXC(&scope->jmp); 3024 3204 } 3205 3206 MRB_API struct RProc* 3207 mrb_generate_code(mrb_state *mrb, parser_state *p) 3208 { 3209 return generate_code(mrb, p, VAL); 3210 } 3211 3212 void 3213 mrb_irep_remove_lv(mrb_state *mrb, mrb_irep *irep) 3214 { 3215 int i; 3216 3217 if (irep->lv) { 3218 mrb_free(mrb, irep->lv); 3219 irep->lv = NULL; 3220 } 3221 3222 for (i = 0; i < irep->rlen; ++i) { 3223 mrb_irep_remove_lv(mrb, irep->reps[i]); 3224 } 3225 } 3226 3227 #undef OPCODE 3228 #define Z 1 3229 #define S 3 3230 #define W 4 3231 /* instruction sizes */ 3232 uint8_t mrb_insn_size[] = { 3233 #define B 2 3234 #define BB 3 3235 #define BBB 4 3236 #define BS 4 3237 #define SB 4 3238 #define OPCODE(_,x) x, 3239 #include "mruby/ops.h" 3240 #undef OPCODE 3241 #undef B 3242 #undef BB 3243 #undef BS 3244 #undef SB 3245 #undef BBB 3246 }; 3247 /* EXT1 instruction sizes */ 3248 uint8_t mrb_insn_size1[] = { 3249 #define B 3 3250 #define BB 4 3251 #define BBB 5 3252 #define BS 5 3253 #define SB 5 3254 #define OPCODE(_,x) x, 3255 #include "mruby/ops.h" 3256 #undef OPCODE 3257 #undef B 3258 }; 3259 /* EXT2 instruction sizes */ 3260 uint8_t mrb_insn_size2[] = { 3261 #define B 2 3262 #define OPCODE(_,x) x, 3263 #include "mruby/ops.h" 3264 #undef OPCODE 3265 #undef BB 3266 #undef BBB 3267 #undef BS 3268 #undef SB 3269 }; 3270 /* EXT3 instruction sizes */ 3271 #define BB 5 3272 #define BBB 6 3273 #define BS 4 3274 #define SB 5 3275 uint8_t mrb_insn_size3[] = { 3276 #define OPCODE(_,x) x, 3277 #include "mruby/ops.h" 3278 }; -
EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-compiler/core/keywords
r270 r439 1 1 %{ 2 2 struct kwtable {const char *name; int id[2]; enum mrb_lex_state_enum state;}; 3 const struct kwtable *mrb_reserved_word(const char *, unsigned int);4 static const struct kwtable *reserved_word(const char *, unsigned int);5 #define mrb_reserved_word(str, len) reserved_word(str, len)6 3 %} 7 4 -
EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-compiler/core/lex.def
r331 r439 1 /* ANSI-C code produced by gperf version 3. 0.4*/1 /* ANSI-C code produced by gperf version 3.1 */ 2 2 /* Command-line: gperf -L ANSI-C -C -p -j1 -i 1 -g -o -t -N mrb_reserved_word -k'1,3,$' /home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords */ 3 3 … … 26 26 && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126)) 27 27 /* The character set is not based on ISO-646. */ 28 #error "gperf generated tables don't work with this execution character set. Please report a bug to <bug-g nu-gperf@gnu.org>."28 #error "gperf generated tables don't work with this execution character set. Please report a bug to <bug-gperf@gnu.org>." 29 29 #endif 30 30 … … 32 32 33 33 struct kwtable {const char *name; int id[2]; enum mrb_lex_state_enum state;}; 34 const struct kwtable *mrb_reserved_word(const char *, unsigned int); 35 static const struct kwtable *reserved_word(const char *, unsigned int); 36 #define mrb_reserved_word(str, len) reserved_word(str, len) 37 #line 8 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords" 34 #line 5 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords" 38 35 struct kwtable; 39 36 … … 53 50 #endif 54 51 static unsigned int 55 hash (register const char *str, register unsigned int len)52 hash (register const char *str, register size_t len) 56 53 { 57 54 static const unsigned char asso_values[] = … … 84 81 51, 51, 51, 51, 51, 51 85 82 }; 86 register int hval = len;83 register unsigned int hval = len; 87 84 88 85 switch (hval) … … 99 96 } 100 97 101 #ifdef __GNUC__102 __inline103 #if defined __GNUC_STDC_INLINE__ || defined __GNUC_GNU_INLINE__104 __attribute__ ((__gnu_inline__))105 #endif106 #endif107 98 const struct kwtable * 108 mrb_reserved_word (register const char *str, register unsigned int len)99 mrb_reserved_word (register const char *str, register size_t len) 109 100 { 110 101 static const struct kwtable wordlist[] = 111 102 { 112 103 {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, 104 #line 15 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords" 105 {"break", {keyword_break, keyword_break}, EXPR_MID}, 106 #line 20 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords" 107 {"else", {keyword_else, keyword_else}, EXPR_BEG}, 108 #line 30 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords" 109 {"nil", {keyword_nil, keyword_nil}, EXPR_END}, 110 #line 23 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords" 111 {"ensure", {keyword_ensure, keyword_ensure}, EXPR_BEG}, 112 #line 22 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords" 113 {"end", {keyword_end, keyword_end}, EXPR_END}, 114 #line 39 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords" 115 {"then", {keyword_then, keyword_then}, EXPR_BEG}, 116 #line 31 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords" 117 {"not", {keyword_not, keyword_not}, EXPR_ARG}, 118 #line 24 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords" 119 {"false", {keyword_false, keyword_false}, EXPR_END}, 120 #line 37 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords" 121 {"self", {keyword_self, keyword_self}, EXPR_END}, 122 #line 21 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords" 123 {"elsif", {keyword_elsif, keyword_elsif}, EXPR_VALUE}, 124 #line 34 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords" 125 {"rescue", {keyword_rescue, modifier_rescue}, EXPR_MID}, 126 #line 40 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords" 127 {"true", {keyword_true, keyword_true}, EXPR_END}, 128 #line 43 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords" 129 {"until", {keyword_until, modifier_until}, EXPR_VALUE}, 130 #line 42 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords" 131 {"unless", {keyword_unless, modifier_unless}, EXPR_VALUE}, 132 #line 36 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords" 133 {"return", {keyword_return, keyword_return}, EXPR_MID}, 113 134 #line 18 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords" 114 {"break", {keyword_break, keyword_break}, EXPR_MID}, 115 #line 23 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords" 116 {"else", {keyword_else, keyword_else}, EXPR_BEG}, 135 {"def", {keyword_def, keyword_def}, EXPR_FNAME}, 136 #line 13 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords" 137 {"and", {keyword_and, keyword_and}, EXPR_VALUE}, 138 #line 19 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords" 139 {"do", {keyword_do, keyword_do}, EXPR_BEG}, 140 #line 46 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords" 141 {"yield", {keyword_yield, keyword_yield}, EXPR_ARG}, 142 #line 25 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords" 143 {"for", {keyword_for, keyword_for}, EXPR_VALUE}, 144 #line 41 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords" 145 {"undef", {keyword_undef, keyword_undef}, EXPR_FNAME}, 146 #line 32 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords" 147 {"or", {keyword_or, keyword_or}, EXPR_VALUE}, 148 #line 27 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords" 149 {"in", {keyword_in, keyword_in}, EXPR_VALUE}, 150 #line 44 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords" 151 {"when", {keyword_when, keyword_when}, EXPR_VALUE}, 152 #line 35 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords" 153 {"retry", {keyword_retry, keyword_retry}, EXPR_END}, 154 #line 26 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords" 155 {"if", {keyword_if, modifier_if}, EXPR_VALUE}, 156 #line 16 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords" 157 {"case", {keyword_case, keyword_case}, EXPR_VALUE}, 117 158 #line 33 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords" 118 {"nil", {keyword_nil, keyword_nil}, EXPR_END}, 119 #line 26 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords" 120 {"ensure", {keyword_ensure, keyword_ensure}, EXPR_BEG}, 121 #line 25 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords" 122 {"end", {keyword_end, keyword_end}, EXPR_END}, 123 #line 42 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords" 124 {"then", {keyword_then, keyword_then}, EXPR_BEG}, 125 #line 34 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords" 126 {"not", {keyword_not, keyword_not}, EXPR_ARG}, 127 #line 27 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords" 128 {"false", {keyword_false, keyword_false}, EXPR_END}, 129 #line 40 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords" 130 {"self", {keyword_self, keyword_self}, EXPR_END}, 131 #line 24 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords" 132 {"elsif", {keyword_elsif, keyword_elsif}, EXPR_VALUE}, 133 #line 37 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords" 134 {"rescue", {keyword_rescue, modifier_rescue}, EXPR_MID}, 135 #line 43 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords" 136 {"true", {keyword_true, keyword_true}, EXPR_END}, 137 #line 46 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords" 138 {"until", {keyword_until, modifier_until}, EXPR_VALUE}, 139 #line 45 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords" 140 {"unless", {keyword_unless, modifier_unless}, EXPR_VALUE}, 141 #line 39 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords" 142 {"return", {keyword_return, keyword_return}, EXPR_MID}, 143 #line 21 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords" 144 {"def", {keyword_def, keyword_def}, EXPR_FNAME}, 145 #line 16 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords" 146 {"and", {keyword_and, keyword_and}, EXPR_VALUE}, 147 #line 22 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords" 148 {"do", {keyword_do, keyword_do}, EXPR_BEG}, 149 #line 49 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords" 150 {"yield", {keyword_yield, keyword_yield}, EXPR_ARG}, 159 {"redo", {keyword_redo, keyword_redo}, EXPR_END}, 160 #line 29 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords" 161 {"next", {keyword_next, keyword_next}, EXPR_MID}, 162 #line 38 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords" 163 {"super", {keyword_super, keyword_super}, EXPR_ARG}, 151 164 #line 28 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords" 152 {"for", {keyword_for, keyword_for}, EXPR_VALUE},153 #line 44 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"154 {"undef", {keyword_undef, keyword_undef}, EXPR_FNAME},155 #line 35 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"156 {"or", {keyword_or, keyword_or}, EXPR_VALUE},157 #line 30 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"158 {"in", {keyword_in, keyword_in}, EXPR_VALUE},159 #line 47 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"160 {"when", {keyword_when, keyword_when}, EXPR_VALUE},161 #line 38 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"162 {"retry", {keyword_retry, keyword_retry}, EXPR_END},163 #line 29 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"164 {"if", {keyword_if, modifier_if}, EXPR_VALUE},165 #line 19 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"166 {"case", {keyword_case, keyword_case}, EXPR_VALUE},167 #line 36 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"168 {"redo", {keyword_redo, keyword_redo}, EXPR_END},169 #line 32 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"170 {"next", {keyword_next, keyword_next}, EXPR_MID},171 #line 41 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"172 {"super", {keyword_super, keyword_super}, EXPR_ARG},173 #line 31 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"174 165 {"module", {keyword_module, keyword_module}, EXPR_VALUE}, 175 #line 1 7"/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"166 #line 14 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords" 176 167 {"begin", {keyword_begin, keyword_begin}, EXPR_BEG}, 168 #line 9 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords" 169 {"__LINE__", {keyword__LINE__, keyword__LINE__}, EXPR_END}, 170 #line 8 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords" 171 {"__FILE__", {keyword__FILE__, keyword__FILE__}, EXPR_END}, 172 #line 7 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords" 173 {"__ENCODING__", {keyword__ENCODING__, keyword__ENCODING__}, EXPR_END}, 174 #line 11 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords" 175 {"END", {keyword_END, keyword_END}, EXPR_END}, 177 176 #line 12 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords" 178 {"__LINE__", {keyword__LINE__, keyword__LINE__}, EXPR_END}, 179 #line 11 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords" 180 {"__FILE__", {keyword__FILE__, keyword__FILE__}, EXPR_END}, 177 {"alias", {keyword_alias, keyword_alias}, EXPR_FNAME}, 181 178 #line 10 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords" 182 {"__ENCODING__", {keyword__ENCODING__, keyword__ENCODING__}, EXPR_END},183 #line 14 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"184 {"END", {keyword_END, keyword_END}, EXPR_END},185 #line 15 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"186 {"alias", {keyword_alias, keyword_alias}, EXPR_FNAME},187 #line 13 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"188 179 {"BEGIN", {keyword_BEGIN, keyword_BEGIN}, EXPR_END}, 189 180 {""}, 190 #line 20"/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"181 #line 17 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords" 191 182 {"class", {keyword_class, keyword_class}, EXPR_CLASS}, 192 183 {""}, {""}, 193 #line 4 8"/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"184 #line 45 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords" 194 185 {"while", {keyword_while, modifier_while}, EXPR_VALUE} 195 186 }; … … 197 188 if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH) 198 189 { 199 register int key = hash (str, len);200 201 if (key <= MAX_HASH_VALUE && key >= 0)190 register unsigned int key = hash (str, len); 191 192 if (key <= MAX_HASH_VALUE) 202 193 { 203 194 register const char *s = wordlist[key].name; … … 209 200 return 0; 210 201 } 211 #line 50"/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"212 202 #line 47 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords" 203 -
EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-compiler/core/node.h
r331 r439 10 10 enum node_type { 11 11 NODE_METHOD, 12 NODE_FBODY,13 NODE_CFUNC,14 12 NODE_SCOPE, 15 13 NODE_BLOCK, … … 17 15 NODE_CASE, 18 16 NODE_WHEN, 19 NODE_OPT_N,20 17 NODE_WHILE, 21 18 NODE_UNTIL, … … 41 38 NODE_SCALL, 42 39 NODE_FCALL, 43 NODE_VCALL,44 40 NODE_SUPER, 45 41 NODE_ZSUPER, … … 47 43 NODE_ZARRAY, 48 44 NODE_HASH, 45 NODE_KW_HASH, 49 46 NODE_RETURN, 50 47 NODE_YIELD, … … 55 52 NODE_CONST, 56 53 NODE_CVAR, 54 NODE_NVAR, 57 55 NODE_NTH_REF, 58 56 NODE_BACK_REF, 59 57 NODE_MATCH, 60 NODE_MATCH2,61 NODE_MATCH3,62 58 NODE_INT, 63 59 NODE_FLOAT, … … 72 68 NODE_DREGX, 73 69 NODE_DREGX_ONCE, 74 NODE_LIST,75 70 NODE_ARG, 76 NODE_ARGSCAT, 77 NODE_ARGSPUSH, 71 NODE_ARGS_TAIL, 72 NODE_KW_ARG, 73 NODE_KW_REST_ARGS, 78 74 NODE_SPLAT, 79 75 NODE_TO_ARY, … … 89 85 NODE_COLON2, 90 86 NODE_COLON3, 91 NODE_CREF,92 87 NODE_DOT2, 93 88 NODE_DOT3, 94 NODE_FLIP2,95 NODE_FLIP3,96 NODE_ATTRSET,97 89 NODE_SELF, 98 90 NODE_NIL, … … 100 92 NODE_FALSE, 101 93 NODE_DEFINED, 102 NODE_NEWLINE,103 94 NODE_POSTEXE, 104 NODE_ALLOCA,105 NODE_DMETHOD,106 NODE_BMETHOD,107 NODE_MEMO,108 NODE_IFUNC,109 95 NODE_DSYM, 110 NODE_ATTRASGN,111 96 NODE_HEREDOC, 112 97 NODE_LITERAL_DELIM, -
EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-compiler/core/parse.y
r331 r439 11 11 #endif 12 12 #define YYERROR_VERBOSE 1 13 /* 14 * Force yacc to use our memory management. This is a little evil because 15 * the macros assume that "parser_state *p" is in scope 16 */ 17 #define YYMALLOC(n) mrb_malloc(p->mrb, (n)) 18 #define YYFREE(o) mrb_free(p->mrb, (o)) 19 #define YYSTACK_USE_ALLOCA 0 13 #define YYSTACK_USE_ALLOCA 1 20 14 21 15 #include <ctype.h> … … 28 22 #include <mruby/error.h> 29 23 #include <mruby/throw.h> 24 #include <mruby/string.h> 30 25 #include "node.h" 31 26 … … 77 72 #define intn(x) ((int)(intptr_t)(x)) 78 73 74 #define NUM_SUFFIX_R (1<<0) 75 #define NUM_SUFFIX_I (1<<1) 76 79 77 static inline mrb_sym 80 78 intern_cstr_gen(parser_state *p, const char *s) … … 91 89 #define intern(s,len) intern_gen(p,(s),(len)) 92 90 93 static inline mrb_sym 94 intern_gen_c(parser_state *p, const char c) 95 { 96 return mrb_intern(p->mrb, &c, 1); 97 } 98 #define intern_c(c) intern_gen_c(p,(c)) 91 #define intern_lit(s) mrb_intern_lit(p->mrb, s) 99 92 100 93 static void … … 134 127 c->lineno = p->lineno; 135 128 c->filename_index = p->current_filename_index; 129 /* beginning of next partial file; need to point the previous file */ 130 if (p->lineno == 0 && p->current_filename_index > 0) { 131 c->filename_index-- ; 132 } 136 133 return c; 137 134 } … … 186 183 187 184 if (!a) return b; 185 if (!b) return a; 188 186 while (c->cdr) { 189 187 c = c->cdr; 190 188 } 191 if (b) { 192 c->cdr = b; 193 } 189 c->cdr = b; 194 190 return a; 195 191 } … … 216 212 #undef strdup 217 213 #define strdup(s) parser_strdup(p, s) 214 215 static void 216 dump_int(uint16_t i, char *s) 217 { 218 char *p = s; 219 char *t = s; 220 221 while (i > 0) { 222 *p++ = (i % 10)+'0'; 223 i /= 10; 224 } 225 if (p == s) *p++ = '0'; 226 *p = 0; 227 p--; /* point the last char */ 228 while (t < p) { 229 char c = *t; 230 *t++ = *p; 231 *p-- = c; 232 } 233 } 218 234 219 235 /* xxx ----------------------------- */ … … 280 296 } 281 297 298 static void 299 local_add_blk(parser_state *p, mrb_sym blk) 300 { 301 /* allocate register for block */ 302 local_add_f(p, blk ? blk : mrb_intern_lit(p->mrb, "&")); 303 } 304 305 static void 306 local_add_kw(parser_state *p, mrb_sym kwd) 307 { 308 /* allocate register for keywords hash */ 309 local_add_f(p, kwd ? kwd : mrb_intern_lit(p->mrb, "**")); 310 } 311 282 312 static node* 283 313 locals_node(parser_state *p) 284 314 { 285 315 return p->locals ? p->locals->car : NULL; 316 } 317 318 static void 319 nvars_nest(parser_state *p) 320 { 321 p->nvars = cons(nint(0), p->nvars); 322 } 323 324 static void 325 nvars_block(parser_state *p) 326 { 327 p->nvars = cons(nint(-2), p->nvars); 328 } 329 330 static void 331 nvars_unnest(parser_state *p) 332 { 333 p->nvars = p->nvars->cdr; 286 334 } 287 335 … … 569 617 } 570 618 619 /* (:kw_hash (k . v) (k . v)...) */ 620 static node* 621 new_kw_hash(parser_state *p, node *a) 622 { 623 return cons((node*)NODE_KW_HASH, a); 624 } 625 571 626 /* (:sym . a) */ 572 627 static node* … … 613 668 } 614 669 670 /* (:nvar . a) */ 671 static node* 672 new_nvar(parser_state *p, int num) 673 { 674 int nvars = intn(p->nvars->car); 675 676 p->nvars->car = nint(nvars > num ? nvars : num); 677 return cons((node*)NODE_NVAR, nint(num)); 678 } 679 615 680 /* (:const . a) */ 616 681 static node* … … 672 737 } 673 738 674 /* (m o r m2 b) */ 739 static void 740 local_add_margs(parser_state *p, node *n) 741 { 742 while (n) { 743 if (n->car->car == (node*)NODE_MASGN) { 744 node *t = n->car->cdr->cdr; 745 746 n->car->cdr->cdr = NULL; 747 while (t) { 748 local_add_f(p, sym(t->car)); 749 t = t->cdr; 750 } 751 local_add_margs(p, n->car->cdr->car->car); 752 local_add_margs(p, n->car->cdr->car->cdr->cdr->car); 753 } 754 n = n->cdr; 755 } 756 } 757 758 static void 759 local_add_lv(parser_state *p, node *lv) 760 { 761 while (lv) { 762 local_add_f(p, sym(lv->car)); 763 lv = lv->cdr; 764 } 765 } 766 767 /* (m o r m2 tail) */ 675 768 /* m: (a b c) */ 676 769 /* o: ((a . e1) (b . e2)) */ … … 679 772 /* b: a */ 680 773 static node* 681 new_args(parser_state *p, node *m, node *opt, mrb_sym rest, node *m2, mrb_sym blk)774 new_args(parser_state *p, node *m, node *opt, mrb_sym rest, node *m2, node *tail) 682 775 { 683 776 node *n; 684 777 685 n = cons(m2, nsym(blk)); 778 local_add_margs(p, m); 779 local_add_margs(p, m2); 780 n = cons(m2, tail); 686 781 n = cons(nsym(rest), n); 687 782 n = cons(opt, n); 783 while (opt) { 784 /* opt: (sym . (opt . lv)) -> (sym . opt) */ 785 local_add_lv(p, opt->car->cdr->cdr); 786 opt->car->cdr = opt->car->cdr->car; 787 opt = opt->cdr; 788 } 688 789 return cons(m, n); 689 790 } 690 791 792 /* (:args_tail keywords rest_keywords_sym block_sym) */ 793 static node* 794 new_args_tail(parser_state *p, node *kws, node *kwrest, mrb_sym blk) 795 { 796 node *k; 797 798 if (kws || kwrest) { 799 local_add_kw(p, (kwrest && kwrest->cdr)? sym(kwrest->cdr) : 0); 800 } 801 802 local_add_blk(p, blk); 803 804 /* allocate register for keywords arguments */ 805 /* order is for Proc#parameters */ 806 for (k = kws; k; k = k->cdr) { 807 if (!k->car->cdr->cdr->car) { /* allocate required keywords */ 808 local_add_f(p, sym(k->car->cdr->car)); 809 } 810 } 811 for (k = kws; k; k = k->cdr) { 812 if (k->car->cdr->cdr->car) { /* allocate keywords with default */ 813 local_add_lv(p, k->car->cdr->cdr->car->cdr); 814 k->car->cdr->cdr->car = k->car->cdr->cdr->car->car; 815 local_add_f(p, sym(k->car->cdr->car)); 816 } 817 } 818 819 return list4((node*)NODE_ARGS_TAIL, kws, kwrest, nsym(blk)); 820 } 821 822 /* (:kw_arg kw_sym def_arg) */ 823 static node* 824 new_kw_arg(parser_state *p, mrb_sym kw, node *def_arg) 825 { 826 mrb_assert(kw); 827 return list3((node*)NODE_KW_ARG, nsym(kw), def_arg); 828 } 829 691 830 /* (:block_arg . a) */ 692 831 static node* … … 696 835 } 697 836 837 static node* 838 setup_numparams(parser_state *p, node *a) 839 { 840 int nvars = intn(p->nvars->car); 841 if (nvars > 0) { 842 int i; 843 mrb_sym sym; 844 // m || opt || rest || tail 845 if (a && (a->car || (a->cdr && a->cdr->car) || (a->cdr->cdr && a->cdr->cdr->car) || (a->cdr->cdr->cdr->cdr && a->cdr->cdr->cdr->cdr->car))) { 846 yyerror(p, "ordinary parameter is defined"); 847 } 848 else if (p->locals) { 849 /* p->locals should not be NULL unless error happens before the point */ 850 node* args = 0; 851 for (i = nvars; i > 0; i--) { 852 char buf[3]; 853 854 buf[0] = '_'; 855 buf[1] = i+'0'; 856 buf[2] = '\0'; 857 sym = intern_cstr(buf); 858 args = cons(new_arg(p, sym), args); 859 p->locals->car = cons(nsym(sym), p->locals->car); 860 } 861 a = new_args(p, args, 0, 0, 0, 0); 862 } 863 } 864 return a; 865 } 866 698 867 /* (:block arg body) */ 699 868 static node* 700 869 new_block(parser_state *p, node *a, node *b) 701 870 { 871 a = setup_numparams(p, a); 702 872 return list4((node*)NODE_BLOCK, locals_node(p), a, b); 703 873 } … … 726 896 } 727 897 898 /* (:masgn mlhs mrhs) no check */ 899 static node* 900 new_masgn_param(parser_state *p, node *a, node *b) 901 { 902 return cons((node*)NODE_MASGN, cons(a, b)); 903 } 904 728 905 /* (:asgn lhs rhs) */ 729 906 static node* … … 734 911 } 735 912 913 static node* 914 new_imaginary(parser_state *p, node *imaginary) 915 { 916 return new_call(p, new_const(p, intern_lit("Kernel")), intern_lit("Complex"), list1(list2(list3((node*)NODE_INT, (node*)strdup("0"), nint(10)), imaginary)), 1); 917 } 918 919 static node* 920 new_rational(parser_state *p, node *rational) 921 { 922 return new_call(p, new_const(p, intern_lit("Kernel")), intern_lit("Rational"), list1(list1(rational)), 1); 923 } 924 736 925 /* (:int . i) */ 737 926 static node* 738 new_int(parser_state *p, const char *s, int base) 739 { 740 return list3((node*)NODE_INT, (node*)strdup(s), nint(base)); 741 } 742 927 new_int(parser_state *p, const char *s, int base, int suffix) 928 { 929 node* result = list3((node*)NODE_INT, (node*)strdup(s), nint(base)); 930 if (suffix & NUM_SUFFIX_R) { 931 result = new_rational(p, result); 932 } 933 if (suffix & NUM_SUFFIX_I) { 934 result = new_imaginary(p, result); 935 } 936 return result; 937 } 938 939 #ifndef MRB_WITHOUT_FLOAT 743 940 /* (:float . i) */ 744 941 static node* 745 new_float(parser_state *p, const char *s) 746 { 747 return cons((node*)NODE_FLOAT, (node*)strdup(s)); 748 } 942 new_float(parser_state *p, const char *s, int suffix) 943 { 944 node* result = cons((node*)NODE_FLOAT, (node*)strdup(s)); 945 if (suffix & NUM_SUFFIX_R) { 946 result = new_rational(p, result); 947 } 948 if (suffix & NUM_SUFFIX_I) { 949 result = new_imaginary(p, result); 950 } 951 return result; 952 } 953 #endif 749 954 750 955 /* (:str . (s . len)) */ 751 956 static node* 752 new_str(parser_state *p, const char *s, int len)957 new_str(parser_state *p, const char *s, size_t len) 753 958 { 754 959 return cons((node*)NODE_STR, cons((node*)strndup(s, len), nint(len))); … … 762 967 } 763 968 969 static int 970 string_node_p(node *n) 971 { 972 return (int)((enum node_type)(intptr_t)n->car == NODE_STR); 973 } 974 975 static node* 976 composite_string_node(parser_state *p, node *a, node *b) 977 { 978 size_t newlen = (size_t)a->cdr + (size_t)b->cdr; 979 char *str = (char*)mrb_pool_realloc(p->pool, a->car, (size_t)a->cdr + 1, newlen + 1); 980 memcpy(str + (size_t)a->cdr, b->car, (size_t)b->cdr); 981 str[newlen] = '\0'; 982 a->car = (node*)str; 983 a->cdr = (node*)newlen; 984 cons_free(b); 985 return a; 986 } 987 988 static node* 989 concat_string(parser_state *p, node *a, node *b) 990 { 991 if (string_node_p(a)) { 992 if (string_node_p(b)) { 993 /* a == NODE_STR && b == NODE_STR */ 994 composite_string_node(p, a->cdr, b->cdr); 995 cons_free(b); 996 return a; 997 } 998 else { 999 /* a == NODE_STR && b == NODE_DSTR */ 1000 1001 if (string_node_p(b->cdr->car)) { 1002 /* a == NODE_STR && b->[NODE_STR, ...] */ 1003 composite_string_node(p, a->cdr, b->cdr->car->cdr); 1004 cons_free(b->cdr->car); 1005 b->cdr->car = a; 1006 return b; 1007 } 1008 } 1009 } 1010 else { 1011 node *c; /* last node of a */ 1012 for (c = a; c->cdr != NULL; c = c->cdr) ; 1013 1014 if (string_node_p(b)) { 1015 /* a == NODE_DSTR && b == NODE_STR */ 1016 if (string_node_p(c->car)) { 1017 /* a->[..., NODE_STR] && b == NODE_STR */ 1018 composite_string_node(p, c->car->cdr, b->cdr); 1019 cons_free(b); 1020 return a; 1021 } 1022 1023 push(a, b); 1024 return a; 1025 } 1026 else { 1027 /* a == NODE_DSTR && b == NODE_DSTR */ 1028 if (string_node_p(c->car) && string_node_p(b->cdr->car)) { 1029 /* a->[..., NODE_STR] && b->[NODE_STR, ...] */ 1030 node *d = b->cdr; 1031 cons_free(b); 1032 composite_string_node(p, c->car->cdr, d->car->cdr); 1033 cons_free(d->car); 1034 c->cdr = d->cdr; 1035 cons_free(d); 1036 return a; 1037 } 1038 else { 1039 c->cdr = b->cdr; 1040 cons_free(b); 1041 return a; 1042 } 1043 } 1044 } 1045 1046 return new_dstr(p, list2(a, b)); 1047 } 1048 764 1049 /* (:str . (s . len)) */ 765 1050 static node* … … 780 1065 new_dsym(parser_state *p, node *a) 781 1066 { 782 return cons((node*)NODE_DSYM, new_dstr(p, a));1067 return cons((node*)NODE_DSYM, a); 783 1068 } 784 1069 … … 1024 1309 if (p->parsing_heredoc == NULL) { 1025 1310 p->lstate = EXPR_BEG; 1026 p->cmd_start = TRUE;1027 1311 end_strterm(p); 1028 1312 p->lex_strterm = p->lex_strterm_before_heredoc; 1029 1313 p->lex_strterm_before_heredoc = NULL; 1030 p->heredoc_end_now = TRUE;1031 1314 } 1032 1315 else { … … 1105 1388 keyword__ENCODING__ 1106 1389 1107 %token <id> tIDENTIFIER tFID tGVAR tIVAR tCONSTANT tCVAR tLABEL 1390 %token <id> tIDENTIFIER tFID tGVAR tIVAR tCONSTANT tCVAR tLABEL_TAG 1108 1391 %token <nd> tINTEGER tFLOAT tCHAR tXSTRING tREGEXP 1109 %token <nd> tSTRING tSTRING_PART tSTRING_MID tLABEL_END1392 %token <nd> tSTRING tSTRING_PART tSTRING_MID 1110 1393 %token <nd> tNTH_REF tBACK_REF 1111 1394 %token <num> tREGEXP_END 1112 1113 %type <nd> singleton string string_rep string_interp xstring regexp 1395 %token <num> tNUMPARAM 1396 1397 %type <nd> singleton string string_fragment string_rep string_interp xstring regexp 1114 1398 %type <nd> literal numeric cpath symbol 1115 1399 %type <nd> top_compstmt top_stmts top_stmt … … 1122 1406 %type <nd> command_asgn command_rhs mrhs superclass block_call block_command 1123 1407 %type <nd> f_block_optarg f_block_opt 1124 %type <nd> f_arglist f_args f_arg f_arg_item f_optarg f_marg f_marg_list f_margs1408 %type <nd> f_arglist f_args f_arg f_arg_item f_optarg f_margs 1125 1409 %type <nd> assoc_list assocs assoc undef_list backref for_var 1126 1410 %type <nd> block_param opt_block_param block_param_def f_opt … … 1132 1416 %type <nd> heredoc words symbols 1133 1417 %type <num> call_op call_op2 /* 0:'&.', 1:'.', 2:'::' */ 1418 1419 %type <nd> args_tail opt_args_tail f_kwarg f_kw f_kwrest 1420 %type <nd> f_block_kwarg f_block_kw block_args_tail opt_block_args_tail 1421 %type <id> f_label 1134 1422 1135 1423 %token tUPLUS /* unary+ */ … … 1158 1446 %token tLBRACE_ARG /* { */ 1159 1447 %token tSTAR /* * */ 1448 %token tDSTAR /* ** */ 1160 1449 %token tAMPER /* & */ 1161 1450 %token tLAMBDA /* -> */ … … 1179 1468 %right '=' tOP_ASGN 1180 1469 %left modifier_rescue 1181 %right '?' ':' 1470 %right '?' ':' tLABEL_TAG 1182 1471 %nonassoc tDOT2 tDOT3 1183 1472 %left tOROP … … 1237 1526 { 1238 1527 $<nd>$ = local_switch(p); 1528 nvars_block(p); 1239 1529 } 1240 1530 '{' top_compstmt '}' … … 1242 1532 yyerror(p, "BEGIN not supported"); 1243 1533 local_resume(p, $<nd>2); 1534 nvars_unnest(p); 1244 1535 $$ = 0; 1245 1536 } … … 1359 1650 $$ = new_op_asgn(p, $1, $2, $3); 1360 1651 } 1361 | primary_value '[' opt_call_args rbrackettOP_ASGN command_rhs1362 { 1363 $$ = new_op_asgn(p, new_call(p, $1, intern ("[]",2), $3, '.'), $5, $6);1652 | primary_value '[' opt_call_args ']' tOP_ASGN command_rhs 1653 { 1654 $$ = new_op_asgn(p, new_call(p, $1, intern_lit("[]"), $3, '.'), $5, $6); 1364 1655 } 1365 1656 | primary_value call_op tIDENTIFIER tOP_ASGN command_rhs … … 1385 1676 $$ = new_begin(p, 0); 1386 1677 } 1387 1678 ; 1388 1679 1389 1680 command_rhs : command_call %prec tOP_ASGN … … 1439 1730 { 1440 1731 local_nest(p); 1732 nvars_nest(p); 1441 1733 } 1442 1734 opt_block_param … … 1446 1738 $$ = new_block(p, $3, $4); 1447 1739 local_unnest(p); 1740 nvars_unnest(p); 1448 1741 } 1449 1742 ; … … 1588 1881 assignable(p, $1); 1589 1882 } 1590 | primary_value '[' opt_call_args rbracket1591 { 1592 $$ = new_call(p, $1, intern ("[]",2), $3, '.');1883 | primary_value '[' opt_call_args ']' 1884 { 1885 $$ = new_call(p, $1, intern_lit("[]"), $3, '.'); 1593 1886 } 1594 1887 | primary_value call_op tIDENTIFIER … … 1627 1920 assignable(p, $1); 1628 1921 } 1629 | primary_value '[' opt_call_args rbracket1630 { 1631 $$ = new_call(p, $1, intern ("[]",2), $3, '.');1922 | primary_value '[' opt_call_args ']' 1923 { 1924 $$ = new_call(p, $1, intern_lit("[]"), $3, '.'); 1632 1925 } 1633 1926 | primary_value call_op tIDENTIFIER … … 1659 1952 backref_error(p, $1); 1660 1953 $$ = 0; 1954 } 1955 | tNUMPARAM 1956 { 1957 yyerror(p, "can't assign to numbered parameter"); 1661 1958 } 1662 1959 ; … … 1713 2010 ; 1714 2011 1715 op : '|' { $$ = intern_c('|'); } 1716 | '^' { $$ = intern_c('^'); } 1717 | '&' { $$ = intern_c('&'); } 1718 | tCMP { $$ = intern("<=>",3); } 1719 | tEQ { $$ = intern("==",2); } 1720 | tEQQ { $$ = intern("===",3); } 1721 | tMATCH { $$ = intern("=~",2); } 1722 | tNMATCH { $$ = intern("!~",2); } 1723 | '>' { $$ = intern_c('>'); } 1724 | tGEQ { $$ = intern(">=",2); } 1725 | '<' { $$ = intern_c('<'); } 1726 | tLEQ { $$ = intern("<=",2); } 1727 | tNEQ { $$ = intern("!=",2); } 1728 | tLSHFT { $$ = intern("<<",2); } 1729 | tRSHFT { $$ = intern(">>",2); } 1730 | '+' { $$ = intern_c('+'); } 1731 | '-' { $$ = intern_c('-'); } 1732 | '*' { $$ = intern_c('*'); } 1733 | tSTAR { $$ = intern_c('*'); } 1734 | '/' { $$ = intern_c('/'); } 1735 | '%' { $$ = intern_c('%'); } 1736 | tPOW { $$ = intern("**",2); } 1737 | '!' { $$ = intern_c('!'); } 1738 | '~' { $$ = intern_c('~'); } 1739 | tUPLUS { $$ = intern("+@",2); } 1740 | tUMINUS { $$ = intern("-@",2); } 1741 | tAREF { $$ = intern("[]",2); } 1742 | tASET { $$ = intern("[]=",3); } 1743 | '`' { $$ = intern_c('`'); } 2012 op : '|' { $$ = intern_lit("|"); } 2013 | '^' { $$ = intern_lit("^"); } 2014 | '&' { $$ = intern_lit("&"); } 2015 | tCMP { $$ = intern_lit("<=>"); } 2016 | tEQ { $$ = intern_lit("=="); } 2017 | tEQQ { $$ = intern_lit("==="); } 2018 | tMATCH { $$ = intern_lit("=~"); } 2019 | tNMATCH { $$ = intern_lit("!~"); } 2020 | '>' { $$ = intern_lit(">"); } 2021 | tGEQ { $$ = intern_lit(">="); } 2022 | '<' { $$ = intern_lit("<"); } 2023 | tLEQ { $$ = intern_lit("<="); } 2024 | tNEQ { $$ = intern_lit("!="); } 2025 | tLSHFT { $$ = intern_lit("<<"); } 2026 | tRSHFT { $$ = intern_lit(">>"); } 2027 | '+' { $$ = intern_lit("+"); } 2028 | '-' { $$ = intern_lit("-"); } 2029 | '*' { $$ = intern_lit("*"); } 2030 | tSTAR { $$ = intern_lit("*"); } 2031 | '/' { $$ = intern_lit("/"); } 2032 | '%' { $$ = intern_lit("%"); } 2033 | tPOW { $$ = intern_lit("**"); } 2034 | tDSTAR { $$ = intern_lit("**"); } 2035 | '!' { $$ = intern_lit("!"); } 2036 | '~' { $$ = intern_lit("~"); } 2037 | tUPLUS { $$ = intern_lit("+@"); } 2038 | tUMINUS { $$ = intern_lit("-@"); } 2039 | tAREF { $$ = intern_lit("[]"); } 2040 | tASET { $$ = intern_lit("[]="); } 2041 | '`' { $$ = intern_lit("`"); } 1744 2042 ; 1745 2043 … … 1766 2064 $$ = new_op_asgn(p, $1, $2, $3); 1767 2065 } 1768 | primary_value '[' opt_call_args rbrackettOP_ASGN arg_rhs1769 { 1770 $$ = new_op_asgn(p, new_call(p, $1, intern ("[]",2), $3, '.'), $5, $6);2066 | primary_value '[' opt_call_args ']' tOP_ASGN arg_rhs 2067 { 2068 $$ = new_op_asgn(p, new_call(p, $1, intern_lit("[]"), $3, '.'), $5, $6); 1771 2069 } 1772 2070 | primary_value call_op tIDENTIFIER tOP_ASGN arg_rhs … … 1925 2223 $$ = new_if(p, cond($1), $3, $6); 1926 2224 } 2225 | arg '?' arg opt_nl tLABEL_TAG arg 2226 { 2227 $$ = new_if(p, cond($1), $3, $6); 2228 } 1927 2229 | primary 1928 2230 { … … 1939 2241 | args comma assocs trailer 1940 2242 { 1941 $$ = push($1, new_ hash(p, $3));2243 $$ = push($1, new_kw_hash(p, $3)); 1942 2244 } 1943 2245 | assocs trailer 1944 2246 { 1945 $$ = cons(new_ hash(p, $1), 0);2247 $$ = cons(new_kw_hash(p, $1), 0); 1946 2248 NODE_LINENO($$, $1); 1947 2249 } … … 1960 2262 ; 1961 2263 1962 paren_args : '(' opt_call_args rparen2264 paren_args : '(' opt_call_args ')' 1963 2265 { 1964 2266 $$ = $2; … … 1971 2273 1972 2274 opt_call_args : none 1973 | call_args 1974 | args ','2275 | call_args opt_terms 2276 | args comma 1975 2277 { 1976 2278 $$ = cons($1,0); 1977 2279 NODE_LINENO($$, $1); 1978 2280 } 1979 | args comma assocs ','1980 { 1981 $$ = cons(push($1, new_ hash(p, $3)), 0);2281 | args comma assocs comma 2282 { 2283 $$ = cons(push($1, new_kw_hash(p, $3)), 0); 1982 2284 NODE_LINENO($$, $1); 1983 2285 } 1984 | assocs ','1985 { 1986 $$ = cons(list1(new_ hash(p, $1)), 0);2286 | assocs comma 2287 { 2288 $$ = cons(list1(new_kw_hash(p, $1)), 0); 1987 2289 NODE_LINENO($$, $1); 1988 2290 } … … 2002 2304 | assocs opt_block_arg 2003 2305 { 2004 $$ = cons(list1(new_ hash(p, $1)), $2);2306 $$ = cons(list1(new_kw_hash(p, $1)), $2); 2005 2307 NODE_LINENO($$, $1); 2006 2308 } 2007 2309 | args comma assocs opt_block_arg 2008 2310 { 2009 $$ = cons(push($1, new_ hash(p, $3)), $4);2311 $$ = cons(push($1, new_kw_hash(p, $3)), $4); 2010 2312 NODE_LINENO($$, $1); 2011 2313 } … … 2045 2347 2046 2348 comma : ',' 2047 | ',' heredoc_bodies2349 | ',' opt_nl heredoc_bodies 2048 2350 ; 2049 2351 … … 2096 2398 | var_ref 2097 2399 | backref 2400 | tNUMPARAM 2401 { 2402 $$ = new_nvar(p, $1); 2403 } 2098 2404 | tFID 2099 2405 { … … 2248 2554 yyerror(p, "class definition in method body"); 2249 2555 $<nd>$ = local_switch(p); 2556 nvars_block(p); 2250 2557 } 2251 2558 bodystmt … … 2255 2562 SET_LINENO($$, $1); 2256 2563 local_resume(p, $<nd>4); 2564 nvars_unnest(p); 2257 2565 } 2258 2566 | keyword_class … … 2265 2573 { 2266 2574 $<nd>$ = cons(local_switch(p), nint(p->in_single)); 2575 nvars_block(p); 2267 2576 p->in_single = 0; 2268 2577 } … … 2273 2582 SET_LINENO($$, $1); 2274 2583 local_resume(p, $<nd>6->car); 2584 nvars_unnest(p); 2275 2585 p->in_def = $<num>4; 2276 2586 p->in_single = intn($<nd>6->cdr); … … 2282 2592 yyerror(p, "module definition in method body"); 2283 2593 $<nd>$ = local_switch(p); 2594 nvars_block(p); 2284 2595 } 2285 2596 bodystmt … … 2289 2600 SET_LINENO($$, $1); 2290 2601 local_resume(p, $<nd>3); 2602 nvars_unnest(p); 2291 2603 } 2292 2604 | keyword_def fname … … 2298 2610 p->in_def++; 2299 2611 $<nd>$ = local_switch(p); 2612 nvars_block(p); 2300 2613 } 2301 2614 f_arglist … … 2306 2619 SET_LINENO($$, $1); 2307 2620 local_resume(p, $<nd>4); 2621 nvars_unnest(p); 2308 2622 p->in_def--; 2309 2623 p->cmdarg_stack = $<stack>3; … … 2320 2634 p->lstate = EXPR_ENDFN; /* force for args */ 2321 2635 $<nd>$ = local_switch(p); 2636 nvars_block(p); 2322 2637 } 2323 2638 f_arglist … … 2328 2643 SET_LINENO($$, $1); 2329 2644 local_resume(p, $<nd>6); 2645 nvars_unnest(p); 2330 2646 p->in_single--; 2331 2647 p->cmdarg_stack = $<stack>4; … … 2388 2704 ; 2389 2705 2390 f_marg : f_norm_arg 2391 { 2392 $$ = new_arg(p, $1); 2393 } 2394 | tLPAREN f_margs rparen 2395 { 2396 $$ = new_masgn(p, $2, 0); 2397 } 2398 ; 2399 2400 f_marg_list : f_marg 2401 { 2402 $$ = list1($1); 2403 } 2404 | f_marg_list ',' f_marg 2405 { 2406 $$ = push($1, $3); 2407 } 2408 ; 2409 2410 f_margs : f_marg_list 2706 f_margs : f_arg 2411 2707 { 2412 2708 $$ = list3($1,0,0); 2413 2709 } 2414 | f_ marg_list',' tSTAR f_norm_arg2710 | f_arg ',' tSTAR f_norm_arg 2415 2711 { 2416 2712 $$ = list3($1, new_arg(p, $4), 0); 2417 2713 } 2418 | f_ marg_list ',' tSTAR f_norm_arg ',' f_marg_list2714 | f_arg ',' tSTAR f_norm_arg ',' f_arg 2419 2715 { 2420 2716 $$ = list3($1, new_arg(p, $4), $6); 2421 2717 } 2422 | f_marg_list ',' tSTAR 2423 { 2718 | f_arg ',' tSTAR 2719 { 2720 local_add_f(p, 0); 2424 2721 $$ = list3($1, (node*)-1, 0); 2425 2722 } 2426 | f_ marg_list ',' tSTAR ',' f_marg_list2723 | f_arg ',' tSTAR ',' f_arg 2427 2724 { 2428 2725 $$ = list3($1, (node*)-1, $5); … … 2432 2729 $$ = list3(0, new_arg(p, $2), 0); 2433 2730 } 2434 | tSTAR f_norm_arg ',' f_ marg_list2731 | tSTAR f_norm_arg ',' f_arg 2435 2732 { 2436 2733 $$ = list3(0, new_arg(p, $2), $4); … … 2438 2735 | tSTAR 2439 2736 { 2737 local_add_f(p, 0); 2440 2738 $$ = list3(0, (node*)-1, 0); 2441 2739 } 2442 | tSTAR ',' f_marg_list 2443 { 2444 $$ = list3(0, (node*)-1, $3); 2445 } 2446 ; 2447 2448 block_param : f_arg ',' f_block_optarg ',' f_rest_arg opt_f_block_arg 2740 | tSTAR ',' 2741 { 2742 local_add_f(p, 0); 2743 } 2744 f_arg 2745 { 2746 $$ = list3(0, (node*)-1, $4); 2747 } 2748 ; 2749 2750 block_args_tail : f_block_kwarg ',' f_kwrest opt_f_block_arg 2751 { 2752 $$ = new_args_tail(p, $1, $3, $4); 2753 } 2754 | f_block_kwarg opt_f_block_arg 2755 { 2756 $$ = new_args_tail(p, $1, 0, $2); 2757 } 2758 | f_kwrest opt_f_block_arg 2759 { 2760 $$ = new_args_tail(p, 0, $1, $2); 2761 } 2762 | f_block_arg 2763 { 2764 $$ = new_args_tail(p, 0, 0, $1); 2765 } 2766 ; 2767 2768 opt_block_args_tail : ',' block_args_tail 2769 { 2770 $$ = $2; 2771 } 2772 | /* none */ 2773 { 2774 $$ = new_args_tail(p, 0, 0, 0); 2775 } 2776 ; 2777 2778 block_param : f_arg ',' f_block_optarg ',' f_rest_arg opt_block_args_tail 2449 2779 { 2450 2780 $$ = new_args(p, $1, $3, $5, 0, $6); 2451 2781 } 2452 | f_arg ',' f_block_optarg ',' f_rest_arg ',' f_arg opt_ f_block_arg2782 | f_arg ',' f_block_optarg ',' f_rest_arg ',' f_arg opt_block_args_tail 2453 2783 { 2454 2784 $$ = new_args(p, $1, $3, $5, $7, $8); 2455 2785 } 2456 | f_arg ',' f_block_optarg opt_ f_block_arg2786 | f_arg ',' f_block_optarg opt_block_args_tail 2457 2787 { 2458 2788 $$ = new_args(p, $1, $3, 0, 0, $4); 2459 2789 } 2460 | f_arg ',' f_block_optarg ',' f_arg opt_ f_block_arg2790 | f_arg ',' f_block_optarg ',' f_arg opt_block_args_tail 2461 2791 { 2462 2792 $$ = new_args(p, $1, $3, 0, $5, $6); 2463 2793 } 2464 | f_arg ',' f_rest_arg opt_ f_block_arg2794 | f_arg ',' f_rest_arg opt_block_args_tail 2465 2795 { 2466 2796 $$ = new_args(p, $1, 0, $3, 0, $4); 2467 2797 } 2468 | f_arg ',' 2469 { 2470 $$ = new_args(p, $1, 0, 0, 0, 0);2471 } 2472 | f_arg ',' f_rest_arg ',' f_arg opt_ f_block_arg2798 | f_arg ',' opt_block_args_tail 2799 { 2800 $$ = new_args(p, $1, 0, 0, 0, $3); 2801 } 2802 | f_arg ',' f_rest_arg ',' f_arg opt_block_args_tail 2473 2803 { 2474 2804 $$ = new_args(p, $1, 0, $3, $5, $6); 2475 2805 } 2476 | f_arg opt_ f_block_arg2806 | f_arg opt_block_args_tail 2477 2807 { 2478 2808 $$ = new_args(p, $1, 0, 0, 0, $2); 2479 2809 } 2480 | f_block_optarg ',' f_rest_arg opt_ f_block_arg2810 | f_block_optarg ',' f_rest_arg opt_block_args_tail 2481 2811 { 2482 2812 $$ = new_args(p, 0, $1, $3, 0, $4); 2483 2813 } 2484 | f_block_optarg ',' f_rest_arg ',' f_arg opt_ f_block_arg2814 | f_block_optarg ',' f_rest_arg ',' f_arg opt_block_args_tail 2485 2815 { 2486 2816 $$ = new_args(p, 0, $1, $3, $5, $6); 2487 2817 } 2488 | f_block_optarg opt_ f_block_arg2818 | f_block_optarg opt_block_args_tail 2489 2819 { 2490 2820 $$ = new_args(p, 0, $1, 0, 0, $2); 2491 2821 } 2492 | f_block_optarg ',' f_arg opt_ f_block_arg2822 | f_block_optarg ',' f_arg opt_block_args_tail 2493 2823 { 2494 2824 $$ = new_args(p, 0, $1, 0, $3, $4); 2495 2825 } 2496 | f_rest_arg opt_ f_block_arg2826 | f_rest_arg opt_block_args_tail 2497 2827 { 2498 2828 $$ = new_args(p, 0, 0, $1, 0, $2); 2499 2829 } 2500 | f_rest_arg ',' f_arg opt_ f_block_arg2830 | f_rest_arg ',' f_arg opt_block_args_tail 2501 2831 { 2502 2832 $$ = new_args(p, 0, 0, $1, $3, $4); 2503 2833 } 2504 | f_block_arg2834 | block_args_tail 2505 2835 { 2506 2836 $$ = new_args(p, 0, 0, 0, 0, $1); … … 2509 2839 2510 2840 opt_block_param : none 2841 { 2842 local_add_blk(p, 0); 2843 $$ = 0; 2844 } 2511 2845 | block_param_def 2512 2846 { 2513 2847 p->cmd_start = TRUE; 2514 2848 $$ = $1; … … 2516 2850 ; 2517 2851 2518 block_param_def : '|' opt_bv_decl '|'2852 block_param_def : '|' {local_add_blk(p, 0);} opt_bv_decl '|' 2519 2853 { 2520 2854 $$ = 0; … … 2522 2856 | tOROP 2523 2857 { 2858 local_add_blk(p, 0); 2524 2859 $$ = 0; 2525 2860 } … … 2567 2902 $$ = $2; 2568 2903 } 2569 | keyword_do_LAMBDA compstmt keyword_end2904 | keyword_do_LAMBDA bodystmt keyword_end 2570 2905 { 2571 2906 $$ = $2; … … 2576 2911 { 2577 2912 local_nest(p); 2913 nvars_nest(p); 2578 2914 } 2579 2915 opt_block_param 2580 compstmt2916 bodystmt 2581 2917 keyword_end 2582 2918 { 2583 2919 $$ = new_block(p,$3,$4); 2584 2920 local_unnest(p); 2921 nvars_unnest(p); 2585 2922 } 2586 2923 ; … … 2630 2967 | primary_value call_op paren_args 2631 2968 { 2632 $$ = new_call(p, $1, intern ("call",4), $3, $2);2969 $$ = new_call(p, $1, intern_lit("call"), $3, $2); 2633 2970 } 2634 2971 | primary_value tCOLON2 paren_args 2635 2972 { 2636 $$ = new_call(p, $1, intern ("call",4), $3, tCOLON2);2973 $$ = new_call(p, $1, intern_lit("call"), $3, tCOLON2); 2637 2974 } 2638 2975 | keyword_super paren_args … … 2644 2981 $$ = new_zsuper(p); 2645 2982 } 2646 | primary_value '[' opt_call_args rbracket2647 { 2648 $$ = new_call(p, $1, intern ("[]",2), $3, '.');2983 | primary_value '[' opt_call_args ']' 2984 { 2985 $$ = new_call(p, $1, intern_lit("[]"), $3, '.'); 2649 2986 } 2650 2987 ; … … 2653 2990 { 2654 2991 local_nest(p); 2992 nvars_nest(p); 2655 2993 $<num>$ = p->lineno; 2656 2994 } … … 2661 2999 SET_LINENO($$, $<num>2); 2662 3000 local_unnest(p); 3001 nvars_unnest(p); 2663 3002 } 2664 3003 | keyword_do 2665 3004 { 2666 3005 local_nest(p); 3006 nvars_nest(p); 2667 3007 $<num>$ = p->lineno; 2668 3008 } 2669 3009 opt_block_param 2670 compstmt keyword_end3010 bodystmt keyword_end 2671 3011 { 2672 3012 $$ = new_block(p,$3,$4); 2673 3013 SET_LINENO($$, $<num>2); 2674 3014 local_unnest(p); 3015 nvars_unnest(p); 2675 3016 } 2676 3017 ; … … 2734 3075 ; 2735 3076 2736 string : tCHAR 3077 string : string_fragment 3078 | string string_fragment 3079 { 3080 $$ = concat_string(p, $1, $2); 3081 } 3082 ; 3083 3084 string_fragment : tCHAR 2737 3085 | tSTRING 2738 3086 | tSTRING_BEG tSTRING … … 2854 3202 symbol : basic_symbol 2855 3203 { 3204 p->lstate = EXPR_ENDARG; 2856 3205 $$ = new_sym(p, $1); 2857 3206 } 2858 3207 | tSYMBEG tSTRING_BEG string_rep tSTRING 2859 3208 { 2860 p->lstate = EXPR_END ;2861 $$ = new_dsym(p, push($3, $4));3209 p->lstate = EXPR_ENDARG; 3210 $$ = new_dsym(p, new_dstr(p, push($3, $4))); 2862 3211 } 2863 3212 ; … … 2865 3214 basic_symbol : tSYMBEG sym 2866 3215 { 2867 p->lstate = EXPR_END;2868 3216 $$ = $2; 2869 3217 } … … 2932 3280 assignable(p, $1); 2933 3281 } 3282 | tNUMPARAM 3283 { 3284 yyerror(p, "can't assign to numbered parameter"); 3285 } 2934 3286 ; 2935 3287 … … 2956 3308 | keyword__FILE__ 2957 3309 { 2958 const char *fn = p->filename;3310 const char *fn = mrb_sym_name_len(p->mrb, p->filename_sym, NULL); 2959 3311 if (!fn) { 2960 3312 fn = "(null)"; … … 2966 3318 char buf[16]; 2967 3319 2968 snprintf(buf, sizeof(buf), "%d", p->lineno); 2969 $$ = new_int(p, buf, 10); 3320 dump_int(p->lineno, buf); 3321 $$ = new_int(p, buf, 10, 0); 3322 } 3323 | keyword__ENCODING__ 3324 { 3325 #ifdef MRB_UTF8_STRING 3326 const char *enc = "UTF-8"; 3327 #else 3328 const char *enc = "ASCII-8BIT"; 3329 #endif 3330 $$ = new_str(p, enc, strlen(enc)); 2970 3331 } 2971 3332 ; … … 3007 3368 ; 3008 3369 3009 f_args : f_arg ',' f_optarg ',' f_rest_arg opt_f_block_arg 3370 f_label : tIDENTIFIER tLABEL_TAG 3371 { 3372 local_nest(p); 3373 } 3374 ; 3375 3376 f_kw : f_label arg 3377 { 3378 void_expr_error(p, $2); 3379 $$ = new_kw_arg(p, $1, cons($2, locals_node(p))); 3380 local_unnest(p); 3381 } 3382 | f_label 3383 { 3384 $$ = new_kw_arg(p, $1, 0); 3385 local_unnest(p); 3386 } 3387 ; 3388 3389 f_block_kw : f_label primary_value 3390 { 3391 $$ = new_kw_arg(p, $1, cons($2, locals_node(p))); 3392 local_unnest(p); 3393 } 3394 | f_label 3395 { 3396 $$ = new_kw_arg(p, $1, 0); 3397 local_unnest(p); 3398 } 3399 ; 3400 3401 f_block_kwarg : f_block_kw 3402 { 3403 $$ = list1($1); 3404 } 3405 | f_block_kwarg ',' f_block_kw 3406 { 3407 $$ = push($1, $3); 3408 } 3409 ; 3410 3411 f_kwarg : f_kw 3412 { 3413 $$ = list1($1); 3414 } 3415 | f_kwarg ',' f_kw 3416 { 3417 $$ = push($1, $3); 3418 } 3419 ; 3420 3421 kwrest_mark : tPOW 3422 | tDSTAR 3423 ; 3424 3425 f_kwrest : kwrest_mark tIDENTIFIER 3426 { 3427 $$ = cons((node*)NODE_KW_REST_ARGS, nsym($2)); 3428 } 3429 | kwrest_mark 3430 { 3431 $$ = cons((node*)NODE_KW_REST_ARGS, 0); 3432 } 3433 ; 3434 3435 args_tail : f_kwarg ',' f_kwrest opt_f_block_arg 3436 { 3437 $$ = new_args_tail(p, $1, $3, $4); 3438 } 3439 | f_kwarg opt_f_block_arg 3440 { 3441 $$ = new_args_tail(p, $1, 0, $2); 3442 } 3443 | f_kwrest opt_f_block_arg 3444 { 3445 $$ = new_args_tail(p, 0, $1, $2); 3446 } 3447 | f_block_arg 3448 { 3449 $$ = new_args_tail(p, 0, 0, $1); 3450 } 3451 ; 3452 3453 opt_args_tail : ',' args_tail 3454 { 3455 $$ = $2; 3456 } 3457 | /* none */ 3458 { 3459 $$ = new_args_tail(p, 0, 0, 0); 3460 } 3461 ; 3462 3463 f_args : f_arg ',' f_optarg ',' f_rest_arg opt_args_tail 3010 3464 { 3011 3465 $$ = new_args(p, $1, $3, $5, 0, $6); 3012 3466 } 3013 | f_arg ',' f_optarg ',' f_rest_arg ',' f_arg opt_ f_block_arg3467 | f_arg ',' f_optarg ',' f_rest_arg ',' f_arg opt_args_tail 3014 3468 { 3015 3469 $$ = new_args(p, $1, $3, $5, $7, $8); 3016 3470 } 3017 | f_arg ',' f_optarg opt_ f_block_arg3471 | f_arg ',' f_optarg opt_args_tail 3018 3472 { 3019 3473 $$ = new_args(p, $1, $3, 0, 0, $4); 3020 3474 } 3021 | f_arg ',' f_optarg ',' f_arg opt_ f_block_arg3475 | f_arg ',' f_optarg ',' f_arg opt_args_tail 3022 3476 { 3023 3477 $$ = new_args(p, $1, $3, 0, $5, $6); 3024 3478 } 3025 | f_arg ',' f_rest_arg opt_ f_block_arg3479 | f_arg ',' f_rest_arg opt_args_tail 3026 3480 { 3027 3481 $$ = new_args(p, $1, 0, $3, 0, $4); 3028 3482 } 3029 | f_arg ',' f_rest_arg ',' f_arg opt_ f_block_arg3483 | f_arg ',' f_rest_arg ',' f_arg opt_args_tail 3030 3484 { 3031 3485 $$ = new_args(p, $1, 0, $3, $5, $6); 3032 3486 } 3033 | f_arg opt_ f_block_arg3487 | f_arg opt_args_tail 3034 3488 { 3035 3489 $$ = new_args(p, $1, 0, 0, 0, $2); 3036 3490 } 3037 | f_optarg ',' f_rest_arg opt_ f_block_arg3491 | f_optarg ',' f_rest_arg opt_args_tail 3038 3492 { 3039 3493 $$ = new_args(p, 0, $1, $3, 0, $4); 3040 3494 } 3041 | f_optarg ',' f_rest_arg ',' f_arg opt_ f_block_arg3495 | f_optarg ',' f_rest_arg ',' f_arg opt_args_tail 3042 3496 { 3043 3497 $$ = new_args(p, 0, $1, $3, $5, $6); 3044 3498 } 3045 | f_optarg opt_ f_block_arg3499 | f_optarg opt_args_tail 3046 3500 { 3047 3501 $$ = new_args(p, 0, $1, 0, 0, $2); 3048 3502 } 3049 | f_optarg ',' f_arg opt_ f_block_arg3503 | f_optarg ',' f_arg opt_args_tail 3050 3504 { 3051 3505 $$ = new_args(p, 0, $1, 0, $3, $4); 3052 3506 } 3053 | f_rest_arg opt_ f_block_arg3507 | f_rest_arg opt_args_tail 3054 3508 { 3055 3509 $$ = new_args(p, 0, 0, $1, 0, $2); 3056 3510 } 3057 | f_rest_arg ',' f_arg opt_ f_block_arg3511 | f_rest_arg ',' f_arg opt_args_tail 3058 3512 { 3059 3513 $$ = new_args(p, 0, 0, $1, $3, $4); 3060 3514 } 3061 | f_block_arg3515 | args_tail 3062 3516 { 3063 3517 $$ = new_args(p, 0, 0, 0, 0, $1); … … 3065 3519 | /* none */ 3066 3520 { 3067 local_add_f(p, 0);3521 local_add_f(p, mrb_intern_lit(p->mrb, "&")); 3068 3522 $$ = new_args(p, 0, 0, 0, 0, 0); 3069 3523 } … … 3090 3544 $$ = 0; 3091 3545 } 3546 | tNUMPARAM 3547 { 3548 yyerror(p, "formal argument cannot be a numbered parameter"); 3549 $$ = 0; 3550 } 3092 3551 ; 3093 3552 … … 3107 3566 $$ = new_arg(p, $1); 3108 3567 } 3109 | tLPAREN f_margs rparen 3110 { 3111 $$ = new_masgn(p, $2, 0); 3568 | tLPAREN 3569 { 3570 $<nd>$ = local_switch(p); 3571 } 3572 f_margs rparen 3573 { 3574 $$ = new_masgn_param(p, $3, p->locals->car); 3575 local_resume(p, $<nd>2); 3576 local_add_f(p, 0); 3112 3577 } 3113 3578 ; … … 3126 3591 { 3127 3592 local_add_f(p, $1); 3593 local_nest(p); 3128 3594 $$ = $1; 3129 3595 } … … 3133 3599 { 3134 3600 void_expr_error(p, $2); 3135 $$ = cons(nsym($1), $2); 3601 $$ = cons(nsym($1), cons($2, locals_node(p))); 3602 local_unnest(p); 3136 3603 } 3137 3604 ; … … 3140 3607 { 3141 3608 void_expr_error(p, $2); 3142 $$ = cons(nsym($1), $2); 3609 $$ = cons(nsym($1), cons($2, locals_node(p))); 3610 local_unnest(p); 3143 3611 } 3144 3612 ; … … 3175 3643 | restarg_mark 3176 3644 { 3177 local_add_f(p, 0);3645 local_add_f(p, mrb_intern_lit(p->mrb, "*")); 3178 3646 $$ = -1; 3179 3647 } … … 3186 3654 f_block_arg : blkarg_mark tIDENTIFIER 3187 3655 { 3188 local_add_f(p, $2);3189 3656 $$ = $2; 3190 3657 } … … 3197 3664 | none 3198 3665 { 3199 local_add_f(p, 0);3200 3666 $$ = 0; 3201 3667 } … … 3244 3710 NODE_LINENO($$, $1); 3245 3711 } 3246 | assocs ','assoc3712 | assocs comma assoc 3247 3713 { 3248 3714 $$ = push($1, $3); 3249 3715 } 3716 ; 3717 3718 label_tag : tLABEL_TAG 3719 | tLABEL_TAG heredoc_bodies 3250 3720 ; 3251 3721 … … 3256 3726 $$ = cons($1, $3); 3257 3727 } 3258 | tLABEL arg 3728 | tIDENTIFIER label_tag arg 3729 { 3730 void_expr_error(p, $3); 3731 $$ = cons(new_sym(p, $1), $3); 3732 } 3733 | string_fragment label_tag arg 3734 { 3735 void_expr_error(p, $3); 3736 if ($1->car == (node*)NODE_DSTR) { 3737 $$ = cons(new_dsym(p, $1), $3); 3738 } 3739 else { 3740 $$ = cons(new_sym(p, new_strsym(p, $1)), $3); 3741 } 3742 } 3743 | tDSTAR arg 3259 3744 { 3260 3745 void_expr_error(p, $2); 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); 3746 $$ = cons(cons((node*)NODE_KW_REST_ARGS, 0), $2); 3277 3747 } 3278 3748 ; … … 3323 3793 ; 3324 3794 3325 rparen : opt_nl ')' 3326 ; 3327 3328 rbracket : opt_nl ']' 3795 rparen : opt_terms ')' 3329 3796 ; 3330 3797 3331 3798 trailer : /* none */ 3332 | nl3799 | terms 3333 3800 | comma 3334 3801 ; … … 3362 3829 { 3363 3830 char* c; 3364 int n;3831 size_t n; 3365 3832 3366 3833 if (! p->capture_errors) { 3367 3834 #ifndef MRB_DISABLE_STDIO 3368 if (p->filename) { 3369 fprintf(stderr, "%s:%d:%d: %s\n", p->filename, p->lineno, p->column, s); 3835 if (p->filename_sym) { 3836 const char *filename = mrb_sym_name_len(p->mrb, p->filename_sym, NULL); 3837 fprintf(stderr, "%s:%d:%d: %s\n", filename, p->lineno, p->column, s); 3370 3838 } 3371 3839 else { … … 3386 3854 3387 3855 static void 3388 yyerror_ i(parser_state *p, const char *fmt, int i)3856 yyerror_c(parser_state *p, const char *msg, char c) 3389 3857 { 3390 3858 char buf[256]; 3391 3859 3392 snprintf(buf, sizeof(buf), fmt, i); 3860 strncpy(buf, msg, sizeof(buf) - 2); 3861 buf[sizeof(buf) - 2] = '\0'; 3862 strncat(buf, &c, 1); 3393 3863 yyerror(p, buf); 3394 3864 } … … 3398 3868 { 3399 3869 char* c; 3400 int n;3870 size_t n; 3401 3871 3402 3872 if (! p->capture_errors) { 3403 3873 #ifndef MRB_DISABLE_STDIO 3404 if (p->filename) { 3405 fprintf(stderr, "%s:%d:%d: %s\n", p->filename, p->lineno, p->column, s); 3874 if (p->filename_sym) { 3875 const char *filename = mrb_sym_name_len(p->mrb, p->filename_sym, NULL); 3876 fprintf(stderr, "%s:%d:%d: warning: %s\n", filename, p->lineno, p->column, s); 3406 3877 } 3407 3878 else { 3408 fprintf(stderr, "line %d:%d: %s\n", p->lineno, p->column, s);3879 fprintf(stderr, "line %d:%d: warning: %s\n", p->lineno, p->column, s); 3409 3880 } 3410 3881 #endif … … 3428 3899 3429 3900 static void 3430 yywarning_s(parser_state *p, const char * fmt, const char *s)3901 yywarning_s(parser_state *p, const char *msg, const char *s) 3431 3902 { 3432 3903 char buf[256]; 3433 3904 3434 snprintf(buf, sizeof(buf), fmt, s); 3905 strncpy(buf, msg, sizeof(buf) - 1); 3906 buf[sizeof(buf) - 1] = '\0'; 3907 strncat(buf, ": ", sizeof(buf) - strlen(buf) - 1); 3908 strncat(buf, s, sizeof(buf) - strlen(buf) - 1); 3435 3909 yywarning(p, buf); 3436 3910 } … … 3441 3915 int c; 3442 3916 3443 c = (int)(intptr_t)n->car;3917 c = intn(n->car); 3444 3918 3445 3919 if (c == NODE_NTH_REF) { 3446 yyerror_ i(p, "can't set variable $%" MRB_PRId, (mrb_int)(intptr_t)n->cdr);3920 yyerror_c(p, "can't set variable $", (char)intn(n->cdr)+'0'); 3447 3921 } 3448 3922 else if (c == NODE_BACK_REF) { 3449 yyerror_ i(p, "can't set variable $%c", (int)(intptr_t)n->cdr);3923 yyerror_c(p, "can't set variable $", (char)intn(n->cdr)); 3450 3924 } 3451 3925 else { 3452 mrb_bug(p->mrb, "Internal error in backref_error() : n=>car == % S", mrb_fixnum_value(c));3926 mrb_bug(p->mrb, "Internal error in backref_error() : n=>car == %d", c); 3453 3927 } 3454 3928 } … … 3460 3934 3461 3935 if (n == NULL) return; 3462 c = (int)(intptr_t)n->car;3936 c = intn(n->car); 3463 3937 switch (c) { 3464 3938 case NODE_BREAK: … … 3471 3945 case NODE_AND: 3472 3946 case NODE_OR: 3473 void_expr_error(p, n->cdr->car); 3474 void_expr_error(p, n->cdr->cdr); 3947 if (n->cdr) { 3948 void_expr_error(p, n->cdr->car); 3949 void_expr_error(p, n->cdr->cdr); 3950 } 3475 3951 break; 3476 3952 case NODE_BEGIN: … … 3492 3968 3493 3969 static inline int 3970 nextc0(parser_state *p) 3971 { 3972 int c; 3973 #ifndef MRB_DISABLE_STDIO 3974 if (p->f) { 3975 if (feof(p->f)) return -1; 3976 c = fgetc(p->f); 3977 if (c == EOF) return -1; 3978 } 3979 else 3980 #endif 3981 if (!p->s || p->s >= p->send) { 3982 return -1; 3983 } 3984 else { 3985 c = (unsigned char)*p->s++; 3986 } 3987 return c; 3988 } 3989 3990 static inline int 3494 3991 nextc(parser_state *p) 3495 3992 { … … 3499 3996 node *tmp; 3500 3997 3501 c = (int)(intptr_t)p->pb->car;3998 c = intn(p->pb->car); 3502 3999 tmp = p->pb; 3503 4000 p->pb = p->pb->cdr; … … 3505 4002 } 3506 4003 else { 3507 #ifndef MRB_DISABLE_STDIO 3508 if (p->f) { 3509 if (feof(p->f)) goto eof; 3510 c = fgetc(p->f); 3511 if (c == EOF) goto eof; 3512 } 3513 else 3514 #endif 3515 if (!p->s || p->s >= p->send) { 3516 goto eof; 3517 } 3518 else { 3519 c = (unsigned char)*p->s++; 3520 } 4004 c = nextc0(p); 4005 if (c < 0) goto eof; 3521 4006 } 3522 4007 if (c >= 0) { … … 3524 4009 } 3525 4010 if (c == '\r') { 3526 c = nextc(p); 3527 if (c != '\n') { 3528 pushback(p, c); 3529 return '\r'; 3530 } 3531 return c; 4011 const int lf = nextc0(p); 4012 if (lf == '\n') { 4013 return '\n'; 4014 } 4015 if (lf > 0) pushback(p, lf); 3532 4016 } 3533 4017 return c; … … 3548 4032 p->column--; 3549 4033 } 3550 p->pb = cons( (node*)(intptr_t)c, p->pb);4034 p->pb = cons(nint(c), p->pb); 3551 4035 } 3552 4036 … … 3573 4057 if (c0 == -1) return c0; /* do not skip partial EOF */ 3574 4058 if (c0 >= 0) --p->column; 3575 list = push(list, (node*)(intptr_t)c0);4059 list = push(list, nint(c0)); 3576 4060 } while(n--); 3577 4061 if (p->pb) { … … 3594 4078 peeks(parser_state *p, const char *s) 3595 4079 { 3596 int len = strlen(s);4080 size_t len = strlen(s); 3597 4081 3598 4082 #ifndef MRB_DISABLE_STDIO … … 3630 4114 s++; 3631 4115 if (peeks(p, s)) { 3632 int len = strlen(s);4116 size_t len = strlen(s); 3633 4117 3634 4118 while (len--) { … … 3752 4236 #define IS_LABEL_SUFFIX(n) (peek_n(p, ':',(n)) && !peek_n(p, ':', (n)+1)) 3753 4237 3754 static int 4238 static int32_t 3755 4239 scan_oct(const int *start, int len, int *retlen) 3756 4240 { 3757 4241 const int *s = start; 3758 int retval = 0;4242 int32_t retval = 0; 3759 4243 3760 4244 /* mrb_assert(len <= 3) */ … … 3763 4247 retval |= *s++ - '0'; 3764 4248 } 3765 *retlen = s - start;4249 *retlen = (int)(s - start); 3766 4250 3767 4251 return retval; … … 3769 4253 3770 4254 static int32_t 3771 scan_hex( const int *start, int len, int *retlen)4255 scan_hex(parser_state *p, const int *start, int len, int *retlen) 3772 4256 { 3773 4257 static const char hexdigit[] = "0123456789abcdef0123456789ABCDEF"; 3774 4258 const int *s = start; 3775 int32_t retval = 0;4259 uint32_t retval = 0; 3776 4260 char *tmp; 3777 4261 … … 3782 4266 s++; 3783 4267 } 3784 *retlen = s - start;3785 3786 return retval;4268 *retlen = (int)(s - start); 4269 4270 return (int32_t)retval; 3787 4271 } 3788 4272 … … 3790 4274 read_escape_unicode(parser_state *p, int limit) 3791 4275 { 3792 int32_t c;3793 4276 int buf[9]; 3794 4277 int i; 4278 int32_t hex; 3795 4279 3796 4280 /* Look for opening brace */ 3797 4281 i = 0; 3798 4282 buf[0] = nextc(p); 3799 if (buf[0] < 0) goto eof; 4283 if (buf[0] < 0) { 4284 eof: 4285 yyerror(p, "invalid escape character syntax"); 4286 return -1; 4287 } 3800 4288 if (ISXDIGIT(buf[0])) { 3801 4289 /* \uxxxx form */ … … 3812 4300 pushback(p, buf[0]); 3813 4301 } 3814 c = scan_hex(buf, i, &i); 3815 if (i == 0) { 3816 eof: 3817 yyerror(p, "Invalid escape character syntax"); 4302 hex = scan_hex(p, buf, i, &i); 4303 if (i == 0 || hex > 0x10FFFF || (hex & 0xFFFFF800) == 0xD800) { 4304 yyerror(p, "invalid Unicode code point"); 3818 4305 return -1; 3819 4306 } 3820 if (c < 0 || c > 0x10FFFF || (c & 0xFFFFF800) == 0xD800) { 3821 yyerror(p, "Invalid Unicode code point"); 3822 return -1; 3823 } 3824 return c; 4307 return hex; 3825 4308 } 3826 4309 … … 3888 4371 } 3889 4372 } 3890 c = scan_hex(buf, i, &i);3891 4373 if (i == 0) { 3892 yyerror(p, " Invalid escape character syntax");3893 return 0;3894 } 3895 }3896 return c;4374 yyerror(p, "invalid hex escape"); 4375 return -1; 4376 } 4377 return scan_hex(p, buf, i, &i); 4378 } 3897 4379 3898 4380 case 'u': /* Unicode */ … … 3961 4443 int c; 3962 4444 string_type type = (string_type)(intptr_t)p->lex_strterm->car; 3963 int nest_level = (intptr_t)p->lex_strterm->cdr->car;3964 int beg = (intptr_t)p->lex_strterm->cdr->cdr->car;3965 int end = (intptr_t)p->lex_strterm->cdr->cdr->cdr;4445 int nest_level = intn(p->lex_strterm->cdr->car); 4446 int beg = intn(p->lex_strterm->cdr->cdr->car); 4447 int end = intn(p->lex_strterm->cdr->cdr->cdr); 3966 4448 parser_heredoc_info *hinf = (type & STR_FUNC_HEREDOC) ? parsing_heredoc_inf(p) : NULL; 3967 int cmd_state = p->cmd_start;3968 4449 3969 4450 if (beg == 0) beg = -3; /* should never happen */ … … 3990 4471 } 3991 4472 if ((len-1 == hinf->term_len) && (strncmp(s, hinf->term, len-1) == 0)) { 3992 if (c < 0) { 3993 p->parsing_heredoc = NULL; 3994 } 3995 else { 3996 return tHEREDOC_END; 3997 } 4473 return tHEREDOC_END; 3998 4474 } 3999 4475 } 4000 4476 if (c < 0) { 4001 4477 char buf[256]; 4002 snprintf(buf, sizeof(buf), "can't find heredoc delimiter \"%s\" anywhere before EOF", hinf->term); 4003 yyerror(p, buf); 4478 const char s1[] = "can't find heredoc delimiter \""; 4479 const char s2[] = "\" anywhere before EOF"; 4480 4481 if (sizeof(s1)+sizeof(s2)+strlen(hinf->term)+1 >= sizeof(buf)) { 4482 yyerror(p, "can't find heredoc delimiter anywhere before EOF"); 4483 } else { 4484 strcpy(buf, s1); 4485 strcat(buf, hinf->term); 4486 strcat(buf, s2); 4487 yyerror(p, buf); 4488 } 4004 4489 return 0; 4005 4490 } … … 4013 4498 else if (c == beg) { 4014 4499 nest_level++; 4015 p->lex_strterm->cdr->car = (node*)(intptr_t)nest_level;4500 p->lex_strterm->cdr->car = nint(nest_level); 4016 4501 } 4017 4502 else if (c == end) { 4018 4503 nest_level--; 4019 p->lex_strterm->cdr->car = (node*)(intptr_t)nest_level;4504 p->lex_strterm->cdr->car = nint(nest_level); 4020 4505 } 4021 4506 else if (c == '\\') { … … 4119 4604 4120 4605 tokfix(p); 4121 p->lstate = EXPR_END ;4606 p->lstate = EXPR_ENDARG; 4122 4607 end_strterm(p); 4123 4608 … … 4145 4630 case 'u': f |= 16; break; 4146 4631 case 'n': f |= 32; break; 4632 case 'o': break; 4147 4633 default: tokadd(p, re_opt); break; 4148 4634 } … … 4151 4637 if (toklen(p)) { 4152 4638 char msg[128]; 4639 4640 strcpy(msg, "unknown regexp option"); 4153 4641 tokfix(p); 4154 snprintf(msg, sizeof(msg), "unknown regexp option%s - %s", 4155 toklen(p) > 1 ? "s" : "", tok(p)); 4642 if (toklen(p) > 1) { 4643 strcat(msg, "s"); 4644 } 4645 strcat(msg, " - "); 4646 strncat(msg, tok(p), sizeof(msg) - strlen(msg) - 1); 4156 4647 yyerror(p, msg); 4157 4648 } … … 4180 4671 } 4181 4672 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 4673 4190 4674 return tSTRING; 4191 4675 } 4192 4676 4677 static int 4678 number_literal_suffix(parser_state *p) 4679 { 4680 int c, result = 0; 4681 node *list = 0; 4682 int column = p->column; 4683 int mask = NUM_SUFFIX_R|NUM_SUFFIX_I; 4684 4685 while ((c = nextc(p)) != -1) { 4686 list = push(list, (node*)(intptr_t)c); 4687 4688 if ((mask & NUM_SUFFIX_I) && c == 'i') { 4689 result |= (mask & NUM_SUFFIX_I); 4690 mask &= ~NUM_SUFFIX_I; 4691 /* r after i, rational of complex is disallowed */ 4692 mask &= ~NUM_SUFFIX_R; 4693 continue; 4694 } 4695 if ((mask & NUM_SUFFIX_R) && c == 'r') { 4696 result |= (mask & NUM_SUFFIX_R); 4697 mask &= ~NUM_SUFFIX_R; 4698 continue; 4699 } 4700 if (!ISASCII(c) || ISALPHA(c) || c == '_') { 4701 p->column = column; 4702 if (p->pb) { 4703 p->pb = append((node*)list, p->pb); 4704 } 4705 else { 4706 p->pb = list; 4707 } 4708 return 0; 4709 } 4710 pushback(p, c); 4711 break; 4712 } 4713 return result; 4714 } 4193 4715 4194 4716 static int … … 4311 4833 case -2: /* end of a file */ 4312 4834 case '\n': 4313 4835 maybe_heredoc: 4314 4836 heredoc_treat_nextline(p); 4315 switch (p->lstate) {4316 case EXPR_BEG:4317 case EXPR_FNAME:4318 case EXPR_DOT:4319 case EXPR_CLASS:4320 case EXPR_VALUE:4321 p->lineno++;4322 4837 p->column = 0; 4838 switch (p->lstate) { 4839 case EXPR_BEG: 4840 case EXPR_FNAME: 4841 case EXPR_DOT: 4842 case EXPR_CLASS: 4843 case EXPR_VALUE: 4844 p->lineno++; 4845 if (p->parsing_heredoc != NULL) { 4846 if (p->lex_strterm) { 4847 return parse_string(p); 4848 } 4849 } 4850 goto retry; 4851 default: 4852 break; 4853 } 4323 4854 if (p->parsing_heredoc != NULL) { 4324 if (p->lex_strterm) { 4325 return parse_string(p); 4326 } 4327 } 4328 goto retry; 4329 default: 4330 break; 4331 } 4332 if (p->parsing_heredoc != NULL) { 4855 return '\n'; 4856 } 4857 while ((c = nextc(p))) { 4858 switch (c) { 4859 case ' ': case '\t': case '\f': case '\r': 4860 case '\13': /* '\v' */ 4861 space_seen = 1; 4862 break; 4863 case '#': /* comment as a whitespace */ 4864 pushback(p, '#'); 4865 p->lineno++; 4866 goto retry; 4867 case '.': 4868 if (!peek(p, '.')) { 4869 pushback(p, '.'); 4870 p->lineno++; 4871 goto retry; 4872 } 4873 pushback(p, c); 4874 goto normal_newline; 4875 case '&': 4876 if (peek(p, '.')) { 4877 pushback(p, '&'); 4878 p->lineno++; 4879 goto retry; 4880 } 4881 pushback(p, c); 4882 goto normal_newline; 4883 case -1: /* EOF */ 4884 case -2: /* end of a file */ 4885 goto normal_newline; 4886 default: 4887 pushback(p, c); 4888 goto normal_newline; 4889 } 4890 } 4891 normal_newline: 4892 p->cmd_start = TRUE; 4893 p->lstate = EXPR_BEG; 4333 4894 return '\n'; 4334 }4335 while ((c = nextc(p))) {4336 switch (c) {4337 case ' ': case '\t': case '\f': case '\r':4338 case '\13': /* '\v' */4339 space_seen = 1;4340 break;4341 case '.':4342 if ((c = nextc(p)) != '.') {4343 pushback(p, c);4344 pushback(p, '.');4345 goto retry;4346 }4347 case -1: /* EOF */4348 case -2: /* end of a file */4349 goto normal_newline;4350 default:4351 pushback(p, c);4352 goto normal_newline;4353 }4354 }4355 normal_newline:4356 p->cmd_start = TRUE;4357 p->lstate = EXPR_BEG;4358 return '\n';4359 4895 4360 4896 case '*': 4361 4897 if ((c = nextc(p)) == '*') { 4362 4898 if ((c = nextc(p)) == '=') { 4363 pylval.id = intern ("**",2);4899 pylval.id = intern_lit("**"); 4364 4900 p->lstate = EXPR_BEG; 4365 4901 return tOP_ASGN; 4366 4902 } 4367 4903 pushback(p, c); 4368 c = tPOW; 4904 if (IS_SPCARG(c)) { 4905 yywarning(p, "'**' interpreted as argument prefix"); 4906 c = tDSTAR; 4907 } 4908 else if (IS_BEG()) { 4909 c = tDSTAR; 4910 } 4911 else { 4912 c = tPOW; /* "**", "argument prefix" */ 4913 } 4369 4914 } 4370 4915 else { 4371 4916 if (c == '=') { 4372 pylval.id = intern_ c('*');4917 pylval.id = intern_lit("*"); 4373 4918 p->lstate = EXPR_BEG; 4374 4919 return tOP_ASGN; … … 4486 5031 if (c == '<') { 4487 5032 if ((c = nextc(p)) == '=') { 4488 pylval.id = intern ("<<",2);5033 pylval.id = intern_lit("<<"); 4489 5034 p->lstate = EXPR_BEG; 4490 5035 return tOP_ASGN; … … 4508 5053 if (c == '>') { 4509 5054 if ((c = nextc(p)) == '=') { 4510 pylval.id = intern (">>",2);5055 pylval.id = intern_lit(">>"); 4511 5056 p->lstate = EXPR_BEG; 4512 5057 return tOP_ASGN; … … 4579 5124 if (c2) { 4580 5125 char buf[256]; 4581 snprintf(buf, sizeof(buf), "invalid character syntax; use ?\\%c", c2); 5126 char cc[] = { (char)c2, '\0' }; 5127 5128 strcpy(buf, "invalid character syntax; use ?\\"); 5129 strncat(buf, cc, 2); 4582 5130 yyerror(p, buf); 4583 5131 } … … 4590 5138 newtok(p); 4591 5139 /* need support UTF-8 if configured */ 4592 if (( isalnum(c) || c == '_')) {5140 if ((ISALNUM(c) || c == '_')) { 4593 5141 int c2 = nextc(p); 4594 5142 pushback(p, c2); 4595 if (( isalnum(c2) || c2 == '_')) {5143 if ((ISALNUM(c2) || c2 == '_')) { 4596 5144 goto ternary; 4597 5145 } … … 4606 5154 tokfix(p); 4607 5155 pylval.nd = new_str(p, tok(p), toklen(p)); 4608 p->lstate = EXPR_END ;5156 p->lstate = EXPR_ENDARG; 4609 5157 return tCHAR; 4610 5158 … … 4613 5161 p->lstate = EXPR_BEG; 4614 5162 if ((c = nextc(p)) == '=') { 4615 pylval.id = intern ("&&",2);5163 pylval.id = intern_lit("&&"); 4616 5164 p->lstate = EXPR_BEG; 4617 5165 return tOP_ASGN; … … 4625 5173 } 4626 5174 else if (c == '=') { 4627 pylval.id = intern_ c('&');5175 pylval.id = intern_lit("&"); 4628 5176 p->lstate = EXPR_BEG; 4629 5177 return tOP_ASGN; … … 4652 5200 p->lstate = EXPR_BEG; 4653 5201 if ((c = nextc(p)) == '=') { 4654 pylval.id = intern ("||",2);5202 pylval.id = intern_lit("||"); 4655 5203 p->lstate = EXPR_BEG; 4656 5204 return tOP_ASGN; … … 4660 5208 } 4661 5209 if (c == '=') { 4662 pylval.id = intern_ c('|');5210 pylval.id = intern_lit("|"); 4663 5211 p->lstate = EXPR_BEG; 4664 5212 return tOP_ASGN; … … 4684 5232 } 4685 5233 if (c == '=') { 4686 pylval.id = intern_ c('+');5234 pylval.id = intern_lit("+"); 4687 5235 p->lstate = EXPR_BEG; 4688 5236 return tOP_ASGN; … … 4712 5260 } 4713 5261 if (c == '=') { 4714 pylval.id = intern_ c('-');5262 pylval.id = intern_lit("-"); 4715 5263 p->lstate = EXPR_BEG; 4716 5264 return tOP_ASGN; … … 4753 5301 { 4754 5302 int is_float, seen_point, seen_e, nondigit; 5303 int suffix = 0; 4755 5304 4756 5305 is_float = seen_point = seen_e = nondigit = 0; 4757 p->lstate = EXPR_END ;5306 p->lstate = EXPR_ENDARG; 4758 5307 newtok(p); 4759 5308 if (c == '-' || c == '+') { … … 4786 5335 } 4787 5336 else if (nondigit) goto trailing_uc; 4788 pylval.nd = new_int(p, tok(p), 16); 5337 suffix = number_literal_suffix(p); 5338 pylval.nd = new_int(p, tok(p), 16, suffix); 4789 5339 return tINTEGER; 4790 5340 } … … 4810 5360 } 4811 5361 else if (nondigit) goto trailing_uc; 4812 pylval.nd = new_int(p, tok(p), 2); 5362 suffix = number_literal_suffix(p); 5363 pylval.nd = new_int(p, tok(p), 2, suffix); 4813 5364 return tINTEGER; 4814 5365 } … … 4834 5385 } 4835 5386 else if (nondigit) goto trailing_uc; 4836 pylval.nd = new_int(p, tok(p), 10); 5387 suffix = number_literal_suffix(p); 5388 pylval.nd = new_int(p, tok(p), 10, suffix); 4837 5389 return tINTEGER; 4838 5390 } … … 4867 5419 tokfix(p); 4868 5420 if (nondigit) goto trailing_uc; 4869 pylval.nd = new_int(p, tok(p), 8); 5421 suffix = number_literal_suffix(p); 5422 pylval.nd = new_int(p, tok(p), 8, suffix); 4870 5423 return tINTEGER; 4871 5424 } … … 4884 5437 else { 4885 5438 pushback(p, c); 4886 pylval.nd = new_int(p, "0", 10); 5439 suffix = number_literal_suffix(p); 5440 pylval.nd = new_int(p, "0", 10, suffix); 4887 5441 return tINTEGER; 4888 5442 } … … 4952 5506 if (nondigit) { 4953 5507 trailing_uc: 4954 yyerror_ i(p, "trailing '%c' in number",nondigit);5508 yyerror_c(p, "trailing non digit in number: ", (char)nondigit); 4955 5509 } 4956 5510 tokfix(p); 4957 5511 if (is_float) { 5512 #ifdef MRB_WITHOUT_FLOAT 5513 yywarning_s(p, "floating point numbers are not supported", tok(p)); 5514 pylval.nd = new_int(p, "0", 10, 0); 5515 return tINTEGER; 5516 #else 4958 5517 double d; 4959 5518 char *endp; … … 4962 5521 d = mrb_float_read(tok(p), &endp); 4963 5522 if (d == 0 && endp == tok(p)) { 4964 yywarning_s(p, "corrupted float value %s", tok(p));5523 yywarning_s(p, "corrupted float value", tok(p)); 4965 5524 } 4966 5525 else if (errno == ERANGE) { 4967 yywarning_s(p, "float %sout of range", tok(p));5526 yywarning_s(p, "float out of range", tok(p)); 4968 5527 errno = 0; 4969 5528 } 4970 pylval.nd = new_float(p, tok(p)); 5529 suffix = number_literal_suffix(p); 5530 pylval.nd = new_float(p, tok(p), suffix); 4971 5531 return tFLOAT; 4972 } 4973 pylval.nd = new_int(p, tok(p), 10); 5532 #endif 5533 } 5534 suffix = number_literal_suffix(p); 5535 pylval.nd = new_int(p, tok(p), 10, suffix); 4974 5536 return tINTEGER; 4975 5537 } … … 4985 5547 p->lstate = EXPR_ENDFN; 4986 5548 else 4987 p->lstate = EXPR_END ARG;5549 p->lstate = EXPR_END; 4988 5550 return c; 4989 5551 … … 4998 5560 return tCOLON2; 4999 5561 } 5000 if ( IS_END() || ISSPACE(c)) {5562 if (!space_seen && IS_END()) { 5001 5563 pushback(p, c); 5002 5564 p->lstate = EXPR_BEG; 5003 return ':'; 5565 return tLABEL_TAG; 5566 } 5567 if (!ISSPACE(c) || IS_BEG()) { 5568 pushback(p, c); 5569 p->lstate = EXPR_FNAME; 5570 return tSYMBEG; 5004 5571 } 5005 5572 pushback(p, c); 5006 p->lstate = EXPR_ FNAME;5007 return tSYMBEG;5573 p->lstate = EXPR_BEG; 5574 return ':'; 5008 5575 5009 5576 case '/': … … 5013 5580 } 5014 5581 if ((c = nextc(p)) == '=') { 5015 pylval.id = intern_ c('/');5582 pylval.id = intern_lit("/"); 5016 5583 p->lstate = EXPR_BEG; 5017 5584 return tOP_ASGN; … … 5032 5599 case '^': 5033 5600 if ((c = nextc(p)) == '=') { 5034 pylval.id = intern_ c('^');5601 pylval.id = intern_lit("^"); 5035 5602 p->lstate = EXPR_BEG; 5036 5603 return tOP_ASGN; … … 5070 5637 } 5071 5638 else if (IS_SPCARG(-1)) { 5639 c = tLPAREN_ARG; 5640 } 5641 else if (p->lstate == EXPR_END && space_seen) { 5072 5642 c = tLPAREN_ARG; 5073 5643 } … … 5147 5717 else { 5148 5718 term = nextc(p); 5149 if ( isalnum(term)) {5719 if (ISALNUM(term)) { 5150 5720 yyerror(p, "unknown type of %string"); 5151 5721 return 0; … … 5206 5776 } 5207 5777 if ((c = nextc(p)) == '=') { 5208 pylval.id = intern_ c('%');5778 pylval.id = intern_lit("%"); 5209 5779 p->lstate = EXPR_BEG; 5210 5780 return tOP_ASGN; … … 5260 5830 tokadd(p, c); 5261 5831 tokfix(p); 5262 pylval.id = intern _cstr(tok(p));5832 pylval.id = intern(tok(p), toklen(p)); 5263 5833 return tGVAR; 5264 5834 … … 5270 5840 gvar: 5271 5841 tokfix(p); 5272 pylval.id = intern _cstr(tok(p));5842 pylval.id = intern(tok(p), toklen(p)); 5273 5843 return tGVAR; 5274 5844 … … 5291 5861 tokadd(p, c); 5292 5862 c = nextc(p); 5293 } while (c >= 0 && isdigit(c));5863 } while (c >= 0 && ISDIGIT(c)); 5294 5864 pushback(p, c); 5295 5865 if (last_state == EXPR_FNAME) goto gvar; … … 5298 5868 unsigned long n = strtoul(tok(p), NULL, 10); 5299 5869 if (n > INT_MAX) { 5300 yyerror _i(p, "capture group index must be <= %d", INT_MAX);5870 yyerror(p, "capture group index must be <= " MRB_STRINGIZE(INT_MAX)); 5301 5871 return 0; 5302 5872 } … … 5333 5903 return 0; 5334 5904 } 5335 else if ( isdigit(c)) {5905 else if (ISDIGIT(c)) { 5336 5906 if (p->tidx == 1) { 5337 yyerror_ i(p, "'@%c' is not allowed as an instance variable name", c);5907 yyerror_c(p, "wrong instance variable name: @", c); 5338 5908 } 5339 5909 else { 5340 yyerror_ i(p, "'@@%c' is not allowed as a class variable name", c);5910 yyerror_c(p, "wrong class variable name: @@", c); 5341 5911 } 5342 5912 return 0; … … 5354 5924 default: 5355 5925 if (!identchar(c)) { 5356 yyerror_i(p, "Invalid char '\\x%02X' in expression", c); 5926 char buf[36]; 5927 const char s[] = "Invalid char in expression: 0x"; 5928 const char hexdigits[] = "0123456789ABCDEF"; 5929 5930 strcpy(buf, s); 5931 buf[sizeof(s)-1] = hexdigits[(c & 0xf0) >> 4]; 5932 buf[sizeof(s)] = hexdigits[(c & 0x0f)]; 5933 buf[sizeof(s)+1] = 0; 5934 yyerror(p, buf); 5357 5935 goto retry; 5358 5936 } … … 5400 5978 break; 5401 5979 5980 case '_': 5981 if (toklen(p) == 2 && ISDIGIT(tok(p)[1]) && p->nvars) { 5982 int n = tok(p)[1] - '0'; 5983 int nvar; 5984 5985 if (n > 0) { 5986 node *nvars = p->nvars->cdr; 5987 5988 while (nvars) { 5989 nvar = intn(nvars->car); 5990 if (nvar == -2) break; /* top of the scope */ 5991 if (nvar > 0) { 5992 yywarning(p, "numbered parameter used in outer block"); 5993 break; 5994 } 5995 nvars->car = nint(-1); 5996 nvars = nvars->cdr; 5997 } 5998 nvar = intn(p->nvars->car); 5999 if (nvar == -1) { 6000 yywarning(p, "numbered parameter used in inner block"); 6001 } 6002 if (nvar >= -1) { 6003 pylval.num = n; 6004 p->lstate = EXPR_END; 6005 return tNUMPARAM; 6006 } 6007 else { 6008 yywarning(p, "identifier for numbered parameter; consider another name"); 6009 } 6010 } 6011 } 6012 /* fall through */ 5402 6013 default: 5403 6014 if (toklast(p) == '!' || toklast(p) == '?') { … … 5406 6017 else { 5407 6018 if (p->lstate == EXPR_FNAME) { 6019 if ((c = nextc(p)) == '=' && !peek(p, '~') && !peek(p, '>') && 6020 (!peek(p, '=') || (peek_n(p, '>', 1)))) { 6021 result = tIDENTIFIER; 6022 tokadd(p, c); 6023 tokfix(p); 6024 } 6025 else { 6026 pushback(p, c); 6027 } 5408 6028 if ((c = nextc(p)) == '=' && !peek(p, '~') && !peek(p, '>') && 5409 6029 (!peek(p, '=') || (peek_n(p, '>', 1)))) { … … 5426 6046 if (IS_LABEL_POSSIBLE()) { 5427 6047 if (IS_LABEL_SUFFIX(0)) { 5428 p->lstate = EXPR_BEG; 5429 nextc(p); 6048 p->lstate = EXPR_END; 5430 6049 tokfix(p); 5431 pylval.id = intern _cstr(tok(p));5432 return t LABEL;6050 pylval.id = intern(tok(p), toklen(p)); 6051 return tIDENTIFIER; 5433 6052 } 5434 6053 } … … 5488 6107 } 5489 6108 { 5490 mrb_sym ident = intern _cstr(tok(p));6109 mrb_sym ident = intern(tok(p), toklen(p)); 5491 6110 5492 6111 pylval.id = ident; 5493 #if 0 5494 if (last_state != EXPR_DOT && islower(tok(p)[0]) && lvar_defined(ident)) { 6112 if (last_state != EXPR_DOT && ISLOWER(tok(p)[0]) && local_var_p(p, ident)) { 5495 6113 p->lstate = EXPR_END; 5496 6114 } 5497 #endif5498 6115 } 5499 6116 return result; … … 5524 6141 p->capture_errors = cxt->capture_errors; 5525 6142 p->no_optimize = cxt->no_optimize; 6143 p->on_eval = cxt->on_eval; 5526 6144 if (cxt->partial_hook) { 5527 6145 p->cxt = cxt; … … 5536 6154 5537 6155 if (!cxt) return; 5538 if ( (int)(intptr_t)p->tree->car!= NODE_SCOPE) return;6156 if (intn(p->tree->car) != NODE_SCOPE) return; 5539 6157 n0 = n = p->tree->cdr->car; 5540 6158 while (n) { … … 5559 6177 5560 6178 MRB_TRY(p->jmp) { 5561 int n ;6179 int n = 1; 5562 6180 5563 6181 p->cmd_start = TRUE; … … 5675 6293 { 5676 6294 if (s) { 5677 int len = strlen(s);6295 size_t len = strlen(s); 5678 6296 char *p = (char *)mrb_malloc(mrb, len + 1); 5679 6297 … … 5702 6320 5703 6321 sym = mrb_intern_cstr(p->mrb, f); 5704 p->filename = mrb_sym2name_len(p->mrb, sym, NULL);6322 p->filename_sym = sym; 5705 6323 p->lineno = (p->filename_table_length > 0)? 0 : 1; 5706 6324 5707 6325 for (i = 0; i < p->filename_table_length; ++i) { 5708 6326 if (p->filename_table[i] == sym) { 5709 p->current_filename_index = i;6327 p->current_filename_index = (int)i; 5710 6328 return; 5711 6329 } 5712 6330 } 5713 6331 6332 if (p->filename_table_length == UINT16_MAX) { 6333 yyerror(p, "too many files to compile"); 6334 return; 6335 } 5714 6336 p->current_filename_index = p->filename_table_length++; 5715 6337 5716 6338 new_table = (mrb_sym*)parser_palloc(p, sizeof(mrb_sym) * p->filename_table_length); 5717 6339 if (p->filename_table) { 5718 memmove(new_table, p->filename_table, sizeof(mrb_sym) * p-> filename_table_length);6340 memmove(new_table, p->filename_table, sizeof(mrb_sym) * p->current_filename_index); 5719 6341 } 5720 6342 p->filename_table = new_table; … … 5722 6344 } 5723 6345 5724 MRB_API char const*6346 MRB_API mrb_sym 5725 6347 mrb_parser_get_filename(struct mrb_parser_state* p, uint16_t idx) { 5726 if (idx >= p->filename_table_length) { return NULL; }6348 if (idx >= p->filename_table_length) return 0; 5727 6349 else { 5728 return mrb_sym2name_len(p->mrb, p->filename_table[idx], NULL);6350 return p->filename_table[idx]; 5729 6351 } 5730 6352 } … … 5747 6369 5748 6370 MRB_API parser_state* 5749 mrb_parse_nstring(mrb_state *mrb, const char *s, int len, mrbc_context *c)6371 mrb_parse_nstring(mrb_state *mrb, const char *s, size_t len, mrbc_context *c) 5750 6372 { 5751 6373 parser_state *p; … … 5778 6400 } 5779 6401 if (!p->tree || p->nerr) { 6402 if (c) c->parser_nerr = p->nerr; 5780 6403 if (p->capture_errors) { 5781 6404 char buf[256]; 5782 int n; 5783 5784 n = snprintf(buf, sizeof(buf), "line %d: %s\n", 5785 p->error_buffer[0].lineno, p->error_buffer[0].message); 5786 mrb->exc = mrb_obj_ptr(mrb_exc_new(mrb, E_SYNTAX_ERROR, buf, n)); 6405 6406 strcpy(buf, "line "); 6407 dump_int(p->error_buffer[0].lineno, buf+5); 6408 strcat(buf, ": "); 6409 strncat(buf, p->error_buffer[0].message, sizeof(buf) - strlen(buf) - 1); 6410 mrb->exc = mrb_obj_ptr(mrb_exc_new(mrb, E_SYNTAX_ERROR, buf, strlen(buf))); 5787 6411 mrb_parser_free(p); 5788 6412 return mrb_undef_value(); … … 5817 6441 } 5818 6442 } 5819 proc->target_class = target;6443 MRB_PROC_SET_TARGET_CLASS(proc, target); 5820 6444 if (mrb->c->ci) { 5821 6445 mrb->c->ci->target_class = target; … … 5841 6465 5842 6466 MRB_API mrb_value 5843 mrb_load_nstring_cxt(mrb_state *mrb, const char *s, int len, mrbc_context *c)6467 mrb_load_nstring_cxt(mrb_state *mrb, const char *s, size_t len, mrbc_context *c) 5844 6468 { 5845 6469 return mrb_load_exec(mrb, mrb_parse_nstring(mrb, s, len, c), c); … … 5847 6471 5848 6472 MRB_API mrb_value 5849 mrb_load_nstring(mrb_state *mrb, const char *s, int len)6473 mrb_load_nstring(mrb_state *mrb, const char *s, size_t len) 5850 6474 { 5851 6475 return mrb_load_nstring_cxt(mrb, s, len, NULL); … … 5885 6509 } 5886 6510 6511 static void 6512 dump_args(mrb_state *mrb, node *n, int offset) 6513 { 6514 if (n->car) { 6515 dump_prefix(n, offset+1); 6516 printf("mandatory args:\n"); 6517 dump_recur(mrb, n->car, offset+2); 6518 } 6519 n = n->cdr; 6520 if (n->car) { 6521 dump_prefix(n, offset+1); 6522 printf("optional args:\n"); 6523 { 6524 node *n2 = n->car; 6525 6526 while (n2) { 6527 dump_prefix(n2, offset+2); 6528 printf("%s=\n", mrb_sym_name(mrb, sym(n2->car->car))); 6529 mrb_parser_dump(mrb, n2->car->cdr, offset+3); 6530 n2 = n2->cdr; 6531 } 6532 } 6533 } 6534 n = n->cdr; 6535 if (n->car) { 6536 dump_prefix(n, offset+1); 6537 printf("rest=*%s\n", mrb_sym_name(mrb, sym(n->car))); 6538 } 6539 n = n->cdr; 6540 if (n->car) { 6541 dump_prefix(n, offset+1); 6542 printf("post mandatory args:\n"); 6543 dump_recur(mrb, n->car, offset+2); 6544 } 6545 6546 n = n->cdr; 6547 if (n) { 6548 mrb_assert(intn(n->car) == NODE_ARGS_TAIL); 6549 mrb_parser_dump(mrb, n, offset); 6550 } 6551 } 6552 6553 /* 6554 * This function restores the GC arena on return. 6555 * For this reason, if a process that further generates an object is 6556 * performed at the caller, the string pointer returned as the return 6557 * value may become invalid. 6558 */ 6559 static const char* 6560 str_dump(mrb_state *mrb, const char *str, int len) 6561 { 6562 mrb_int ai = mrb_gc_arena_save(mrb); 6563 mrb_value s; 6564 # if INT_MAX > MRB_INT_MAX / 4 6565 /* check maximum length with "\xNN" charactor */ 6566 if (len > MRB_INT_MAX / 4) { 6567 len = MRB_INT_MAX / 4; 6568 } 6569 # endif 6570 s = mrb_str_new(mrb, str, (mrb_int)len); 6571 s = mrb_str_dump(mrb, s); 6572 mrb_gc_arena_restore(mrb, ai); 6573 return RSTRING_PTR(s); 6574 } 5887 6575 #endif 5888 6576 … … 5896 6584 again: 5897 6585 dump_prefix(tree, offset); 5898 nodetype = (int)(intptr_t)tree->car;6586 nodetype = intn(tree->car); 5899 6587 tree = tree->cdr; 5900 6588 switch (nodetype) { … … 5956 6644 5957 6645 case NODE_LAMBDA: 5958 printf("NODE_BLOCK:\n"); 6646 printf("NODE_LAMBDA:\n"); 6647 dump_prefix(tree, offset); 5959 6648 goto block; 5960 6649 … … 5964 6653 tree = tree->cdr; 5965 6654 if (tree->car) { 5966 node *n = tree->car; 5967 5968 if (n->car) { 5969 dump_prefix(n, offset+1); 5970 printf("mandatory args:\n"); 5971 dump_recur(mrb, n->car, offset+2); 5972 } 5973 n = n->cdr; 5974 if (n->car) { 5975 dump_prefix(n, offset+1); 5976 printf("optional args:\n"); 5977 { 5978 node *n2 = n->car; 5979 5980 while (n2) { 5981 dump_prefix(n2, offset+2); 5982 printf("%s=", mrb_sym2name(mrb, sym(n2->car->car))); 5983 mrb_parser_dump(mrb, n2->car->cdr, 0); 5984 n2 = n2->cdr; 5985 } 5986 } 5987 } 5988 n = n->cdr; 5989 if (n->car) { 5990 dump_prefix(n, offset+1); 5991 printf("rest=*%s\n", mrb_sym2name(mrb, sym(n->car))); 5992 } 5993 n = n->cdr; 5994 if (n->car) { 5995 dump_prefix(n, offset+1); 5996 printf("post mandatory args:\n"); 5997 dump_recur(mrb, n->car, offset+2); 5998 } 5999 if (n->cdr) { 6000 dump_prefix(n, offset+1); 6001 printf("blk=&%s\n", mrb_sym2name(mrb, sym(n->cdr))); 6002 } 6655 dump_args(mrb, tree->car, offset+1); 6003 6656 } 6004 6657 dump_prefix(tree, offset+1); … … 6123 6776 if (n2->car) { 6124 6777 if (!first_lval) printf(", "); 6125 printf("%s", mrb_sym 2name(mrb, sym(n2->car)));6778 printf("%s", mrb_sym_name(mrb, sym(n2->car))); 6126 6779 first_lval = FALSE; 6127 6780 } … … 6151 6804 dump_prefix(tree, offset+1); 6152 6805 printf("method='%s' (%d)\n", 6153 mrb_sym 2name(mrb, sym(tree->cdr->car)),6154 (int)(intptr_t)tree->cdr->car);6806 mrb_sym_dump(mrb, sym(tree->cdr->car)), 6807 intn(tree->cdr->car)); 6155 6808 tree = tree->cdr->cdr->car; 6156 6809 if (tree) { … … 6182 6835 mrb_parser_dump(mrb, tree->car, offset+1); 6183 6836 dump_prefix(tree, offset+1); 6184 printf("::%s\n", mrb_sym 2name(mrb, sym(tree->cdr)));6837 printf("::%s\n", mrb_sym_name(mrb, sym(tree->cdr))); 6185 6838 break; 6186 6839 6187 6840 case NODE_COLON3: 6188 printf("NODE_COLON3: ::%s\n", mrb_sym 2name(mrb, sym(tree)));6841 printf("NODE_COLON3: ::%s\n", mrb_sym_name(mrb, sym(tree))); 6189 6842 break; 6190 6843 … … 6196 6849 case NODE_HASH: 6197 6850 printf("NODE_HASH:\n"); 6851 while (tree) { 6852 dump_prefix(tree, offset+1); 6853 printf("key:\n"); 6854 mrb_parser_dump(mrb, tree->car->car, offset+2); 6855 dump_prefix(tree, offset+1); 6856 printf("value:\n"); 6857 mrb_parser_dump(mrb, tree->car->cdr, offset+2); 6858 tree = tree->cdr; 6859 } 6860 break; 6861 6862 case NODE_KW_HASH: 6863 printf("NODE_KW_HASH:\n"); 6198 6864 while (tree) { 6199 6865 dump_prefix(tree, offset+1); … … 6269 6935 tree = tree->cdr; 6270 6936 dump_prefix(tree, offset+1); 6271 printf("op='%s' (%d)\n", mrb_sym 2name(mrb, sym(tree->car)), (int)(intptr_t)tree->car);6937 printf("op='%s' (%d)\n", mrb_sym_name(mrb, sym(tree->car)), intn(tree->car)); 6272 6938 tree = tree->cdr; 6273 6939 mrb_parser_dump(mrb, tree->car, offset+1); … … 6321 6987 6322 6988 case NODE_LVAR: 6323 printf("NODE_LVAR %s\n", mrb_sym 2name(mrb, sym(tree)));6989 printf("NODE_LVAR %s\n", mrb_sym_name(mrb, sym(tree))); 6324 6990 break; 6325 6991 6326 6992 case NODE_GVAR: 6327 printf("NODE_GVAR %s\n", mrb_sym 2name(mrb, sym(tree)));6993 printf("NODE_GVAR %s\n", mrb_sym_name(mrb, sym(tree))); 6328 6994 break; 6329 6995 6330 6996 case NODE_IVAR: 6331 printf("NODE_IVAR %s\n", mrb_sym 2name(mrb, sym(tree)));6997 printf("NODE_IVAR %s\n", mrb_sym_name(mrb, sym(tree))); 6332 6998 break; 6333 6999 6334 7000 case NODE_CVAR: 6335 printf("NODE_CVAR %s\n", mrb_sym2name(mrb, sym(tree))); 7001 printf("NODE_CVAR %s\n", mrb_sym_name(mrb, sym(tree))); 7002 break; 7003 7004 case NODE_NVAR: 7005 printf("NODE_NVAR %d\n", intn(tree)); 6336 7006 break; 6337 7007 6338 7008 case NODE_CONST: 6339 printf("NODE_CONST %s\n", mrb_sym 2name(mrb, sym(tree)));7009 printf("NODE_CONST %s\n", mrb_sym_name(mrb, sym(tree))); 6340 7010 break; 6341 7011 … … 6351 7021 6352 7022 case NODE_BACK_REF: 6353 printf("NODE_BACK_REF: $%c\n", (int)(intptr_t)tree);7023 printf("NODE_BACK_REF: $%c\n", intn(tree)); 6354 7024 break; 6355 7025 6356 7026 case NODE_NTH_REF: 6357 printf("NODE_NTH_REF: $% " MRB_PRId "\n", (mrb_int)(intptr_t)tree);7027 printf("NODE_NTH_REF: $%d\n", intn(tree)); 6358 7028 break; 6359 7029 6360 7030 case NODE_ARG: 6361 printf("NODE_ARG %s\n", mrb_sym 2name(mrb, sym(tree)));7031 printf("NODE_ARG %s\n", mrb_sym_name(mrb, sym(tree))); 6362 7032 break; 6363 7033 … … 6368 7038 6369 7039 case NODE_INT: 6370 printf("NODE_INT %s base %d\n", (char*)tree->car, (int)(intptr_t)tree->cdr->car);7040 printf("NODE_INT %s base %d\n", (char*)tree->car, intn(tree->cdr->car)); 6371 7041 break; 6372 7042 … … 6376 7046 6377 7047 case NODE_NEGATE: 6378 printf("NODE_NEGATE \n");7048 printf("NODE_NEGATE:\n"); 6379 7049 mrb_parser_dump(mrb, tree, offset+1); 6380 7050 break; 6381 7051 6382 7052 case NODE_STR: 6383 printf("NODE_STR \"%s\" len %d\n", (char*)tree->car, (int)(intptr_t)tree->cdr);7053 printf("NODE_STR %s len %d\n", str_dump(mrb, (char*)tree->car, intn(tree->cdr)), intn(tree->cdr)); 6384 7054 break; 6385 7055 6386 7056 case NODE_DSTR: 6387 printf("NODE_DSTR \n");7057 printf("NODE_DSTR:\n"); 6388 7058 dump_recur(mrb, tree, offset+1); 6389 7059 break; 6390 7060 6391 7061 case NODE_XSTR: 6392 printf("NODE_XSTR \"%s\" len %d\n", (char*)tree->car, (int)(intptr_t)tree->cdr);7062 printf("NODE_XSTR %s len %d\n", str_dump(mrb, (char*)tree->car, intn(tree->cdr)), intn(tree->cdr)); 6393 7063 break; 6394 7064 6395 7065 case NODE_DXSTR: 6396 printf("NODE_DXSTR \n");7066 printf("NODE_DXSTR:\n"); 6397 7067 dump_recur(mrb, tree, offset+1); 6398 7068 break; … … 6403 7073 6404 7074 case NODE_DREGX: 6405 printf("NODE_DREGX \n");7075 printf("NODE_DREGX:\n"); 6406 7076 dump_recur(mrb, tree->car, offset+1); 6407 7077 dump_prefix(tree, offset); … … 6418 7088 6419 7089 case NODE_SYM: 6420 printf("NODE_SYM :%s (%d)\n", mrb_sym2name(mrb, sym(tree)), 6421 (int)(intptr_t)tree); 7090 printf("NODE_SYM :%s (%d)\n", mrb_sym_dump(mrb, sym(tree)), 7091 intn(tree)); 7092 break; 7093 7094 case NODE_DSYM: 7095 printf("NODE_DSYM:\n"); 7096 mrb_parser_dump(mrb, tree, offset+1); 7097 break; 7098 7099 case NODE_WORDS: 7100 printf("NODE_WORDS:\n"); 7101 dump_recur(mrb, tree, offset+1); 7102 break; 7103 7104 case NODE_SYMBOLS: 7105 printf("NODE_SYMBOLS:\n"); 7106 dump_recur(mrb, tree, offset+1); 7107 break; 7108 7109 case NODE_LITERAL_DELIM: 7110 printf("NODE_LITERAL_DELIM\n"); 6422 7111 break; 6423 7112 … … 6440 7129 case NODE_ALIAS: 6441 7130 printf("NODE_ALIAS %s %s:\n", 6442 mrb_sym 2name(mrb, sym(tree->car)),6443 mrb_sym 2name(mrb, sym(tree->cdr)));7131 mrb_sym_dump(mrb, sym(tree->car)), 7132 mrb_sym_dump(mrb, sym(tree->cdr))); 6444 7133 break; 6445 7134 … … 6449 7138 node *t = tree; 6450 7139 while (t) { 6451 printf(" %s", mrb_sym 2name(mrb, sym(t->car)));7140 printf(" %s", mrb_sym_dump(mrb, sym(t->car))); 6452 7141 t = t->cdr; 6453 7142 } … … 6460 7149 if (tree->car->car == (node*)0) { 6461 7150 dump_prefix(tree, offset+1); 6462 printf(":%s\n", mrb_sym 2name(mrb, sym(tree->car->cdr)));7151 printf(":%s\n", mrb_sym_name(mrb, sym(tree->car->cdr))); 6463 7152 } 6464 7153 else if (tree->car->car == (node*)1) { 6465 7154 dump_prefix(tree, offset+1); 6466 printf("::%s\n", mrb_sym 2name(mrb, sym(tree->car->cdr)));7155 printf("::%s\n", mrb_sym_name(mrb, sym(tree->car->cdr))); 6467 7156 } 6468 7157 else { 6469 7158 mrb_parser_dump(mrb, tree->car->car, offset+1); 6470 7159 dump_prefix(tree, offset+1); 6471 printf("::%s\n", mrb_sym 2name(mrb, sym(tree->car->cdr)));7160 printf("::%s\n", mrb_sym_name(mrb, sym(tree->car->cdr))); 6472 7161 } 6473 7162 if (tree->cdr->car) { … … 6485 7174 if (tree->car->car == (node*)0) { 6486 7175 dump_prefix(tree, offset+1); 6487 printf(":%s\n", mrb_sym 2name(mrb, sym(tree->car->cdr)));7176 printf(":%s\n", mrb_sym_name(mrb, sym(tree->car->cdr))); 6488 7177 } 6489 7178 else if (tree->car->car == (node*)1) { 6490 7179 dump_prefix(tree, offset+1); 6491 printf("::%s\n", mrb_sym 2name(mrb, sym(tree->car->cdr)));7180 printf("::%s\n", mrb_sym_name(mrb, sym(tree->car->cdr))); 6492 7181 } 6493 7182 else { 6494 7183 mrb_parser_dump(mrb, tree->car->car, offset+1); 6495 7184 dump_prefix(tree, offset+1); 6496 printf("::%s\n", mrb_sym 2name(mrb, sym(tree->car->cdr)));7185 printf("::%s\n", mrb_sym_name(mrb, sym(tree->car->cdr))); 6497 7186 } 6498 7187 dump_prefix(tree, offset+1); … … 6512 7201 printf("NODE_DEF:\n"); 6513 7202 dump_prefix(tree, offset+1); 6514 printf("%s\n", mrb_sym 2name(mrb, sym(tree->car)));7203 printf("%s\n", mrb_sym_dump(mrb, sym(tree->car))); 6515 7204 tree = tree->cdr; 6516 7205 { … … 6525 7214 if (n2->car) { 6526 7215 if (!first_lval) printf(", "); 6527 printf("%s", mrb_sym 2name(mrb, sym(n2->car)));7216 printf("%s", mrb_sym_name(mrb, sym(n2->car))); 6528 7217 first_lval = FALSE; 6529 7218 } … … 6535 7224 tree = tree->cdr; 6536 7225 if (tree->car) { 6537 node *n = tree->car; 6538 6539 if (n->car) { 6540 dump_prefix(n, offset+1); 6541 printf("mandatory args:\n"); 6542 dump_recur(mrb, n->car, offset+2); 6543 } 6544 n = n->cdr; 6545 if (n->car) { 6546 dump_prefix(n, offset+1); 6547 printf("optional args:\n"); 6548 { 6549 node *n2 = n->car; 6550 6551 while (n2) { 6552 dump_prefix(n2, offset+2); 6553 printf("%s=", mrb_sym2name(mrb, sym(n2->car->car))); 6554 mrb_parser_dump(mrb, n2->car->cdr, 0); 6555 n2 = n2->cdr; 6556 } 6557 } 6558 } 6559 n = n->cdr; 6560 if (n->car) { 6561 dump_prefix(n, offset+1); 6562 printf("rest=*%s\n", mrb_sym2name(mrb, sym(n->car))); 6563 } 6564 n = n->cdr; 6565 if (n->car) { 6566 dump_prefix(n, offset+1); 6567 printf("post mandatory args:\n"); 6568 dump_recur(mrb, n->car, offset+2); 6569 } 6570 if (n->cdr) { 6571 dump_prefix(n, offset+1); 6572 printf("blk=&%s\n", mrb_sym2name(mrb, sym(n->cdr))); 6573 } 7226 dump_args(mrb, tree->car, offset); 6574 7227 } 6575 7228 mrb_parser_dump(mrb, tree->cdr->car, offset+1); … … 6581 7234 tree = tree->cdr; 6582 7235 dump_prefix(tree, offset+1); 6583 printf(":%s\n", mrb_sym 2name(mrb, sym(tree->car)));7236 printf(":%s\n", mrb_sym_dump(mrb, sym(tree->car))); 6584 7237 tree = tree->cdr->cdr; 6585 7238 if (tree->car) { 6586 node *n = tree->car; 6587 6588 if (n->car) { 6589 dump_prefix(n, offset+1); 6590 printf("mandatory args:\n"); 6591 dump_recur(mrb, n->car, offset+2); 6592 } 6593 n = n->cdr; 6594 if (n->car) { 6595 dump_prefix(n, offset+1); 6596 printf("optional args:\n"); 6597 { 6598 node *n2 = n->car; 6599 6600 while (n2) { 6601 dump_prefix(n2, offset+2); 6602 printf("%s=", mrb_sym2name(mrb, sym(n2->car->car))); 6603 mrb_parser_dump(mrb, n2->car->cdr, 0); 6604 n2 = n2->cdr; 6605 } 6606 } 6607 } 6608 n = n->cdr; 6609 if (n->car) { 6610 dump_prefix(n, offset+1); 6611 printf("rest=*%s\n", mrb_sym2name(mrb, sym(n->car))); 6612 } 6613 n = n->cdr; 6614 if (n->car) { 6615 dump_prefix(n, offset+1); 6616 printf("post mandatory args:\n"); 6617 dump_recur(mrb, n->car, offset+2); 6618 } 6619 n = n->cdr; 6620 if (n) { 6621 dump_prefix(n, offset+1); 6622 printf("blk=&%s\n", mrb_sym2name(mrb, sym(n))); 6623 } 7239 dump_args(mrb, tree->car, offset+1); 6624 7240 } 6625 7241 tree = tree->cdr; … … 6637 7253 break; 6638 7254 7255 case NODE_ARGS_TAIL: 7256 printf("NODE_ARGS_TAIL:\n"); 7257 { 7258 node *kws = tree->car; 7259 7260 while (kws) { 7261 mrb_parser_dump(mrb, kws->car, offset+1); 7262 kws = kws->cdr; 7263 } 7264 } 7265 tree = tree->cdr; 7266 if (tree->car) { 7267 mrb_assert(intn(tree->car->car) == NODE_KW_REST_ARGS); 7268 mrb_parser_dump(mrb, tree->car, offset+1); 7269 } 7270 tree = tree->cdr; 7271 if (tree->car) { 7272 dump_prefix(tree, offset+1); 7273 printf("block='%s'\n", mrb_sym_name(mrb, sym(tree->car))); 7274 } 7275 break; 7276 7277 case NODE_KW_ARG: 7278 printf("NODE_KW_ARG %s:\n", mrb_sym_name(mrb, sym(tree->car))); 7279 mrb_parser_dump(mrb, tree->cdr->car, offset + 1); 7280 break; 7281 7282 case NODE_KW_REST_ARGS: 7283 printf("NODE_KW_REST_ARGS %s\n", mrb_sym_name(mrb, sym(tree))); 7284 break; 7285 6639 7286 default: 6640 7287 printf("node type: %d (0x%x)\n", nodetype, (unsigned)nodetype); -
EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-compiler/mrbgem.rake
r331 r439 24 24 end 25 25 end 26 file objfile("#{current_build_dir}/core/y.tab") => lex_def27 26 28 27 # Parser 29 file "#{current_build_dir}/core/y.tab.c" => ["#{current_dir}/core/parse.y"] do |t| 28 file "#{current_build_dir}/core/y.tab.c" => ["#{current_dir}/core/parse.y", lex_def] do |t| 29 mkdir_p File.dirname t.name 30 30 yacc.run t.name, t.prerequisites.first 31 31 end … … 36 36 end 37 37 38 file libfile("#{build.build_dir}/lib/libmruby_core")=> core_objs38 file build.libmruby_core_static => core_objs 39 39 build.libmruby << core_objs 40 40 end -
EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-enum-ext/mrblib/enum.rb
r331 r439 14 14 15 15 def drop(n) 16 raise TypeError, "no implicit conversion of #{n.class} into Integer" unless n.respond_to?(:to_int)16 n = n.__to_int 17 17 raise ArgumentError, "attempt to drop negative size" if n < 0 18 18 19 n = n.to_int20 19 ary = [] 21 20 self.each {|*val| n == 0 ? ary << val.__svalue : n -= 1 } … … 58 57 59 58 def take(n) 60 raise TypeError, "no implicit conversion of #{n.class} into Integer" unless n.respond_to?(:to_int)61 i = n.to_i nt59 n = n.__to_int 60 i = n.to_i 62 61 raise ArgumentError, "attempt to take negative size" if i < 0 63 62 ary = [] … … 114 113 115 114 def each_cons(n, &block) 116 raise TypeError, "no implicit conversion of #{n.class} into Integer" unless n.respond_to?(:to_int)115 n = n.__to_int 117 116 raise ArgumentError, "invalid size" if n <= 0 118 117 119 118 return to_enum(:each_cons,n) unless block 120 119 ary = [] 121 n = n.to_i nt120 n = n.to_i 122 121 self.each do |*val| 123 122 ary.shift if ary.size == n … … 142 141 143 142 def each_slice(n, &block) 144 raise TypeError, "no implicit conversion of #{n.class} into Integer" unless n.respond_to?(:to_int)143 n = n.__to_int 145 144 raise ArgumentError, "invalid slice size" if n <= 0 146 145 147 146 return to_enum(:each_slice,n) unless block 148 147 ary = [] 149 n = n.to_i nt148 n = n.to_i 150 149 self.each do |*val| 151 150 ary << val.__svalue … … 202 201 } 203 202 if ary.size > 1 204 __sort_sub__(ary, ::Array.new(ary.size), 0, 0, ary.size - 1) do |a,b| 205 a <=> b 206 end 203 ary.sort! 207 204 end 208 205 ary.collect{|e,i| orig[i]} 209 206 end 210 207 211 NONE = Object.new212 208 ## 213 209 # call-seq: … … 226 222 return nil 227 223 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 224 i = args[0].__to_int 231 225 raise ArgumentError, "attempt to take negative size" if i < 0 232 226 ary = [] … … 452 446 # call-seq: 453 447 # enum.none? [{ |obj| block }] -> true or false 448 # enum.none?(pattern) -> true or false 454 449 # 455 450 # Passes each element of the collection to the given block. The method … … 458 453 # <code>true</code> only if none of the collection members is true. 459 454 # 455 # If a pattern is supplied instead, the method returns whether 456 # <code>pattern === element</code> for none of the collection members. 457 # 460 458 # %w(ant bear cat).none? { |word| word.length == 5 } #=> true 461 459 # %w(ant bear cat).none? { |word| word.length >= 4 } #=> false 460 # %w{ant bear cat}.none?(/d/) #=> true 461 # [1, 3.14, 42].none?(Float) #=> false 462 462 # [].none? #=> true 463 463 # [nil, false].none? #=> true 464 464 # [nil, true].none? #=> false 465 465 466 def none?(&block) 467 if block 466 def none?(pat=NONE, &block) 467 if pat != NONE 468 self.each do |*val| 469 return false if pat === val.__svalue 470 end 471 elsif block 468 472 self.each do |*val| 469 473 return false if block.call(*val) … … 480 484 # call-seq: 481 485 # enum.one? [{ |obj| block }] -> true or false 486 # enum.one?(pattern) -> true or false 482 487 # 483 488 # Passes each element of the collection to the given block. The method … … 487 492 # true. 488 493 # 494 # If a pattern is supplied instead, the method returns whether 495 # <code>pattern === element</code> for exactly one collection member. 496 # 489 497 # %w(ant bear cat).one? { |word| word.length == 4 } #=> true 490 498 # %w(ant bear cat).one? { |word| word.length > 4 } #=> false 491 499 # %w(ant bear cat).one? { |word| word.length < 4 } #=> false 500 # %w{ant bear cat}.one?(/t/) #=> false 492 501 # [nil, true, 99].one? #=> false 493 502 # [nil, true, false].one? #=> true 494 # 495 496 def one?(&block) 503 # [ nil, true, 99 ].one?(Integer) #=> true 504 # [].one? #=> false 505 506 def one?(pat=NONE, &block) 497 507 count = 0 498 if block 508 if pat!=NONE 509 self.each do |*val| 510 count += 1 if pat === val.__svalue 511 return false if count > 1 512 end 513 elsif block 499 514 self.each do |*val| 500 515 count += 1 if block.call(*val) … … 511 526 end 512 527 528 # ISO 15.3.2.2.1 529 # call-seq: 530 # enum.all? [{ |obj| block } ] -> true or false 531 # enum.all?(pattern) -> true or false 532 # 533 # Passes each element of the collection to the given block. The method 534 # returns <code>true</code> if the block never returns 535 # <code>false</code> or <code>nil</code>. If the block is not given, 536 # Ruby adds an implicit block of <code>{ |obj| obj }</code> which will 537 # cause #all? to return +true+ when none of the collection members are 538 # +false+ or +nil+. 539 # 540 # If a pattern is supplied instead, the method returns whether 541 # <code>pattern === element</code> for every collection member. 542 # 543 # %w[ant bear cat].all? { |word| word.length >= 3 } #=> true 544 # %w[ant bear cat].all? { |word| word.length >= 4 } #=> false 545 # %w[ant bear cat].all?(/t/) #=> false 546 # [1, 2i, 3.14].all?(Numeric) #=> true 547 # [nil, true, 99].all? #=> false 548 # 549 def all?(pat=NONE, &block) 550 if pat != NONE 551 self.each{|*val| return false unless pat === val.__svalue} 552 elsif block 553 self.each{|*val| return false unless block.call(*val)} 554 else 555 self.each{|*val| return false unless val.__svalue} 556 end 557 true 558 end 559 560 # ISO 15.3.2.2.2 561 # call-seq: 562 # enum.any? [{ |obj| block }] -> true or false 563 # enum.any?(pattern) -> true or false 564 # 565 # Passes each element of the collection to the given block. The method 566 # returns <code>true</code> if the block ever returns a value other 567 # than <code>false</code> or <code>nil</code>. If the block is not 568 # given, Ruby adds an implicit block of <code>{ |obj| obj }</code> that 569 # will cause #any? to return +true+ if at least one of the collection 570 # members is not +false+ or +nil+. 571 # 572 # If a pattern is supplied instead, the method returns whether 573 # <code>pattern === element</code> for any collection member. 574 # 575 # %w[ant bear cat].any? { |word| word.length >= 3 } #=> true 576 # %w[ant bear cat].any? { |word| word.length >= 4 } #=> true 577 # %w[ant bear cat].any?(/d/) #=> false 578 # [nil, true, 99].any?(Integer) #=> true 579 # [nil, true, 99].any? #=> true 580 # [].any? #=> false 581 # 582 def any?(pat=NONE, &block) 583 if pat != NONE 584 self.each{|*val| return true if pat === val.__svalue} 585 elsif block 586 self.each{|*val| return true if block.call(*val)} 587 else 588 self.each{|*val| return true if val.__svalue} 589 end 590 false 591 end 592 513 593 ## 514 594 # call-seq: … … 525 605 # 526 606 527 def each_with_object(obj=nil, &block) 528 raise ArgumentError, "wrong number of arguments (0 for 1)" if obj.nil? 529 607 def each_with_object(obj, &block) 530 608 return to_enum(:each_with_object, obj) unless block 531 609 … … 592 670 n = -1 593 671 else 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 672 n = nv.__to_int 601 673 return nil if n <= 0 602 674 end … … 657 729 # call-seq: 658 730 # enum.zip(arg, ...) -> an_array_of_array 731 # enum.zip(arg, ...) { |arr| block } -> nil 659 732 # 660 733 # Takes one element from <i>enum</i> and merges corresponding … … 663 736 # count of arguments. The length of the resulting sequence will be 664 737 # <code>enum#size</code>. If the size of any argument is less than 665 # <code>enum#size</code>, <code>nil</code> values are supplied. 666 # 667 668 def zip(*arg) 669 ary = [] 670 arg = arg.map{|a|a.to_a} 738 # <code>enum#size</code>, <code>nil</code> values are supplied. If 739 # a block is given, it is invoked for each output array, otherwise 740 # an array of arrays is returned. 741 # 742 # a = [ 4, 5, 6 ] 743 # b = [ 7, 8, 9 ] 744 # 745 # a.zip(b) #=> [[4, 7], [5, 8], [6, 9]] 746 # [1, 2, 3].zip(a, b) #=> [[1, 4, 7], [2, 5, 8], [3, 6, 9]] 747 # [1, 2].zip(a, b) #=> [[1, 4, 7], [2, 5, 8]] 748 # a.zip([1, 2], [8]) #=> [[4, 1, 8], [5, 2, nil], [6, nil, nil]] 749 # 750 # c = [] 751 # a.zip(b) { |x, y| c << x + y } #=> nil 752 # c #=> [11, 13, 15] 753 # 754 755 def zip(*arg, &block) 756 result = block ? nil : [] 757 arg = arg.map do |a| 758 unless a.respond_to?(:to_a) 759 raise TypeError, "wrong argument type #{a.class} (must respond to :to_a)" 760 end 761 a.to_a 762 end 763 671 764 i = 0 672 765 self.each do |*val| … … 678 771 idx += 1 679 772 end 680 ary.push(a)681 773 i += 1 682 end 683 ary 774 if result.nil? 775 block.call(a) 776 else 777 result.push(a) 778 end 779 end 780 result 684 781 end 685 782 … … 695 792 # 696 793 697 def to_h 794 def to_h(&blk) 698 795 h = {} 699 self.each do |*v| 700 v = v.__svalue 701 raise TypeError, "wrong element type #{v.class} (expected Array)" unless v.is_a? Array 702 raise ArgumentError, "element has wrong array length (expected 2, was #{v.size})" if v.size != 2 703 h[v[0]] = v[1] 796 if blk 797 self.each do |v| 798 v = blk.call(v) 799 raise TypeError, "wrong element type #{v.class} (expected Array)" unless v.is_a? Array 800 raise ArgumentError, "element has wrong array length (expected 2, was #{v.size})" if v.size != 2 801 h[v[0]] = v[1] 802 end 803 else 804 self.each do |*v| 805 v = v.__svalue 806 raise TypeError, "wrong element type #{v.class} (expected Array)" unless v.is_a? Array 807 raise ArgumentError, "element has wrong array length (expected 2, was #{v.size})" if v.size != 2 808 h[v[0]] = v[1] 809 end 704 810 end 705 811 h 706 812 end 707 813 708 def nil.to_h 709 {} 814 def uniq(&block) 815 hash = {} 816 if block 817 self.each do|*v| 818 v = v.__svalue 819 hash[block.call(v)] ||= v 820 end 821 else 822 self.each do|*v| 823 v = v.__svalue 824 hash[v] ||= v 825 end 826 end 827 hash.values 828 end 829 830 def filter_map(&blk) 831 return to_enum(:filter_map) unless blk 832 833 ary = [] 834 self.each do |x| 835 x = blk.call(x) 836 ary.push x if x 837 end 838 ary 839 end 840 841 alias filter select 842 843 ## 844 # call-seq: 845 # enum.tally -> a_hash 846 # 847 # Tallys the collection. Returns a hash where the keys are the 848 # elements and the values are numbers of elements in the collection 849 # that correspond to the key. 850 # 851 # ["a", "b", "c", "b"].tally #=> {"a"=>1, "b"=>2, "c"=>1} 852 def tally 853 hash = {} 854 self.each do |x| 855 hash[x] = (hash[x]||0)+1 856 end 857 hash 710 858 end 711 859 end -
EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-enum-ext/test/enum.rb
r331 r439 101 101 assert_true %w(ant bear cat).none? { |word| word.length == 5 } 102 102 assert_false %w(ant bear cat).none? { |word| word.length >= 4 } 103 assert_false [1, 3.14, 42].none?(Float) 103 104 assert_true [].none? 104 105 assert_true [nil, false].none? … … 110 111 assert_false %w(ant bear cat).one? { |word| word.length > 4 } 111 112 assert_false %w(ant bear cat).one? { |word| word.length < 4 } 113 assert_true [1, 3.14, 42].one?(Float) 112 114 assert_false [nil, true, 99].one? 113 115 assert_true [nil, true, false].one? 116 assert_true [ nil, true, 99 ].one?(Integer) 117 assert_false [].one? 118 end 119 120 assert("Enumerable#all? (enhancement)") do 121 assert_false [1, 2, 3.14].all?(Integer) 122 assert_true [1, 2, 3.14].all?(Numeric) 123 end 124 125 assert("Enumerable#any? (enhancement)") do 126 assert_false [1, 2, 3].all?(Float) 127 assert_true [nil, true, 99].any?(Integer) 114 128 end 115 129 116 130 assert("Enumerable#each_with_object") do 117 assert_ true[2, 4, 6, 8, 10, 12, 14, 16, 18, 20], (1..10).each_with_object([]) { |i, a| a << i*2 }131 assert_equal [2, 4, 6, 8, 10, 12, 14, 16, 18, 20], (1..10).each_with_object([]) { |i, a| a << i*2 } 118 132 assert_raise(ArgumentError) { (1..10).each_with_object() { |i, a| a << i*2 } } 119 133 end … … 122 136 r = (1..3) 123 137 a = [] 124 assert_ equal (1..3), r.reverse_each { |v| a << v }138 assert_same r, r.reverse_each { |v| a << v } 125 139 assert_equal [3, 2, 1], a 126 140 end … … 153 167 assert_equal [[1, 4, 7], [2, 5, 8]], [1, 2].zip(a, b) 154 168 assert_equal [[4, 1, 8], [5, 2, nil], [6, nil, nil]], a.zip([1, 2], [8]) 169 170 ret = [] 171 assert_equal nil, a.zip([1, 2], [8]) { |i| ret << i } 172 assert_equal [[4, 1, 8], [5, 2, nil], [6, nil, nil]], ret 173 174 assert_raise(TypeError) { [1].zip(1) } 155 175 end 156 176 … … 167 187 assert_equal Hash, h.class 168 188 assert_equal h0, h 169 # mruby-enum-ext also provides nil.to_h 170 assert_equal Hash.new, nil.to_h 189 assert_equal({1=>4,3=>8}, c.new.to_h{|k,v|[k,v*2]}) 171 190 end 191 192 assert("Enumerable#filter_map") do 193 assert_equal [4, 8, 12, 16, 20], (1..10).filter_map{|i| i * 2 if i%2==0} 194 end 195 196 assert("Enumerable#tally") do 197 assert_equal({"a"=>1, "b"=>2, "c"=>1}, ["a", "b", "c", "b"].tally) 198 end -
EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-enum-lazy/mrblib/lazy.rb
r331 r439 44 44 45 45 def to_enum(meth=:each, *args, &block) 46 unless self.respond_to?(meth) 47 raise ArgumentError, "undefined method #{meth}" 48 end 46 49 lz = Lazy.new(self, &block) 47 50 lz.obj = self … … 70 73 def reject(&block) 71 74 Lazy.new(self){|yielder, val| 72 if notblock.call(val)75 unless block.call(val) 73 76 yielder << val 74 77 end … … 156 159 end 157 160 161 def uniq(&block) 162 hash = {} 163 Lazy.new(self){|yielder, val| 164 if block 165 v = block.call(val) 166 else 167 v = val 168 end 169 unless hash.include?(v) 170 yielder << val 171 hash[v] = val 172 end 173 } 174 end 175 158 176 alias force to_a 159 177 end -
EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-enum-lazy/test/lazy.rb
r331 r439 41 41 end 42 42 43 assert("Enum rator::Lazy#to_enum") do43 assert("Enumerator::Lazy#to_enum") do 44 44 lazy_enum = (0..Float::INFINITY).lazy.to_enum(:each_slice, 2) 45 45 assert_kind_of Enumerator::Lazy, lazy_enum -
EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-enumerator/mrbgem.rake
r321 r439 3 3 spec.author = 'mruby developers' 4 4 spec.add_dependency('mruby-fiber', :core => 'mruby-fiber') 5 spec.add_dependency 'mruby-enum-ext', :core => 'mruby-enum-ext'6 5 spec.summary = 'Enumerator class' 7 6 end -
EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-enumerator/mrblib/enumerator.rb
r331 r439 90 90 91 91 ## 92 # @overload initialize(size = nil, &block)93 92 # @overload initialize(obj, method = :each, *args) 94 93 # … … 110 109 # p fib.take(10) # => [1, 1, 2, 3, 5, 8, 13, 21, 34, 55] 111 110 # 112 def initialize(obj=nil, meth=:each, *args, &block) 113 if block_given? 111 # In the second, deprecated, form, a generated Enumerator iterates over the 112 # given object using the given method with the given arguments passed. This 113 # form is left only for internal use. 114 # 115 # Use of this form is discouraged. Use Kernel#enum_for or Kernel#to_enum 116 # instead. 117 def initialize(obj=NONE, meth=:each, *args, &block) 118 if block 114 119 obj = Generator.new(&block) 115 els e116 raise ArgumentError unless obj120 elsif obj == NONE 121 raise ArgumentError, "wrong number of arguments (given 0, expected 1+)" 117 122 end 118 123 119 124 @obj = obj 120 125 @meth = meth 121 @args = args .dup126 @args = args 122 127 @fib = nil 123 128 @dst = nil … … 126 131 @stop_exc = false 127 132 end 128 attr_accessor :obj, :meth, :args , :fib129 private :obj, :meth, :args,:fib133 attr_accessor :obj, :meth, :args 134 attr_reader :fib 130 135 131 136 def initialize_copy(obj) … … 152 157 # +offset+:: the starting index to use 153 158 # 154 def with_index(offset=0) 155 return to_enum :with_index, offset unless block_given? 156 offset = if offset.nil? 157 0 158 elsif offset.respond_to?(:to_int) 159 offset.to_int 159 def with_index(offset=0, &block) 160 return to_enum :with_index, offset unless block 161 162 if offset.nil? 163 offset = 0 160 164 else 161 raise TypeError, "no implicit conversion of #{offset.class} into Integer"165 offset = offset.__to_int 162 166 end 163 167 … … 165 169 enumerator_block_call do |*i| 166 170 n += 1 167 yieldi.__svalue, n171 block.call i.__svalue, n 168 172 end 169 173 end … … 210 214 # # => foo:2 211 215 # 212 def with_object(object )213 return to_enum(:with_object, object) unless block _given?216 def with_object(object, &block) 217 return to_enum(:with_object, object) unless block 214 218 215 219 enumerator_block_call do |i| 216 yield[i,object]220 block.call [i,object] 217 221 end 218 222 object … … 220 224 221 225 def inspect 222 return "#<#{self.class}: uninitialized>" unless @obj223 224 226 if @args && @args.size > 0 225 227 args = @args.join(", ") 226 "#<#{self.class}: #{@obj }:#{@meth}(#{args})>"228 "#<#{self.class}: #{@obj.inspect}:#{@meth}(#{args})>" 227 229 else 228 "#<#{self.class}: #{@obj }:#{@meth}>"230 "#<#{self.class}: #{@obj.inspect}:#{@meth}>" 229 231 end 230 232 end … … 242 244 # === Examples 243 245 # 244 # "Hello, world!".scan(/\w+/) #=> ["Hello", "world"] 245 # "Hello, world!".to_enum(:scan, /\w+/).to_a #=> ["Hello", "world"] 246 # "Hello, world!".to_enum(:scan).each(/\w+/).to_a #=> ["Hello", "world"] 246 # Array.new(3) #=> [nil, nil, nil] 247 # Array.new(3) { |i| i } #=> [0, 1, 2] 248 # Array.to_enum(:new, 3).to_a #=> [0, 1, 2] 249 # Array.to_enum(:new).each(3).to_a #=> [0, 1, 2] 247 250 # 248 251 # obj = Object.new … … 278 281 obj.args = args 279 282 end 280 return obj unless block _given?283 return obj unless block 281 284 enumerator_block_call(&block) 282 285 end … … 539 542 class Yielder 540 543 def initialize(&block) 541 raise LocalJumpError, "no block given" unless block _given?544 raise LocalJumpError, "no block given" unless block 542 545 543 546 @proc = block … … 553 556 end 554 557 end 558 559 ## 560 # call-seq: 561 # Enumerator.produce(initial = nil) { |val| } -> enumerator 562 # 563 # Creates an infinite enumerator from any block, just called over and 564 # over. Result of the previous iteration is passed to the next one. 565 # If +initial+ is provided, it is passed to the first iteration, and 566 # becomes the first element of the enumerator; if it is not provided, 567 # first iteration receives +nil+, and its result becomes first 568 # element of the iterator. 569 # 570 # Raising StopIteration from the block stops an iteration. 571 # 572 # Examples of usage: 573 # 574 # Enumerator.produce(1, &:succ) # => enumerator of 1, 2, 3, 4, .... 575 # 576 # Enumerator.produce { rand(10) } # => infinite random number sequence 577 # 578 # ancestors = Enumerator.produce(node) { |prev| node = prev.parent or raise StopIteration } 579 # enclosing_section = ancestors.find { |n| n.type == :section } 580 def Enumerator.produce(init=NONE, &block) 581 raise ArgumentError, "no block given" if block.nil? 582 Enumerator.new do |y| 583 if init == NONE 584 val = nil 585 else 586 val = init 587 y.yield(val) 588 end 589 begin 590 while true 591 y.yield(val = block.call(val)) 592 end 593 rescue StopIteration 594 # do nothing 595 end 596 end 597 end 555 598 end 556 599 … … 560 603 # obj.to_enum(method = :each, *args) -> enum 561 604 # obj.enum_for(method = :each, *args) -> enum 562 # obj.to_enum(method = :each, *args) {|*args| block} -> enum563 # obj.enum_for(method = :each, *args){|*args| block} -> enum564 605 # 565 606 # Creates a new Enumerator which will enumerate by calling +method+ on 566 607 # +obj+, passing +args+ if any. 567 #568 # If a block is given, it will be used to calculate the size of569 # the enumerator without the need to iterate it (see Enumerator#size).570 608 # 571 609 # === Examples … … 586 624 # a generic Enumerable, in case no block is passed. 587 625 # 588 # Here is such an example , with parameter passing and a sizing block:626 # Here is such an example with parameter passing: 589 627 # 590 628 # module Enumerable … … 593 631 # raise ArgumentError, "#{n} is negative!" if n < 0 594 632 # unless block_given? 595 # return to_enum(__method__, n) do # __method__ is :repeat here 596 # sz = size # Call size and multiply by n... 597 # sz * n if sz # but return nil if size itself is nil 598 # end 633 # return to_enum(__method__, n) # __method__ is :repeat here 599 634 # end 600 635 # each do |*val| … … 613 648 Enumerator.new self, meth, *args 614 649 end 615 alias :enum_for :to_enum650 alias enum_for to_enum 616 651 end 617 652 618 653 module Enumerable 619 654 # use Enumerator to use infinite sequence 620 def zip(*arg) 621 ary = [] 622 arg = arg.map{|a|a.each} 623 i = 0 624 self.each do |*val| 625 a = [] 626 a.push(val.__svalue) 627 idx = 0 628 while idx < arg.size 629 begin 630 a.push(arg[idx].next) 631 rescue StopIteration 632 a.push(nil) 655 def zip(*args, &block) 656 args = args.map do |a| 657 if a.respond_to?(:each) 658 a.to_enum(:each) 659 else 660 raise TypeError, "wrong argument type #{a.class} (must respond to :each)" 661 end 662 end 663 664 result = block ? nil : [] 665 666 each do |*val| 667 tmp = [val.__svalue] 668 args.each do |arg| 669 v = if arg.nil? 670 nil 671 else 672 begin 673 arg.next 674 rescue StopIteration 675 nil 676 end 633 677 end 634 idx += 1678 tmp.push(v) 635 679 end 636 ary.push(a) 637 i += 1 638 end 639 ary 680 if result.nil? 681 block.call(tmp) 682 else 683 result.push(tmp) 684 end 685 end 686 687 result 640 688 end 641 689 end -
EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-enumerator/test/enumerator.rb
r331 r439 7 7 end 8 8 9 assert 'Enumerator' do 9 def assert_take(exp, enumerator) 10 result = [] 11 n = exp.size 12 enumerator.each do |v| 13 result << v 14 n -= 1 15 break if n == 0 16 end if n > 0 17 assert_equal exp, result 18 end 19 20 assert 'Enumerator.class' do 10 21 assert_equal Class, Enumerator.class 11 22 end 12 23 13 assert 'Enumerator ' do24 assert 'Enumerator.superclass' do 14 25 assert_equal Object, Enumerator.superclass 15 26 end … … 20 31 assert_equal [[:x,1],[:y,2]], {x:1, y:2}.each.map{|i| i}.sort 21 32 assert_equal [1,2,3], @obj.to_enum(:foo, 1,2,3).to_a 22 assert_equal [1,2,3], Enumerator.new(@obj, :foo, 1,2,3).to_a 23 assert_equal [1,2,3], Enumerator.new { |y| i = 0; loop { y << (i += 1) } }.take(3) 33 assert_take [1,2,3], Enumerator.new { |y| i = 0; loop { y << (i += 1) } } 24 34 assert_raise(ArgumentError) { Enumerator.new } 25 enum = @obj.to_enum26 assert_raise(NoMethodError) { enum.each {} }27 35 28 36 # examples … … 34 42 end 35 43 end 36 assert_ equal fib.take(10), [1,1,2,3,5,8,13,21,34,55]44 assert_take [1,1,2,3,5,8,13,21,34,55], fib 37 45 end 38 46 … … 54 62 @obj.to_enum(:foo, 1, 2, 3).with_index(10).with_index(20) { |*i| a << i } 55 63 assert_equal [[[1, 10], 20], [[2, 11], 21], [[3, 12], 22]], a 56 end57 58 assert 'Enumerator#with_index nonnum offset' do59 s = Object.new60 def s.to_int; 1 end61 assert_equal([[1,1],[2,2],[3,3]], @obj.to_enum(:foo, 1, 2, 3).with_index(s).to_a)62 64 end 63 65 … … 100 102 assert 'Enumerator#inspect' do 101 103 e = (0..10).each 102 assert_equal("#<Enumerator: 0..10:each>", e.inspect) 103 e = Enumerator.new("FooObject", :foo, 1) 104 assert_equal("#<Enumerator: FooObject:foo(1)>", e.inspect) 105 e = Enumerator.new("FooObject", :foo, 1, 2, 3) 106 assert_equal("#<Enumerator: FooObject:foo(1, 2, 3)>", e.inspect) 104 assert_equal('#<Enumerator: 0..10:each>', e.inspect) 105 e = 'FooObject'.enum_for(:foo, 1) 106 assert_equal('#<Enumerator: "FooObject":foo(1)>', e.inspect) 107 e = 'FooObject'.enum_for(:foo, 1, 2, 3) 108 assert_equal('#<Enumerator: "FooObject":foo(1, 2, 3)>', e.inspect) 109 e = nil.enum_for(:to_s) 110 assert_equal('#<Enumerator: nil:to_s>', e.inspect) 107 111 end 108 112 … … 426 430 427 431 assert 'Kernel#to_enum' do 432 e = nil 428 433 assert_equal Enumerator, [].to_enum.class 429 assert_raise(ArgumentError){ nil.to_enum } 434 assert_nothing_raised { e = [].to_enum(:_not_implemented_) } 435 assert_raise(NoMethodError) { e.first } 430 436 end 431 437 … … 510 516 assert 'Hash#select' do 511 517 h = {1=>2,3=>4,5=>6} 512 hret = h.select.with_index {|a, b| a[1] == 4}518 hret = h.select.with_index {|a,_b| a[1] == 4} 513 519 assert_equal({3=>4}, hret) 514 520 assert_equal({1=>2,3=>4,5=>6}, h) … … 517 523 assert 'Hash#select!' do 518 524 h = {1=>2,3=>4,5=>6} 519 hret = h.select!.with_index {|a, b| a[1] == 4}525 hret = h.select!.with_index {|a,_b| a[1] == 4} 520 526 assert_equal h, hret 521 527 assert_equal({3=>4}, h) … … 524 530 assert 'Hash#reject' do 525 531 h = {1=>2,3=>4,5=>6} 526 hret = h.reject.with_index {|a, b| a[1] == 4}532 hret = h.reject.with_index {|a,_b| a[1] == 4} 527 533 assert_equal({1=>2,5=>6}, hret) 528 534 assert_equal({1=>2,3=>4,5=>6}, h) … … 531 537 assert 'Hash#reject!' do 532 538 h = {1=>2,3=>4,5=>6} 533 hret = h.reject!.with_index {|a, b| a[1] == 4}539 hret = h.reject!.with_index {|a,_b| a[1] == 4} 534 540 assert_equal h, hret 535 541 assert_equal({1=>2,5=>6}, h) … … 545 551 assert_equal [1,2,3,4,5], c 546 552 end 553 554 assert 'Enumerable#zip' do 555 assert_equal [[1, 10], [2, 11], [3, 12]], [1,2,3].zip(10..Float::INFINITY) 556 557 ret = [] 558 assert_equal nil, [1,2,3].zip(10..Float::INFINITY) { |i| ret << i } 559 assert_equal [[1, 10], [2, 11], [3, 12]], ret 560 561 assert_raise(TypeError) { [1].zip(1) } 562 end 563 564 assert 'Enumerator.produce' do 565 assert_raise(ArgumentError) { Enumerator.produce } 566 567 # Without initial object 568 passed_args = [] 569 enum = Enumerator.produce {|obj| passed_args << obj; (obj || 0).succ } 570 assert_equal Enumerator, enum.class 571 assert_take [1, 2, 3], enum 572 assert_equal [nil, 1, 2], passed_args 573 574 # With initial object 575 passed_args = [] 576 enum = Enumerator.produce(1) {|obj| passed_args << obj; obj.succ } 577 assert_take [1, 2, 3], enum 578 assert_equal [1, 2], passed_args 579 580 # Raising StopIteration 581 words = %w[The quick brown fox jumps over the lazy dog] 582 enum = Enumerator.produce { words.shift or raise StopIteration } 583 assert_equal %w[The quick brown fox jumps over the lazy dog], enum.to_a 584 585 # Raising StopIteration 586 object = [[[["abc", "def"], "ghi", "jkl"], "mno", "pqr"], "stuv", "wxyz"] 587 enum = Enumerator.produce(object) {|obj| 588 obj.respond_to?(:first) or raise StopIteration 589 obj.first 590 } 591 assert_nothing_raised { 592 assert_equal [ 593 [[[["abc", "def"], "ghi", "jkl"], "mno", "pqr"], "stuv", "wxyz"], 594 [[["abc", "def"], "ghi", "jkl"], "mno", "pqr"], 595 [["abc", "def"], "ghi", "jkl"], 596 ["abc", "def"], 597 "abc", 598 ], enum.to_a 599 } 600 end -
EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-error/src/exception.c
r331 r439 9 9 struct mrb_jmpbuf c_jmp; 10 10 mrb_value result = mrb_nil_value(); 11 int ai = mrb_gc_arena_save(mrb); 11 12 12 13 if (state) { *state = FALSE; } … … 23 24 } MRB_END_EXC(&c_jmp); 24 25 26 mrb_gc_arena_restore(mrb, ai); 25 27 mrb_gc_protect(mrb, result); 26 28 return result; … … 33 35 struct mrb_jmpbuf c_jmp; 34 36 mrb_value result; 37 int ai = mrb_gc_arena_save(mrb); 35 38 36 39 MRB_TRY(&c_jmp) { … … 40 43 } MRB_CATCH(&c_jmp) { 41 44 mrb->jmp = prev_jmp; 45 mrb_gc_arena_restore(mrb, ai); 42 46 ensure(mrb, e_data); 43 47 MRB_THROW(mrb->jmp); /* rethrow catched exceptions */ 44 48 } MRB_END_EXC(&c_jmp); 45 49 50 mrb_gc_arena_restore(mrb, ai); 51 mrb_gc_protect(mrb, result); 46 52 ensure(mrb, e_data); 53 mrb_gc_arena_restore(mrb, ai); 47 54 mrb_gc_protect(mrb, result); 48 55 return result; … … 65 72 mrb_bool error_matched = FALSE; 66 73 mrb_int i; 74 int ai = mrb_gc_arena_save(mrb); 67 75 68 76 MRB_TRY(&c_jmp) { … … 83 91 84 92 mrb->exc = NULL; 93 mrb_gc_arena_restore(mrb, ai); 85 94 result = rescue(mrb, r_data); 86 95 } MRB_END_EXC(&c_jmp); 87 96 97 mrb_gc_arena_restore(mrb, ai); 88 98 mrb_gc_protect(mrb, result); 89 99 return result; -
EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-eval/src/eval.c
r331 r439 13 13 get_closure_irep(mrb_state *mrb, int level) 14 14 { 15 struct mrb_context *c = mrb->c; 16 struct REnv *e = c->ci[-1].proc->env; 17 struct RProc *proc; 18 19 if (level == 0) { 20 proc = c->ci[-1].proc; 21 if (MRB_PROC_CFUNC_P(proc)) { 22 return NULL; 23 } 24 return proc->body.irep; 25 } 26 27 while (--level) { 28 e = (struct REnv*)e->c; 29 if (!e) return NULL; 30 } 31 32 if (!e) return NULL; 33 if (!MRB_ENV_STACK_SHARED_P(e)) return NULL; 34 c = e->cxt.c; 35 proc = c->cibase[e->cioff].proc; 36 37 if (!proc || MRB_PROC_CFUNC_P(proc)) { 15 struct RProc *proc = mrb->c->ci[-1].proc; 16 17 while (level--) { 18 if (!proc) return NULL; 19 proc = proc->upper; 20 } 21 if (!proc) return NULL; 22 if (MRB_PROC_CFUNC_P(proc)) { 38 23 return NULL; 39 24 } … … 41 26 } 42 27 43 static inline mrb_code 28 /* search for irep lev above the bottom */ 29 static mrb_irep* 30 search_irep(mrb_irep *top, int bnest, int lev, mrb_irep *bottom) 31 { 32 int i; 33 34 for (i=0; i<top->rlen; i++) { 35 mrb_irep* tmp = top->reps[i]; 36 37 if (tmp == bottom) return top; 38 tmp = search_irep(tmp, bnest-1, lev, bottom); 39 if (tmp) { 40 if (bnest == lev) return top; 41 return tmp; 42 } 43 } 44 return NULL; 45 } 46 47 static uint16_t 44 48 search_variable(mrb_state *mrb, mrb_sym vsym, int bnest) 45 49 { … … 49 53 50 54 for (level = 0; (virep = get_closure_irep(mrb, level)); level++) { 51 if ( !virep ||virep->lv == NULL) {55 if (virep->lv == NULL) { 52 56 continue; 53 57 } 54 58 for (pos = 0; pos < virep->nlocals - 1; pos++) { 55 59 if (vsym == virep->lv[pos].name) { 56 return (MKARG_B(pos + 1) | MKARG_C(level + bnest)); 57 } 58 } 59 } 60 60 return (pos+1)<<8 | (level+bnest); 61 } 62 } 63 } 64 65 return 0; 66 } 67 68 static int 69 irep_argc(mrb_irep *irep) 70 { 71 mrb_code c; 72 73 c = irep->iseq[0]; 74 if (c == OP_ENTER) { 75 mrb_aspec ax = PEEK_W(irep->iseq+1); 76 /* extra 1 means a slot for block */ 77 return MRB_ASPEC_REQ(ax)+MRB_ASPEC_OPT(ax)+MRB_ASPEC_REST(ax)+MRB_ASPEC_POST(ax)+1; 78 } 61 79 return 0; 62 80 } … … 71 89 } 72 90 91 extern uint8_t mrb_insn_size[]; 92 extern uint8_t mrb_insn_size1[]; 93 extern uint8_t mrb_insn_size2[]; 94 extern uint8_t mrb_insn_size3[]; 95 73 96 static void 74 patch_irep(mrb_state *mrb, mrb_irep *irep, int bnest) 75 { 76 size_t i; 77 mrb_code c; 78 int argc = 0; 79 80 for (i = 0; i < irep->ilen; i++) { 81 c = irep->iseq[i]; 82 switch(GET_OPCODE(c)){ 83 case OP_ENTER: 84 { 85 mrb_aspec ax = GETARG_Ax(c); 86 /* extra 1 means a slot for block */ 87 argc = MRB_ASPEC_REQ(ax)+MRB_ASPEC_OPT(ax)+MRB_ASPEC_REST(ax)+MRB_ASPEC_POST(ax)+1; 88 } 89 break; 90 97 patch_irep(mrb_state *mrb, mrb_irep *irep, int bnest, mrb_irep *top) 98 { 99 int i; 100 uint32_t a; 101 uint16_t b; 102 uint8_t c; 103 mrb_code insn; 104 int argc = irep_argc(irep); 105 mrb_code *iseq = (mrb_code *)irep->iseq; 106 107 mrb_assert((irep->flags & MRB_ISEQ_NO_FREE) == 0); 108 109 for (i = 0; i < irep->ilen; ) { 110 insn = iseq[i]; 111 switch(insn){ 91 112 case OP_EPUSH: 92 patch_irep(mrb, irep->reps[GETARG_Bx(c)], bnest + 1); 113 a = PEEK_B(iseq+i+1); 114 patch_irep(mrb, irep->reps[a], bnest + 1, top); 93 115 break; 94 116 95 117 case OP_LAMBDA: 96 { 97 int arg_c = GETARG_c(c); 98 if (arg_c & OP_L_CAPTURE) { 99 patch_irep(mrb, irep->reps[GETARG_b(c)], bnest + 1); 100 } 101 } 118 case OP_BLOCK: 119 a = PEEK_B(iseq+i+1); 120 b = PEEK_B(iseq+i+2); 121 patch_irep(mrb, irep->reps[b], bnest + 1, top); 102 122 break; 103 123 104 124 case OP_SEND: 105 if (GETARG_C(c) != 0) { 125 b = PEEK_B(iseq+i+2); 126 c = PEEK_B(iseq+i+3); 127 if (c != 0) { 106 128 break; 107 129 } 108 {109 mrb_code arg = search_variable(mrb, irep->syms[GETARG_B(c)], bnest);130 else { 131 uint16_t arg = search_variable(mrb, irep->syms[b], bnest); 110 132 if (arg != 0) { 111 133 /* must replace */ 112 irep->iseq[i] = MKOPCODE(OP_GETUPVAR) | MKARG_A(GETARG_A(c)) | arg; 134 iseq[i] = OP_GETUPVAR; 135 iseq[i+2] = arg >> 8; 136 iseq[i+3] = arg & 0xff; 113 137 } 114 138 } … … 116 140 117 141 case OP_MOVE: 142 a = PEEK_B(iseq+i+1); 143 b = PEEK_B(iseq+i+2); 118 144 /* src part */ 119 if (potential_upvar_p(irep->lv, GETARG_B(c), argc, irep->nlocals)) {120 mrb_code arg = search_variable(mrb, irep->lv[GETARG_B(c)- 1].name, bnest);145 if (potential_upvar_p(irep->lv, b, argc, irep->nlocals)) { 146 uint16_t arg = search_variable(mrb, irep->lv[b - 1].name, bnest); 121 147 if (arg != 0) { 122 148 /* must replace */ 123 irep->iseq[i] = MKOPCODE(OP_GETUPVAR) | MKARG_A(GETARG_A(c)) | arg; 149 iseq[i] = insn = OP_GETUPVAR; 150 iseq[i+2] = arg >> 8; 151 iseq[i+3] = arg & 0xff; 124 152 } 125 153 } 126 154 /* dst part */ 127 if (potential_upvar_p(irep->lv, GETARG_A(c), argc, irep->nlocals)) {128 mrb_code arg = search_variable(mrb, irep->lv[GETARG_A(c)- 1].name, bnest);155 if (potential_upvar_p(irep->lv, a, argc, irep->nlocals)) { 156 uint16_t arg = search_variable(mrb, irep->lv[a - 1].name, bnest); 129 157 if (arg != 0) { 130 158 /* must replace */ 131 irep->iseq[i] = MKOPCODE(OP_SETUPVAR) | MKARG_A(GETARG_B(c)) | arg; 132 } 133 } 134 break; 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 } 159 iseq[i] = insn = OP_SETUPVAR; 160 iseq[i+1] = (mrb_code)b; 161 iseq[i+2] = arg >> 8; 162 iseq[i+3] = arg & 0xff; 163 } 164 } 165 break; 166 167 case OP_GETUPVAR: 168 a = PEEK_B(iseq+i+1); 169 b = PEEK_B(iseq+i+2); 170 c = PEEK_B(iseq+i+3); 171 { 172 int lev = c+1; 173 mrb_irep *tmp = search_irep(top, bnest, lev, irep); 174 if (potential_upvar_p(tmp->lv, b, irep_argc(tmp), tmp->nlocals)) { 175 uint16_t arg = search_variable(mrb, tmp->lv[b-1].name, bnest); 176 if (arg != 0) { 177 /* must replace */ 178 iseq[i] = OP_GETUPVAR; 179 iseq[i+2] = arg >> 8; 180 iseq[i+3] = arg & 0xff; 181 } 182 } 183 } 184 break; 185 186 case OP_SETUPVAR: 187 a = PEEK_B(iseq+i+1); 188 b = PEEK_B(iseq+i+2); 189 c = PEEK_B(iseq+i+3); 190 { 191 int lev = c+1; 192 mrb_irep *tmp = search_irep(top, bnest, lev, irep); 193 if (potential_upvar_p(tmp->lv, b, irep_argc(tmp), tmp->nlocals)) { 194 uint16_t arg = search_variable(mrb, tmp->lv[b-1].name, bnest); 195 if (arg != 0) { 196 /* must replace */ 197 iseq[i] = OP_SETUPVAR; 198 iseq[i+1] = a; 199 iseq[i+2] = arg >> 8; 200 iseq[i+3] = arg & 0xff; 201 } 202 } 203 } 204 break; 205 206 case OP_EXT1: 207 insn = PEEK_B(iseq+i+1); 208 i += mrb_insn_size1[insn]+1; 209 continue; 210 case OP_EXT2: 211 insn = PEEK_B(iseq+i+1); 212 i += mrb_insn_size2[insn]+1; 213 continue; 214 case OP_EXT3: 215 insn = PEEK_B(iseq+i+1); 216 i += mrb_insn_size3[insn]+1; 217 continue; 218 } 219 i+=mrb_insn_size[insn]; 142 220 } 143 221 } … … 146 224 147 225 static struct RProc* 148 create_proc_from_string(mrb_state *mrb, char *s, int len, mrb_value binding, const char *file, mrb_int line)226 create_proc_from_string(mrb_state *mrb, char *s, mrb_int len, mrb_value binding, const char *file, mrb_int line) 149 227 { 150 228 mrbc_context *cxt; … … 152 230 struct RProc *proc; 153 231 struct REnv *e; 154 struct mrb_context *c = mrb->c; 232 mrb_callinfo *ci; /* callinfo of eval caller */ 233 struct RClass *target_class = NULL; 234 int bidx; 155 235 156 236 if (!mrb_nil_p(binding)) { … … 159 239 160 240 cxt = mrbc_context_new(mrb); 161 cxt->lineno = line;241 cxt->lineno = (uint16_t)line; 162 242 163 243 mrbc_filename(mrb, cxt, file ? file : "(eval)"); 164 244 cxt->capture_errors = TRUE; 165 245 cxt->no_optimize = TRUE; 246 cxt->on_eval = TRUE; 166 247 167 248 p = mrb_parse_nstring(mrb, s, len, cxt); … … 177 258 178 259 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));260 str = mrb_format(mrb, "file %s line %d: %s", 261 file, 262 p->error_buffer[0].lineno, 263 p->error_buffer[0].message); 183 264 } 184 265 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));266 str = mrb_format(mrb, "line %d: %s", 267 p->error_buffer[0].lineno, 268 p->error_buffer[0].message); 188 269 } 189 270 mrb_parser_free(p); … … 199 280 mrb_raise(mrb, E_SCRIPT_ERROR, "codegen error"); 200 281 } 201 if (c->ci[-1].proc->target_class) { 202 proc->target_class = c->ci[-1].proc->target_class; 203 } 204 e = c->ci[-1].proc->env; 205 if (!e) e = c->ci[-1].env; 206 e = (struct REnv*)mrb_obj_alloc(mrb, MRB_TT_ENV, (struct RClass*)e); 207 e->cxt.c = c; 208 e->cioff = c->ci - c->cibase; 209 e->stack = c->ci->stackent; 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; 213 proc->env = e; 214 patch_irep(mrb, proc->body.irep, 0); 282 if (mrb->c->ci > mrb->c->cibase) { 283 ci = &mrb->c->ci[-1]; 284 } 285 else { 286 ci = mrb->c->cibase; 287 } 288 if (ci->proc) { 289 target_class = MRB_PROC_TARGET_CLASS(ci->proc); 290 } 291 if (ci->proc && !MRB_PROC_CFUNC_P(ci->proc)) { 292 if (ci->env) { 293 e = ci->env; 294 } 295 else { 296 e = (struct REnv*)mrb_obj_alloc(mrb, MRB_TT_ENV, 297 (struct RClass*)target_class); 298 e->mid = ci->mid; 299 e->stack = ci[1].stackent; 300 e->cxt = mrb->c; 301 MRB_ENV_SET_STACK_LEN(e, ci->proc->body.irep->nlocals); 302 bidx = ci->argc; 303 if (ci->argc < 0) bidx = 2; 304 else bidx += 1; 305 MRB_ENV_SET_BIDX(e, bidx); 306 ci->env = e; 307 } 308 proc->e.env = e; 309 proc->flags |= MRB_PROC_ENVSET; 310 mrb_field_write_barrier(mrb, (struct RBasic*)proc, (struct RBasic*)e); 311 } 312 proc->upper = ci->proc; 313 mrb->c->ci->target_class = target_class; 314 patch_irep(mrb, proc->body.irep, 0, proc->body.irep); 315 /* mrb_codedump_all(mrb, proc); */ 215 316 216 317 mrb_parser_free(p); … … 223 324 exec_irep(mrb_state *mrb, mrb_value self, struct RProc *proc) 224 325 { 326 /* no argument passed from eval() */ 327 mrb->c->ci->argc = 0; 225 328 if (mrb->c->ci->acc < 0) { 226 mrb_value ret = mrb_top_run(mrb, proc, mrb->c->stack[0], 0); 329 ptrdiff_t cioff = mrb->c->ci - mrb->c->cibase; 330 mrb_value ret = mrb_top_run(mrb, proc, self, 0); 227 331 if (mrb->exc) { 228 332 mrb_exc_raise(mrb, mrb_obj_value(mrb->exc)); 229 333 } 334 mrb->c->ci = mrb->c->cibase + cioff; 230 335 return ret; 231 336 } 337 /* clear block */ 338 mrb->c->stack[1] = mrb_nil_value(); 232 339 return mrb_exec_irep(mrb, self, proc); 233 340 } … … 256 363 mrb_int argc; mrb_value *argv; 257 364 258 mrb_get_args(mrb, "* &", &argv, &argc, &b);365 mrb_get_args(mrb, "*!&", &argv, &argc, &b); 259 366 260 367 if (mrb_nil_p(b)) { … … 269 376 cv = mrb_singleton_class(mrb, self); 270 377 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; 378 MRB_PROC_SET_TARGET_CLASS(proc, mrb_class_ptr(cv)); 273 379 mrb_assert(!MRB_PROC_CFUNC_P(proc)); 380 mrb->c->ci->target_class = mrb_class_ptr(cv); 274 381 return exec_irep(mrb, self, proc); 275 382 } … … 284 391 { 285 392 mrb_define_module_function(mrb, mrb->kernel_module, "eval", f_eval, MRB_ARGS_ARG(1, 3)); 286 mrb_define_method(mrb, mrb ->kernel_module, "instance_eval", f_instance_eval, MRB_ARGS_ARG(1, 2));393 mrb_define_method(mrb, mrb_class_get(mrb, "BasicObject"), "instance_eval", f_instance_eval, MRB_ARGS_OPT(3)|MRB_ARGS_BLOCK()); 287 394 } 288 395 -
EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-eval/test/eval.rb
r331 r439 35 35 assert_equal(2) { 36 36 a = 10 37 Kernel.eval 'def f(a); b=a .send(:+, 1); end'37 Kernel.eval 'def f(a); b=a+1; end' 38 38 f(1) 39 39 } … … 59 59 assert('String instance_eval') do 60 60 obj = Object.new 61 obj.instance_ variable_set :@test, 'test'61 obj.instance_eval{ @test = 'test' } 62 62 assert_raise(ArgumentError) { obj.instance_eval(0) { } } 63 63 assert_raise(ArgumentError) { obj.instance_eval('0', 'test', 0, 'test') } … … 81 81 end 82 82 83 assert(' Object#instance_eval with begin-rescue-ensure execution order') do83 assert('BasicObject#instance_eval with begin-rescue-ensure execution order') do 84 84 class HellRaiser 85 85 def raise_hell … … 100 100 assert_equal([:enter_raise_hell, :begin, :rescue, :ensure], hell_raiser.raise_hell) 101 101 end 102 103 assert('BasicObject#instance_eval to define singleton methods Issue #3141') do 104 foo_class = Class.new do 105 def bar(x) 106 instance_eval "def baz; #{x}; end" 107 end 108 end 109 110 f1 = foo_class.new 111 f2 = foo_class.new 112 f1.bar 1 113 f2.bar 2 114 assert_equal(1){f1.baz} 115 assert_equal(2){f2.baz} 116 end 117 118 assert('Kernel.#eval(string) Issue #4021') do 119 assert_equal('FOO') { (eval <<'EOS').call } 120 foo = "FOO" 121 Proc.new { foo } 122 EOS 123 assert_equal('FOO') { 124 def do_eval(code) 125 eval(code) 126 end 127 do_eval(<<'EOS').call 128 foo = "FOO" 129 Proc.new { foo } 130 EOS 131 } 132 end -
EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-exit/src/mruby-exit.c
r331 r439 5 5 f_exit(mrb_state *mrb, mrb_value self) 6 6 { 7 mrb_int i = EXIT_SUCCESS; 7 mrb_value status = mrb_true_value(); 8 int istatus; 8 9 9 mrb_get_args(mrb, "|i", &i); 10 exit(i); 10 mrb_get_args(mrb, "|o", &status); 11 istatus = mrb_true_p(status) ? EXIT_SUCCESS : 12 mrb_false_p(status) ? EXIT_FAILURE : 13 (int)mrb_int(mrb, status); 14 exit(istatus); 15 11 16 /* not reached */ 12 return mrb_nil_value();17 return status; 13 18 } 14 19 -
EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-fiber/src/fiber.c
r331 r439 73 73 size_t slen; 74 74 75 mrb_get_args(mrb, "& ", &blk);75 mrb_get_args(mrb, "&!", &blk); 76 76 77 77 if (f->cxt) { 78 78 mrb_raise(mrb, E_RUNTIME_ERROR, "cannot initialize twice"); 79 }80 if (mrb_nil_p(blk)) {81 mrb_raise(mrb, E_ARGUMENT_ERROR, "tried to create Fiber object without a block");82 79 } 83 80 p = mrb_proc_ptr(blk); … … 124 121 /* adjust return callinfo */ 125 122 ci = c->ci; 126 ci->target_class = p->target_class;123 ci->target_class = MRB_PROC_TARGET_CLASS(p); 127 124 ci->proc = p; 125 mrb_field_write_barrier(mrb, (struct RBasic*)mrb_obj_ptr(self), (struct RBasic*)p); 128 126 ci->pc = p->body.irep->iseq; 129 ci->nregs = p->body.irep->nregs;130 127 ci[1] = ci[0]; 131 128 c->ci++; /* push dummy callinfo */ … … 187 184 struct mrb_context *c = fiber_check(mrb, self); 188 185 struct mrb_context *old_c = mrb->c; 186 enum mrb_fiber_state status; 189 187 mrb_value value; 190 188 191 189 fiber_check_cfunc(mrb, c); 192 if (resume && c->status == MRB_FIBER_TRANSFERRED) { 193 mrb_raise(mrb, E_FIBER_ERROR, "resuming transferred fiber"); 194 } 195 if (c->status == MRB_FIBER_RUNNING || c->status == MRB_FIBER_RESUMED) { 196 mrb_raise(mrb, E_FIBER_ERROR, "double resume (fib)"); 197 } 198 if (c->status == MRB_FIBER_TERMINATED) { 190 status = c->status; 191 switch (status) { 192 case MRB_FIBER_TRANSFERRED: 193 if (resume) { 194 mrb_raise(mrb, E_FIBER_ERROR, "resuming transferred fiber"); 195 } 196 break; 197 case MRB_FIBER_RUNNING: 198 case MRB_FIBER_RESUMED: 199 mrb_raise(mrb, E_FIBER_ERROR, "double resume"); 200 break; 201 case MRB_FIBER_TERMINATED: 199 202 mrb_raise(mrb, E_FIBER_ERROR, "resuming dead fiber"); 200 } 201 mrb->c->status = resume ? MRB_FIBER_RESUMED : MRB_FIBER_TRANSFERRED; 203 break; 204 default: 205 break; 206 } 207 old_c->status = resume ? MRB_FIBER_RESUMED : MRB_FIBER_TRANSFERRED; 202 208 c->prev = resume ? mrb->c : (c->prev ? c->prev : mrb->root_c); 203 if (c->status == MRB_FIBER_CREATED) { 209 fiber_switch_context(mrb, c); 210 if (status == MRB_FIBER_CREATED) { 204 211 mrb_value *b, *e; 205 212 206 if ( len >= c->stend - c->stack) {207 mrb_raise(mrb, E_FIBER_ERROR, " too many arguments to fiber");213 if (!c->ci->proc) { 214 mrb_raise(mrb, E_FIBER_ERROR, "double resume (current)"); 208 215 } 216 mrb_stack_extend(mrb, len+2); /* for receiver and (optional) block */ 209 217 b = c->stack+1; 210 218 e = b + len; … … 212 220 *b++ = *a++; 213 221 } 214 c->cibase->argc = len;215 value = c->stack[0] = c->ci->proc->env->stack[0];222 c->cibase->argc = (int)len; 223 value = c->stack[0] = MRB_PROC_ENV(c->ci->proc)->stack[0]; 216 224 } 217 225 else { 218 226 value = fiber_result(mrb, a, len); 219 227 } 220 fiber_switch_context(mrb, c);221 228 222 229 if (vmexec) { … … 253 260 mrb_bool vmexec = FALSE; 254 261 255 mrb_get_args(mrb, "* ", &a, &len);262 mrb_get_args(mrb, "*!", &a, &len); 256 263 if (mrb->c->ci->acc < 0) { 257 264 vmexec = TRUE; … … 274 281 * execution of the fiber block this method will always return false. 275 282 */ 276 staticmrb_value277 fiber_alive_p(mrb_state *mrb, mrb_value self)283 MRB_API mrb_value 284 mrb_fiber_alive_p(mrb_state *mrb, mrb_value self) 278 285 { 279 286 struct mrb_context *c = fiber_check(mrb, self); 280 287 return mrb_bool_value(c->status != MRB_FIBER_TERMINATED); 281 288 } 289 #define fiber_alive_p mrb_fiber_alive_p 282 290 283 291 static mrb_value … … 287 295 mrb_get_args(mrb, "o", &other); 288 296 289 if ( mrb_type(other) != MRB_TT_FIBER) {297 if (!mrb_fiber_p(other)) { 290 298 return mrb_false_value(); 291 299 } … … 313 321 314 322 fiber_check_cfunc(mrb, mrb->c); 315 mrb_get_args(mrb, "* ", &a, &len);323 mrb_get_args(mrb, "*!", &a, &len); 316 324 317 325 if (c == mrb->root_c) { … … 371 379 mrb_int len; 372 380 373 mrb_get_args(mrb, "* ", &a, &len);381 mrb_get_args(mrb, "*!", &a, &len); 374 382 return mrb_fiber_yield(mrb, len, a); 375 383 } … … 402 410 MRB_SET_INSTANCE_TT(c, MRB_TT_FIBER); 403 411 404 mrb_define_method(mrb, c, "initialize", fiber_init, MRB_ARGS_NONE() );412 mrb_define_method(mrb, c, "initialize", fiber_init, MRB_ARGS_NONE()|MRB_ARGS_BLOCK()); 405 413 mrb_define_method(mrb, c, "resume", fiber_resume, MRB_ARGS_ANY()); 406 414 mrb_define_method(mrb, c, "transfer", fiber_transfer, MRB_ARGS_ANY()); -
EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-fiber/test/fiber.rb
r321 r439 77 77 78 78 assert('Fiber with splat in the block argument list') { 79 Fiber.new{|*x|x}.resume(1) == [1]79 assert_equal([1], Fiber.new{|*x|x}.resume(1)) 80 80 } 81 81 -
EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-hash-ext/mrbgem.rake
r321 r439 3 3 spec.author = 'mruby developers' 4 4 spec.summary = 'Hash class extension' 5 spec.add_dependency 'mruby-enum-ext', :core => 'mruby-enum-ext' 6 spec.add_dependency 'mruby-array-ext', :core => 'mruby-array-ext' 5 spec.add_dependency 'mruby-array-ext', core: 'mruby-array-ext' 7 6 end -
EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-hash-ext/mrblib/hash.rb
r331 r439 28 28 if length == 1 29 29 o = object[0] 30 if o.respond_to?(:to_hash)30 if Hash === o 31 31 h = self.new 32 o bject[0].to_hash.each { |k, v| h[k] = v }32 o.each { |k, v| h[k] = v } 33 33 return h 34 34 elsif o.respond_to?(:to_a) … … 63 63 ## 64 64 # call-seq: 65 # Hash.try_convert(obj) -> hash or nil66 #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 converted69 # for any reason.70 #71 # Hash.try_convert({1=>2}) # => {1=>2}72 # Hash.try_convert("1=>2") # => nil73 #74 def self.try_convert(obj)75 if obj.respond_to?(:to_hash)76 obj.to_hash77 else78 nil79 end80 end81 82 ##83 # call-seq:84 65 # hsh.merge!(other_hash) -> hsh 85 66 # hsh.merge!(other_hash){|key, oldval, newval| block} -> hsh … … 102 83 103 84 def merge!(other, &block) 104 raise TypeError, " can't convert argument into Hash" unless other.respond_to?(:to_hash)85 raise TypeError, "Hash required (#{other.class} given)" unless Hash === other 105 86 if block 106 87 other.each_key{|k| … … 114 95 115 96 alias update merge! 97 98 ## 99 # call-seq: 100 # hsh.compact! -> hsh 101 # 102 # Removes all nil values from the hash. Returns the hash. 103 # Returns nil if the hash does not contain nil values. 104 # 105 # h = { a: 1, b: false, c: nil } 106 # h.compact! #=> { a: 1, b: false } 107 # 108 109 def compact! 110 keys = self.keys 111 nk = keys.select{|k| 112 self[k] != nil 113 } 114 return nil if (keys.size == nk.size) 115 h = {} 116 nk.each {|k| 117 h[k] = self[k] 118 } 119 h 120 self.replace(h) 121 end 122 123 ## 124 # call-seq: 125 # hsh.compact -> new_hsh 126 # 127 # Returns a new hash with the nil values/key pairs removed 128 # 129 # h = { a: 1, b: false, c: nil } 130 # h.compact #=> { a: 1, b: false } 131 # h #=> { a: 1, b: false, c: nil } 132 # 133 def compact 134 h = {} 135 self.keys.select{|k| 136 self[k] != nil 137 }.each {|k| 138 h[k] = self[k] 139 } 140 h 141 end 116 142 117 143 ## … … 150 176 none 151 177 else 152 raise KeyError, "Key not found: #{key }"178 raise KeyError, "Key not found: #{key.inspect}" 153 179 end 154 180 else … … 172 198 173 199 def delete_if(&block) 174 return to_enum :delete_if unless block _given?200 return to_enum :delete_if unless block 175 201 176 202 self.each do |k, v| … … 229 255 230 256 def keep_if(&block) 231 return to_enum :keep_if unless block _given?257 return to_enum :keep_if unless block 232 258 233 259 keys = [] … … 285 311 # 286 312 def <(hash) 287 begin 288 hash = hash.to_hash 289 rescue NoMethodError 290 raise TypeError, "can't convert #{hash.class} to Hash" 291 end 313 raise TypeError, "can't convert #{hash.class} to Hash" unless Hash === hash 292 314 size < hash.size and all? {|key, val| 293 315 hash.key?(key) and hash[key] == val … … 309 331 # 310 332 def <=(hash) 311 begin 312 hash = hash.to_hash 313 rescue NoMethodError 314 raise TypeError, "can't convert #{hash.class} to Hash" 315 end 333 raise TypeError, "can't convert #{hash.class} to Hash" unless Hash === hash 316 334 size <= hash.size and all? {|key, val| 317 335 hash.key?(key) and hash[key] == val … … 333 351 # 334 352 def >(hash) 335 begin 336 hash = hash.to_hash 337 rescue NoMethodError 338 raise TypeError, "can't convert #{hash.class} to Hash" 339 end 353 raise TypeError, "can't convert #{hash.class} to Hash" unless Hash === hash 340 354 size > hash.size and hash.all? {|key, val| 341 355 key?(key) and self[key] == val … … 357 371 # 358 372 def >=(hash) 359 begin 360 hash = hash.to_hash 361 rescue NoMethodError 362 raise TypeError, "can't convert #{hash.class} to Hash" 363 end 373 raise TypeError, "can't convert #{hash.class} to Hash" unless Hash === hash 364 374 size >= hash.size and hash.all? {|key, val| 365 375 key?(key) and self[key] == val … … 383 393 end 384 394 end 395 396 ## 397 # call-seq: 398 # hsh.transform_keys {|key| block } -> new_hash 399 # hsh.transform_keys -> an_enumerator 400 # 401 # Returns a new hash, with the keys computed from running the block 402 # once for each key in the hash, and the values unchanged. 403 # 404 # If no block is given, an enumerator is returned instead. 405 # 406 def transform_keys(&block) 407 return to_enum :transform_keys unless block 408 hash = {} 409 self.keys.each do |k| 410 new_key = block.call(k) 411 hash[new_key] = self[k] 412 end 413 hash 414 end 415 ## 416 # call-seq: 417 # hsh.transform_keys! {|key| block } -> hsh 418 # hsh.transform_keys! -> an_enumerator 419 # 420 # Invokes the given block once for each key in <i>hsh</i>, replacing it 421 # with the new key returned by the block, and then returns <i>hsh</i>. 422 # 423 # If no block is given, an enumerator is returned instead. 424 # 425 def transform_keys!(&block) 426 return to_enum :transform_keys! unless block 427 self.keys.each do |k| 428 value = self[k] 429 self.__delete(k) 430 k = block.call(k) if block 431 self[k] = value 432 end 433 self 434 end 435 ## 436 # call-seq: 437 # hsh.transform_values {|value| block } -> new_hash 438 # hsh.transform_values -> an_enumerator 439 # 440 # Returns a new hash with the results of running the block once for 441 # every value. 442 # This method does not change the keys. 443 # 444 # If no block is given, an enumerator is returned instead. 445 # 446 def transform_values(&b) 447 return to_enum :transform_values unless block_given? 448 hash = {} 449 self.keys.each do |k| 450 hash[k] = yield(self[k]) 451 end 452 hash 453 end 454 455 ## 456 # call-seq: 457 # hsh.transform_values! {|key| block } -> hsh 458 # hsh.transform_values! -> an_enumerator 459 # 460 # Invokes the given block once for each value in the hash, replacing 461 # with the new value returned by the block, and then returns <i>hsh</i>. 462 # 463 # If no block is given, an enumerator is returned instead. 464 # 465 def transform_values!(&b) 466 return to_enum :transform_values! unless block_given? 467 self.keys.each do |k| 468 self[k] = yield(self[k]) 469 end 470 self 471 end 472 473 def to_proc 474 ->x{self[x]} 475 end 476 477 ## 478 # call-seq: 479 # hsh.fetch_values(key, ...) -> array 480 # hsh.fetch_values(key, ...) { |key| block } -> array 481 # 482 # Returns an array containing the values associated with the given keys 483 # but also raises <code>KeyError</code> when one of keys can't be found. 484 # Also see <code>Hash#values_at</code> and <code>Hash#fetch</code>. 485 # 486 # h = { "cat" => "feline", "dog" => "canine", "cow" => "bovine" } 487 # 488 # h.fetch_values("cow", "cat") #=> ["bovine", "feline"] 489 # h.fetch_values("cow", "bird") # raises KeyError 490 # h.fetch_values("cow", "bird") { |k| k.upcase } #=> ["bovine", "BIRD"] 491 # 492 def fetch_values(*keys, &block) 493 keys.map do |k| 494 self.fetch(k, &block) 495 end 496 end 497 498 alias filter select 499 alias filter! select! 385 500 end -
EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-hash-ext/src/hash-ext.c
r331 r439 37 37 } 38 38 39 /* 40 * call-seq: 41 * hsh.slice(*keys) -> a_hash 42 * 43 * Returns a hash containing only the given keys and their values. 44 * 45 * h = { a: 100, b: 200, c: 300 } 46 * h.slice(:a) #=> {:a=>100} 47 * h.slice(:b, :c, :d) #=> {:b=>200, :c=>300} 48 */ 49 static mrb_value 50 hash_slice(mrb_state *mrb, mrb_value hash) 51 { 52 mrb_value *argv, result; 53 mrb_int argc, i; 54 55 mrb_get_args(mrb, "*", &argv, &argc); 56 result = mrb_hash_new_capa(mrb, argc); 57 if (argc == 0) return result; /* empty hash */ 58 for (i = 0; i < argc; i++) { 59 mrb_value key = argv[i]; 60 mrb_value val; 61 62 val = mrb_hash_fetch(mrb, hash, key, mrb_undef_value()); 63 if (!mrb_undef_p(val)) { 64 mrb_hash_set(mrb, result, key, val); 65 } 66 } 67 return result; 68 } 69 39 70 void 40 71 mrb_mruby_hash_ext_gem_init(mrb_state *mrb) … … 44 75 h = mrb->hash_class; 45 76 mrb_define_method(mrb, h, "values_at", hash_values_at, MRB_ARGS_ANY()); 77 mrb_define_method(mrb, h, "slice", hash_slice, MRB_ARGS_ANY()); 46 78 } 47 79 -
EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-hash-ext/test/hash.rb
r331 r439 46 46 end 47 47 48 assert('Hash.try_convert') do49 assert_nil Hash.try_convert(nil)50 assert_nil Hash.try_convert("{1=>2}")51 assert_equal({1=>2}, Hash.try_convert({1=>2}))52 end53 54 48 assert('Hash#merge!') do 55 49 a = { 'abc_key' => 'abc_value', 'cba_key' => 'cba_value' } … … 81 75 h = Hash.new { |hash,k| hash[k] = k } 82 76 assert_equal keys, h.values_at(*keys) 77 end 78 79 assert('Hash#compact') do 80 h = { "cat" => "feline", "dog" => nil, "cow" => false } 81 82 assert_equal({ "cat" => "feline", "cow" => false }, h.compact) 83 assert_equal({ "cat" => "feline", "dog" => nil, "cow" => false }, h) 84 end 85 86 assert('Hash#compact!') do 87 h = { "cat" => "feline", "dog" => nil, "cow" => false } 88 89 h.compact! 90 assert_equal({ "cat" => "feline", "cow" => false }, h) 83 91 end 84 92 … … 255 263 assert_nil(h.dig(:d)) 256 264 end 265 266 assert("Hash#transform_keys") do 267 h = {"1" => 100, "2" => 200} 268 assert_equal({"1!" => 100, "2!" => 200}, 269 h.transform_keys{|k| k+"!"}) 270 assert_equal({1 => 100, 2 => 200}, 271 h.transform_keys{|k|k.to_i}) 272 assert_same(h, h.transform_keys!{|k|k.to_i}) 273 assert_equal({1 => 100, 2 => 200}, h) 274 end 275 276 assert("Hash#transform_values") do 277 h = {a: 1, b: 2, c: 3} 278 assert_equal({a: 2, b: 5, c: 10}, 279 h.transform_values{|v| v * v + 1}) 280 assert_equal({a: "1", b: "2", c: "3"}, 281 h.transform_values{|v|v.to_s}) 282 assert_same(h, h.transform_values!{|v|v.to_s}) 283 assert_equal({a: "1", b: "2", c: "3"}, h) 284 end 285 286 assert("Hash#slice") do 287 h = { a: 100, b: 200, c: 300 } 288 assert_equal({:a=>100}, h.slice(:a)) 289 assert_equal({:b=>200, :c=>300}, h.slice(:b, :c, :d)) 290 end -
EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-inline-struct/test/inline.c
r331 r439 12 12 mrb_get_args(mrb, "o", &object); 13 13 14 if (mrb_float_p(object)) 15 { 16 snprintf(string, size, "float(%.3f)", mrb_float(object)); 14 if (mrb_fixnum_p(object)) { 15 strncpy(string, "fixnum", size-1); 17 16 } 18 else if (mrb_fixnum_p(object)) 19 {20 s nprintf(string, size, "fixnum(%" MRB_PRId ")", mrb_fixnum(object));17 #ifndef MRB_WITHOUT_FLOAT 18 else if (mrb_float_p(object)) { 19 strncpy(string, "float", size-1); 21 20 } 22 else if (mrb_string_p(object)) 23 { 24 snprintf(string, size, "string(%s)", mrb_string_value_cstr(mrb, &object)); 21 #endif 22 else if (mrb_string_p(object)) { 23 strncpy(string, "string", size-1); 24 } 25 else { 26 strncpy(string, "anything", size-1); 25 27 } 26 28 … … 48 50 if (mrb_obj_class(mrb, object) != mrb_class_get(mrb, "InlineStructTest")) 49 51 { 50 mrb_raise f(mrb, E_TYPE_ERROR, "Expected InlineStructTest");52 mrb_raise(mrb, E_TYPE_ERROR, "Expected InlineStructTest"); 51 53 } 52 54 return mrb_bool_value(((char*)mrb_istruct_ptr(object))[0] == 's'); -
EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-inline-struct/test/inline.rb
r331 r439 18 18 assert('InlineStructTest#dup') do 19 19 obj = InlineStructTest.new(1) 20 assert_equal obj.to_s, 'fixnum (1)'21 assert_equal obj.dup.to_s, 'fixnum (1)'20 assert_equal obj.to_s, 'fixnum' 21 assert_equal obj.dup.to_s, 'fixnum' 22 22 end 23 23 24 24 assert('InlineStructTest#clone') do 25 25 obj = InlineStructTest.new(1) 26 assert_equal obj.to_s, 'fixnum (1)'27 assert_equal obj.clone.to_s, 'fixnum (1)'26 assert_equal obj.to_s, 'fixnum' 27 assert_equal obj.clone.to_s, 'fixnum' 28 28 end 29 29 … … 39 39 assert('InlineStructTest#mutate (dup)') do 40 40 obj1 = InlineStructTest.new("foo") 41 assert_equal obj1.to_s, "string (foo)"41 assert_equal obj1.to_s, "string" 42 42 obj2 = obj1.dup 43 assert_equal obj2.to_s, "string (foo)"43 assert_equal obj2.to_s, "string" 44 44 obj1.mutate 45 assert_equal obj1.to_s, "mutate (foo)"46 assert_equal obj2.to_s, "string (foo)"45 assert_equal obj1.to_s, "mutate" 46 assert_equal obj2.to_s, "string" 47 47 end 48 48 49 49 assert('InlineStructTest#mutate (clone)') do 50 50 obj1 = InlineStructTest.new("foo") 51 assert_equal obj1.to_s, "string (foo)"51 assert_equal obj1.to_s, "string" 52 52 obj2 = obj1.clone 53 assert_equal obj2.to_s, "string (foo)"53 assert_equal obj2.to_s, "string" 54 54 obj1.mutate 55 assert_equal obj1.to_s, "mutate (foo)"56 assert_equal obj2.to_s, "string (foo)"55 assert_equal obj1.to_s, "mutate" 56 assert_equal obj2.to_s, "string" 57 57 end 58 58 … … 102 102 assert_equal InlineStructTest.length, 3 * 8 103 103 end 104 105 assert('InlineStructTest w/float [64 bit]') do106 obj = InlineStructTest.new(1.25)107 assert_equal obj.to_s, "float(1.250)"108 end109 110 assert('InlineStructTest w/fixnum [64 bit]') do111 obj = InlineStructTest.new(42)112 assert_equal obj.to_s, "fixnum(42)"113 end114 115 assert('InlineStructTest w/string [64 bit]') do116 obj = InlineStructTest.new("hello")117 assert_equal obj.to_s, "string(hello)"118 end119 120 assert('InlineStructTest w/long string [64 bit]') do121 obj = InlineStructTest.new("this won't fit in 3 * 8 bytes available for the structure")122 assert_equal obj.to_s, "string(this won't fit i"123 end124 104 end 125 105 … … 129 109 assert_equal InlineStructTest.length, 3 * 4 130 110 end 111 end 131 112 132 assert('InlineStructTest w/float [32 bit]') do 133 obj = InlineStructTest.new(1.25) 134 assert_equal obj.to_s, "float(1.250" 135 end 136 137 assert('InlineStructTest w/fixnum [32 bit]') do 138 obj = InlineStructTest.new(42) 139 assert_equal obj.to_s, "fixnum(42)" 140 end 141 142 assert('InlineStructTest w/string [32 bit]') do 143 obj = InlineStructTest.new("hello") 144 assert_equal obj.to_s, "string(hell" 145 end 146 147 assert('InlineStructTest w/long string [32 bit]') do 148 obj = InlineStructTest.new("this won't fit in 3 * 4 bytes available for the structure") 149 assert_equal obj.to_s, "string(this" 113 # 16-bit mode 114 if InlineStructTest.length == 6 115 assert('InlineStructTest length [16 bit]') do 116 assert_equal InlineStructTest.length, 3 * 2 150 117 end 151 118 end -
EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-kernel-ext/mrbgem.rake
r321 r439 2 2 spec.license = 'MIT' 3 3 spec.author = 'mruby developers' 4 spec.summary = ' Kernel module extension'4 spec.summary = 'extensional function-like methods' 5 5 end -
EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-kernel-ext/src/kernel.c
r331 r439 21 21 break; 22 22 case 1: 23 if (mrb_ type(v) == MRB_TT_RANGE) {23 if (mrb_range_p(v)) { 24 24 mrb_int beg, len; 25 if (mrb_range_beg_len(mrb, v, &beg, &len, bt_len, TRUE) == 1) {25 if (mrb_range_beg_len(mrb, v, &beg, &len, bt_len, TRUE) == MRB_RANGE_OK) { 26 26 lev = beg; 27 27 n = len; … … 32 32 } 33 33 else { 34 v = mrb_to_int(mrb, v); 35 lev = mrb_fixnum(v); 34 lev = mrb_int(mrb, v); 36 35 if (lev < 0) { 37 mrb_raisef(mrb, E_ARGUMENT_ERROR, "negative level (% S)", v);36 mrb_raisef(mrb, E_ARGUMENT_ERROR, "negative level (%v)", v); 38 37 } 39 38 n = bt_len - lev; … … 41 40 break; 42 41 case 2: 43 lev = mrb_ fixnum(mrb_to_int(mrb, v));44 n = mrb_ fixnum(mrb_to_int(mrb, length));42 lev = mrb_int(mrb, v); 43 n = mrb_int(mrb, length); 45 44 if (lev < 0) { 46 mrb_raisef(mrb, E_ARGUMENT_ERROR, "negative level (% S)", v);45 mrb_raisef(mrb, E_ARGUMENT_ERROR, "negative level (%v)", v); 47 46 } 48 47 if (n < 0) { 49 mrb_raisef(mrb, E_ARGUMENT_ERROR, "negative size (% S)", length);48 mrb_raisef(mrb, E_ARGUMENT_ERROR, "negative size (%v)", length); 50 49 } 51 50 break; … … 94 93 * In any case, strings should be strictly conformed to numeric 95 94 * representation. This behavior is different from that of 96 * <code>String#to_i</code>. Non string values will be converted using 97 * <code>to_int</code>, and <code>to_i</code>. Passing <code>nil</code> 98 * raises a TypeError. 95 * <code>String#to_i</code>. Non string values will be treated as integers. 96 * Passing <code>nil</code> raises a TypeError. 99 97 * 100 98 * Integer(123.999) #=> 123 … … 115 113 } 116 114 115 #ifndef MRB_WITHOUT_FLOAT 117 116 /* 118 117 * call-seq: … … 135 134 return mrb_Float(mrb, arg); 136 135 } 136 #endif 137 137 138 138 /* … … 141 141 * 142 142 * Returns <i>arg</i> as an <code>String</code>. 143 * 144 * First tries to call its <code>to_str</code> method, then its to_s method. 143 * converted using <code>to_s</code> method. 145 144 * 146 145 * String(self) #=> "main" … … 154 153 155 154 mrb_get_args(mrb, "o", &arg); 156 tmp = mrb_check_convert_type(mrb, arg, MRB_TT_STRING, "String", "to_str"); 157 if (mrb_nil_p(tmp)) { 158 tmp = mrb_check_convert_type(mrb, arg, MRB_TT_STRING, "String", "to_s"); 159 } 155 tmp = mrb_convert_type(mrb, arg, MRB_TT_STRING, "String", "to_s"); 160 156 return tmp; 161 157 } … … 165 161 * Array(arg) -> array 166 162 * 167 * Returns +arg+ as an Array. 168 * 169 * First tries to call Array#to_ary on +arg+, then Array#to_a. 163 * Returns +arg+ as an Array using to_a method. 170 164 * 171 165 * Array(1..5) #=> [1, 2, 3, 4, 5] … … 178 172 179 173 mrb_get_args(mrb, "o", &arg); 180 tmp = mrb_check_convert_type(mrb, arg, MRB_TT_ARRAY, "Array", "to_ary"); 181 if (mrb_nil_p(tmp)) { 182 tmp = mrb_check_convert_type(mrb, arg, MRB_TT_ARRAY, "Array", "to_a"); 183 } 174 tmp = mrb_check_convert_type(mrb, arg, MRB_TT_ARRAY, "Array", "to_a"); 184 175 if (mrb_nil_p(tmp)) { 185 176 return mrb_ary_new_from_values(mrb, 1, &arg); … … 193 184 * Hash(arg) -> hash 194 185 * 195 * Converts <i>arg</i> to a <code>Hash</code> by calling196 * <i>arg</i><code>.to_hash</code>. Returns an empty <code>Hash</code> when197 * <i>arg</i> is <tt>nil</tt>or <tt>[]</tt>.186 * Returns a <code>Hash</code> if <i>arg</i> is a <code>Hash</code>. 187 * Returns an empty <code>Hash</code> when <i>arg</i> is <tt>nil</tt> 188 * or <tt>[]</tt>. 198 189 * 199 190 * Hash([]) #=> {} … … 206 197 mrb_f_hash(mrb_state *mrb, mrb_value self) 207 198 { 208 mrb_value arg , tmp;209 210 mrb_get_args(mrb, "o", &arg); 211 if (mrb_nil_p(arg) ) {199 mrb_value arg; 200 201 mrb_get_args(mrb, "o", &arg); 202 if (mrb_nil_p(arg) || (mrb_array_p(arg) && RARRAY_LEN(arg) == 0)) { 212 203 return mrb_hash_new(mrb); 213 204 } 214 tmp = mrb_check_convert_type(mrb, arg, MRB_TT_HASH, "Hash", "to_hash"); 215 if (mrb_nil_p(tmp)) { 216 if (mrb_array_p(arg) && RARRAY_LEN(arg) == 0) { 217 return mrb_hash_new(mrb); 218 } 219 mrb_raisef(mrb, E_TYPE_ERROR, "can't convert %S into Hash", 220 mrb_str_new_cstr(mrb, mrb_obj_classname(mrb, arg))); 221 } 222 return tmp; 205 return mrb_ensure_hash_type(mrb, arg); 223 206 } 224 207 … … 231 214 mrb_define_module_function(mrb, krn, "caller", mrb_f_caller, MRB_ARGS_OPT(2)); 232 215 mrb_define_method(mrb, krn, "__method__", mrb_f_method, MRB_ARGS_NONE()); 233 mrb_define_module_function(mrb, krn, "Integer", mrb_f_integer, MRB_ARGS_ANY()); 216 mrb_define_module_function(mrb, krn, "Integer", mrb_f_integer, MRB_ARGS_ARG(1,1)); 217 #ifndef MRB_WITHOUT_FLOAT 234 218 mrb_define_module_function(mrb, krn, "Float", mrb_f_float, MRB_ARGS_REQ(1)); 219 #endif 235 220 mrb_define_module_function(mrb, krn, "String", mrb_f_string, MRB_ARGS_REQ(1)); 236 221 mrb_define_module_function(mrb, krn, "Array", mrb_f_array, MRB_ARGS_REQ(1)); -
EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-kernel-ext/test/kernel.rb
r331 r439 50 50 51 51 assert('Kernel#Integer') do 52 assert_equal(123, Integer(123.999)) 53 assert_equal(26, Integer("0x1a")) 54 assert_equal(930, Integer("0930", 10)) 55 assert_equal(7, Integer("111", 2)) 56 assert_equal(0, Integer("0")) 57 assert_equal(0, Integer("00000")) 52 assert_operator(26, :eql?, Integer("0x1a")) 53 assert_operator(930, :eql?, Integer("0930", 10)) 54 assert_operator(7, :eql?, Integer("111", 2)) 55 assert_operator(0, :eql?, Integer("0")) 56 assert_operator(0, :eql?, Integer("00000")) 57 assert_operator(123, :eql?, Integer('1_2_3')) 58 assert_operator(123, :eql?, Integer("\t\r\n\f\v 123 \t\r\n\f\v")) 58 59 assert_raise(TypeError) { Integer(nil) } 60 assert_raise(ArgumentError) { Integer('a') } 61 assert_raise(ArgumentError) { Integer('4a5') } 62 assert_raise(ArgumentError) { Integer('1_2__3') } 63 assert_raise(ArgumentError) { Integer('68_') } 64 assert_raise(ArgumentError) { Integer('68_ ') } 65 assert_raise(ArgumentError) { Integer('_68') } 66 assert_raise(ArgumentError) { Integer(' _68') } 67 assert_raise(ArgumentError) { Integer('6 8') } 68 assert_raise(ArgumentError) { Integer("15\0") } 69 assert_raise(ArgumentError) { Integer("15.0") } 70 skip unless Object.const_defined?(:Float) 71 assert_operator(123, :eql?, Integer(123.999)) 59 72 end 60 73 61 74 assert('Kernel#Float') do 62 assert_equal(1.0, Float(1)) 63 assert_equal(123.456, Float(123.456)) 64 assert_equal(123.456, Float("123.456")) 75 skip unless Object.const_defined?(:Float) 76 assert_operator(1.0, :eql?, Float(1)) 77 assert_operator(123.456, :eql?, Float(123.456)) 78 assert_operator(123.456, :eql?, Float("123.456")) 79 assert_operator(123.0, :eql?, Float('1_2_3')) 80 assert_operator(12.34, :eql?, Float('1_2.3_4')) 81 assert_operator(0.9, :eql?, Float('.9')) 82 assert_operator(0.9, :eql?, Float(" \t\r\n\f\v.9 \t\r\n\f\v")) 83 assert_operator(16.0, :eql?, Float("0x10")) 65 84 assert_raise(TypeError) { Float(nil) } 85 assert_raise(ArgumentError) { Float("1. 5") } 86 assert_raise(ArgumentError) { Float("1.5a") } 87 assert_raise(ArgumentError) { Float("1.5\0") } 88 assert_raise(ArgumentError) { Float('a') } 89 assert_raise(ArgumentError) { Float('4a5') } 90 assert_raise(ArgumentError) { Float('1_2__3') } 91 assert_raise(ArgumentError) { Float('68_') } 92 assert_raise(ArgumentError) { Float('68._7') } 93 assert_raise(ArgumentError) { Float('68.7_') } 94 assert_raise(ArgumentError) { Float('68.7_ ') } 95 assert_raise(ArgumentError) { Float('_68') } 96 assert_raise(ArgumentError) { Float(' _68') } 97 assert_raise(ArgumentError) { Float('1_2.3__4') } 66 98 end 67 99 -
EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-math/src/math.c
r331 r439 5 5 */ 6 6 7 #ifdef MRB_WITHOUT_FLOAT 8 # error Math conflicts 'MRB_WITHOUT_FLOAT' configuration in your 'build_config.rb' 9 #endif 10 7 11 #include <mruby.h> 8 12 #include <mruby/array.h> … … 15 19 struct RClass *math = mrb_module_get(mrb, "Math"); 16 20 struct RClass *domainerror = mrb_class_get_under(mrb, math, "DomainError"); 17 mrb_value str = mrb_str_new_cstr(mrb, func); 18 mrb_raisef(mrb, domainerror, "Numerical argument is out of domain - %S", str); 21 mrb_raisef(mrb, domainerror, "Numerical argument is out of domain - %s", func); 19 22 } 20 23 … … 23 26 24 27 #include <float.h> 25 26 #define MATH_TOLERANCE 1E-1227 28 28 29 double … … 123 124 sum += term/(2*j+1); 124 125 ++j; 125 } while (fabs(term/sum) > MATH_TOLERANCE); 126 if (sum == 0) break; 127 } while (fabs(term/sum) > DBL_EPSILON); 126 128 return two_sqrtpi*sum; 127 129 } … … 156 158 q1 = q2; 157 159 q2 = b/d; 158 } while (fabs(q1-q2)/q2 > MATH_TOLERANCE);160 } while (fabs(q1-q2)/q2 > DBL_EPSILON); 159 161 return one_sqrtpi*exp(-x*x)*q2; 160 162 } 161 163 164 #endif 165 166 #if defined __FreeBSD__ && !defined __FreeBSD_version 167 #include <osreldate.h> /* for __FreeBSD_version */ 162 168 #endif 163 169 … … 487 493 { 488 494 mrb_float x, base; 489 int argc;495 mrb_int argc; 490 496 491 497 argc = mrb_get_args(mrb, "f|f", &x, &base); … … 658 664 659 665 mrb_get_args(mrb, "fi", &x, &i); 660 x = ldexp(x, i);666 x = ldexp(x, (int)i); 661 667 662 668 return mrb_float_value(mrb, x); … … 737 743 #else 738 744 mrb_define_const(mrb, mrb_math, "E", mrb_float_value(mrb, exp(1.0))); 739 #endif740 741 #ifdef MRB_USE_FLOAT742 mrb_define_const(mrb, mrb_math, "TOLERANCE", mrb_float_value(mrb, 1e-5));743 #else744 mrb_define_const(mrb, mrb_math, "TOLERANCE", mrb_float_value(mrb, 1e-12));745 745 #endif 746 746 -
EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-math/test/math.rb
r321 r439 2 2 # Math Test 3 3 4 ## 5 # Performs fuzzy check for equality on methods returning floats 6 # on the basis of the Math::TOLERANCE constant. 7 def check_float(a, b) 8 tolerance = Math::TOLERANCE 9 a = a.to_f 10 b = b.to_f 11 if a.finite? and b.finite? 12 (a-b).abs < tolerance 13 else 14 true 4 def assert_float_and_int(exp_ary, act_ary) 5 assert('assert_float_and_int') do 6 flo_exp, int_exp, flo_act, int_act = *exp_ary, *act_ary 7 assert_float(flo_exp, flo_act) 8 assert_operator(int_exp, :eql?, int_act) 15 9 end 16 10 end 17 11 18 12 assert('Math.sin 0') do 19 check_float(Math.sin(0), 0)13 assert_float(0, Math.sin(0)) 20 14 end 21 15 22 16 assert('Math.sin PI/2') do 23 check_float(Math.sin(Math::PI / 2), 1)17 assert_float(1, Math.sin(Math::PI / 2)) 24 18 end 25 19 26 20 assert('Math.cos 0') do 27 check_float(Math.cos(0), 1)21 assert_float(1, Math.cos(0)) 28 22 end 29 23 30 24 assert('Math.cos PI/2') do 31 check_float(Math.cos(Math::PI / 2), 0)25 assert_float(0, Math.cos(Math::PI / 2)) 32 26 end 33 27 34 28 assert('Math.tan 0') do 35 check_float(Math.tan(0), 0)29 assert_float(0, Math.tan(0)) 36 30 end 37 31 38 32 assert('Math.tan PI/4') do 39 check_float(Math.tan(Math::PI / 4), 1)33 assert_float(1, Math.tan(Math::PI / 4)) 40 34 end 41 35 42 36 assert('Fundamental trig identities') do 43 result = true44 37 N = 13 45 38 N.times do |i| … … 49 42 c = Math.cos(a) 50 43 t = Math.tan(a) 51 result &= check_float(s, Math.cos(ca)) 52 result &= check_float(t, 1 / Math.tan(ca)) 53 result &= check_float(s ** 2 + c ** 2, 1) 54 result &= check_float(t ** 2 + 1, (1/c) ** 2) 55 result &= check_float((1/t) ** 2 + 1, (1/s) ** 2) 56 end 57 result 44 assert_float(Math.cos(ca), s) 45 assert_float(1 / Math.tan(ca), t) 46 assert_float(1, s ** 2 + c ** 2) 47 assert_float((1/c) ** 2, t ** 2 + 1) 48 assert_float((1/s) ** 2, (1/t) ** 2 + 1) 49 end 58 50 end 59 51 60 52 assert('Math.erf 0') do 61 check_float(Math.erf(0), 0)53 assert_float(0, Math.erf(0)) 62 54 end 63 55 64 56 assert('Math.exp 0') do 65 check_float(Math.exp(0), 1.0)57 assert_float(1.0, Math.exp(0)) 66 58 end 67 59 68 60 assert('Math.exp 1') do 69 check_float(Math.exp(1), 2.718281828459045)61 assert_float(2.718281828459045, Math.exp(1)) 70 62 end 71 63 72 64 assert('Math.exp 1.5') do 73 check_float(Math.exp(1.5), 4.4816890703380645)65 assert_float(4.4816890703380645, Math.exp(1.5)) 74 66 end 75 67 76 68 assert('Math.log 1') do 77 check_float(Math.log(1), 0)69 assert_float(0, Math.log(1)) 78 70 end 79 71 80 72 assert('Math.log E') do 81 check_float(Math.log(Math::E), 1.0)73 assert_float(1.0, Math.log(Math::E)) 82 74 end 83 75 84 76 assert('Math.log E**3') do 85 check_float(Math.log(Math::E**3), 3.0)77 assert_float(3.0, Math.log(Math::E**3)) 86 78 end 87 79 88 80 assert('Math.log2 1') do 89 check_float(Math.log2(1), 0.0)81 assert_float(0.0, Math.log2(1)) 90 82 end 91 83 92 84 assert('Math.log2 2') do 93 check_float(Math.log2(2), 1.0)85 assert_float(1.0, Math.log2(2)) 94 86 end 95 87 96 88 assert('Math.log10 1') do 97 check_float(Math.log10(1), 0.0)89 assert_float(0.0, Math.log10(1)) 98 90 end 99 91 100 92 assert('Math.log10 10') do 101 check_float(Math.log10(10), 1.0)93 assert_float(1.0, Math.log10(10)) 102 94 end 103 95 104 96 assert('Math.log10 10**100') do 105 check_float(Math.log10(10**100), 100.0)97 assert_float(100.0, Math.log10(10**100)) 106 98 end 107 99 … … 109 101 num = [0.0, 1.0, 2.0, 3.0, 4.0] 110 102 sqr = [0, 1, 4, 9, 16] 111 result = true112 103 sqr.each_with_index do |v,i| 113 result &= check_float(Math.sqrt(v), num[i]) 114 end 115 result 104 assert_float(num[i], Math.sqrt(v)) 105 end 116 106 end 117 107 … … 119 109 num = [-2.0, -1.0, 0.0, 1.0, 2.0] 120 110 cub = [-8, -1, 0, 1, 8] 121 result = true122 111 cub.each_with_index do |v,i| 123 result &= check_float(Math.cbrt(v), num[i]) 124 end 125 result 112 assert_float(num[i], Math.cbrt(v)) 113 end 126 114 end 127 115 128 116 assert('Math.hypot') do 129 check_float(Math.hypot(3, 4), 5.0) 130 end 131 132 assert('Math.frexp 1234') do 133 n = 1234 134 fraction, exponent = Math.frexp(n) 135 check_float(Math.ldexp(fraction, exponent), n) 117 assert_float(5.0, Math.hypot(3, 4)) 136 118 end 137 119 138 120 assert('Math.erf 1') do 139 check_float(Math.erf(1), 0.842700792949715)121 assert_float(0.842700792949715, Math.erf(1)) 140 122 end 141 123 142 124 assert('Math.erfc 1') do 143 check_float(Math.erfc(1), 0.157299207050285)125 assert_float(0.157299207050285, Math.erfc(1)) 144 126 end 145 127 146 128 assert('Math.erf -1') do 147 check_float(Math.erf(-1), -0.8427007929497148)129 assert_float(-0.8427007929497148, Math.erf(-1)) 148 130 end 149 131 150 132 assert('Math.erfc -1') do 151 check_float(Math.erfc(-1), 1.8427007929497148) 152 end 133 assert_float(1.8427007929497148, Math.erfc(-1)) 134 end 135 136 assert('Math.acos') do 137 assert_float(0 * Math::PI / 4, Math.acos( 1.0)) 138 assert_float(1 * Math::PI / 4, Math.acos( 1.0 / Math.sqrt(2))) 139 assert_float(2 * Math::PI / 4, Math.acos( 0.0)) 140 assert_float(4 * Math::PI / 4, Math.acos(-1.0)) 141 assert_raise(Math::DomainError) { Math.acos(+1.1) } 142 assert_raise(Math::DomainError) { Math.acos(-1.1) } 143 end 144 145 assert('Math.asin') do 146 assert_float( 0 * Math::PI / 4, Math.asin( 0.0)) 147 assert_float( 1 * Math::PI / 4, Math.asin( 1.0 / Math.sqrt(2))) 148 assert_float( 2 * Math::PI / 4, Math.asin( 1.0)) 149 assert_float(-2 * Math::PI / 4, Math.asin(-1.0)) 150 assert_raise(Math::DomainError) { Math.asin(+1.1) } 151 assert_raise(Math::DomainError) { Math.asin(-1.1) } 152 assert_raise(Math::DomainError) { Math.asin(2.0) } 153 end 154 155 assert('Math.atan') do 156 assert_float( 0 * Math::PI / 4, Math.atan( 0.0)) 157 assert_float( 1 * Math::PI / 4, Math.atan( 1.0)) 158 assert_float( 2 * Math::PI / 4, Math.atan(1.0 / 0.0)) 159 assert_float(-1 * Math::PI / 4, Math.atan(-1.0)) 160 end 161 162 assert('Math.cosh') do 163 assert_float(1, Math.cosh(0)) 164 assert_float((Math::E ** 1 + Math::E ** -1) / 2, Math.cosh(1)) 165 assert_float((Math::E ** 2 + Math::E ** -2) / 2, Math.cosh(2)) 166 end 167 168 assert('Math.sinh') do 169 assert_float(0, Math.sinh(0)) 170 assert_float((Math::E ** 1 - Math::E ** -1) / 2, Math.sinh(1)) 171 assert_float((Math::E ** 2 - Math::E ** -2) / 2, Math.sinh(2)) 172 end 173 174 assert('Math.tanh') do 175 assert_float(Math.sinh(0) / Math.cosh(0), Math.tanh(0)) 176 assert_float(Math.sinh(1) / Math.cosh(1), Math.tanh(1)) 177 assert_float(Math.sinh(2) / Math.cosh(2), Math.tanh(2)) 178 assert_float(+1.0, Math.tanh(+1000.0)) 179 assert_float(-1.0, Math.tanh(-1000.0)) 180 end 181 182 assert('Math.acosh') do 183 assert_float(0, Math.acosh(1)) 184 assert_float(1, Math.acosh((Math::E ** 1 + Math::E ** -1) / 2)) 185 assert_float(2, Math.acosh((Math::E ** 2 + Math::E ** -2) / 2)) 186 assert_raise(Math::DomainError) { Math.acosh(0.9) } 187 assert_raise(Math::DomainError) { Math.acosh(0) } 188 end 189 190 assert('Math.asinh') do 191 assert_float(0, Math.asinh(0)) 192 assert_float(1, Math.asinh((Math::E ** 1 - Math::E ** -1) / 2)) 193 assert_float(2, Math.asinh((Math::E ** 2 - Math::E ** -2) / 2)) 194 end 195 196 assert('Math.atanh') do 197 assert_float(0, Math.atanh(Math.sinh(0) / Math.cosh(0))) 198 assert_float(1, Math.atanh(Math.sinh(1) / Math.cosh(1))) 199 assert_float(2, Math.atanh(Math.sinh(2) / Math.cosh(2))) 200 assert_float(Float::INFINITY, Math.atanh(1)) 201 assert_float(-Float::INFINITY, Math.atanh(-1)) 202 assert_raise(Math::DomainError) { Math.atanh(+1.1) } 203 assert_raise(Math::DomainError) { Math.atanh(-1.1) } 204 end 205 206 assert('Math.atan2') do 207 assert_float(+0.0, Math.atan2(+0.0, +0.0)) 208 assert_float(-0.0, Math.atan2(-0.0, +0.0)) 209 assert_float(+Math::PI, Math.atan2(+0.0, -0.0)) 210 assert_float(-Math::PI, Math.atan2(-0.0, -0.0)) 211 212 inf = Float::INFINITY 213 expected = 3.0 * Math::PI / 4.0 214 assert_float(+expected, Math.atan2(+inf, -inf)) 215 assert_float(-expected, Math.atan2(-inf, -inf)) 216 expected = Math::PI / 4.0 217 assert_float(+expected, Math.atan2(+inf, +inf)) 218 assert_float(-expected, Math.atan2(-inf, +inf)) 219 220 assert_float(0, Math.atan2(0, 1)) 221 assert_float(Math::PI / 4, Math.atan2(1, 1)) 222 assert_float(Math::PI / 2, Math.atan2(1, 0)) 223 end 224 225 assert('Math.ldexp') do 226 assert_float(0.0, Math.ldexp(0.0, 0.0)) 227 assert_float(0.5, Math.ldexp(0.5, 0.0)) 228 assert_float(1.0, Math.ldexp(0.5, 1.0)) 229 assert_float(2.0, Math.ldexp(0.5, 2.0)) 230 assert_float(3.0, Math.ldexp(0.75, 2.0)) 231 end 232 233 assert('Math.frexp') do 234 assert_float_and_int([0.0, 0], Math.frexp(0.0)) 235 assert_float_and_int([0.5, 0], Math.frexp(0.5)) 236 assert_float_and_int([0.5, 1], Math.frexp(1.0)) 237 assert_float_and_int([0.5, 2], Math.frexp(2.0)) 238 assert_float_and_int([0.75, 2], Math.frexp(3.0)) 239 end -
EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-numeric-ext/mrblib/numeric_ext.rb
r331 r439 1 module Integral 2 def div(other) 3 self.divmod(other)[0] 4 end 5 1 class Numeric 6 2 def zero? 7 3 self == 0 … … 15 11 end 16 12 end 13 14 def positive? 15 self > 0 16 end 17 18 def negative? 19 self < 0 20 end 17 21 end -
EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-numeric-ext/src/numeric_ext.c
r331 r439 1 1 #include <limits.h> 2 2 #include <mruby.h> 3 #include <mruby/numeric.h> 3 4 5 /* 6 * call-seq: 7 * int.allbits?(mask) -> true or false 8 * 9 * Returns +true+ if all bits of <code>+int+ & +mask+</code> are 1. 10 */ 4 11 static mrb_value 5 mrb_int_ chr(mrb_state *mrb, mrb_value x)12 mrb_int_allbits(mrb_state *mrb, mrb_value self) 6 13 { 7 mrb_int chr; 8 char c; 14 mrb_int n, m; 9 15 10 chr = mrb_fixnum(x); 11 if (chr >= (1 << CHAR_BIT)) { 12 mrb_raisef(mrb, E_RANGE_ERROR, "%S out of char range", x); 13 } 14 c = (char)chr; 16 mrb_get_args(mrb, "i", &m); 17 n = mrb_int(mrb, self); 18 return mrb_bool_value((n & m) == m); 19 } 15 20 16 return mrb_str_new(mrb, &c, 1); 21 /* 22 * call-seq: 23 * int.anybits?(mask) -> true or false 24 * 25 * Returns +true+ if any bits of <code>+int+ & +mask+</code> are 1. 26 */ 27 static mrb_value 28 mrb_int_anybits(mrb_state *mrb, mrb_value self) 29 { 30 mrb_int n, m; 31 32 mrb_get_args(mrb, "i", &m); 33 n = mrb_int(mrb, self); 34 return mrb_bool_value((n & m) != 0); 35 } 36 37 /* 38 * call-seq: 39 * int.nobits?(mask) -> true or false 40 * 41 * Returns +true+ if no bits of <code>+int+ & +mask+</code> are 1. 42 */ 43 static mrb_value 44 mrb_int_nobits(mrb_state *mrb, mrb_value self) 45 { 46 mrb_int n, m; 47 48 mrb_get_args(mrb, "i", &m); 49 n = mrb_int(mrb, self); 50 return mrb_bool_value((n & m) == 0); 17 51 } 18 52 … … 20 54 mrb_mruby_numeric_ext_gem_init(mrb_state* mrb) 21 55 { 22 struct RClass *i = mrb_ class_get(mrb, "Integer");56 struct RClass *i = mrb_module_get(mrb, "Integral"); 23 57 24 mrb_define_method(mrb, i, "chr", mrb_int_chr, MRB_ARGS_NONE()); 58 mrb_define_method(mrb, i, "allbits?", mrb_int_allbits, MRB_ARGS_REQ(1)); 59 mrb_define_method(mrb, i, "anybits?", mrb_int_anybits, MRB_ARGS_REQ(1)); 60 mrb_define_method(mrb, i, "nobits?", mrb_int_nobits, MRB_ARGS_REQ(1)); 61 62 #ifndef MRB_WITHOUT_FLOAT 63 mrb_define_const(mrb, mrb->float_class, "RADIX", mrb_fixnum_value(MRB_FLT_RADIX)); 64 mrb_define_const(mrb, mrb->float_class, "MANT_DIG", mrb_fixnum_value(MRB_FLT_MANT_DIG)); 65 mrb_define_const(mrb, mrb->float_class, "EPSILON", mrb_float_value(mrb, MRB_FLT_EPSILON)); 66 mrb_define_const(mrb, mrb->float_class, "DIG", mrb_fixnum_value(MRB_FLT_DIG)); 67 mrb_define_const(mrb, mrb->float_class, "MIN_EXP", mrb_fixnum_value(MRB_FLT_MIN_EXP)); 68 mrb_define_const(mrb, mrb->float_class, "MIN", mrb_float_value(mrb, MRB_FLT_MIN)); 69 mrb_define_const(mrb, mrb->float_class, "MIN_10_EXP", mrb_fixnum_value(MRB_FLT_MIN_10_EXP)); 70 mrb_define_const(mrb, mrb->float_class, "MAX_EXP", mrb_fixnum_value(MRB_FLT_MAX_EXP)); 71 mrb_define_const(mrb, mrb->float_class, "MAX", mrb_float_value(mrb, MRB_FLT_MAX)); 72 mrb_define_const(mrb, mrb->float_class, "MAX_10_EXP", mrb_fixnum_value(MRB_FLT_MAX_10_EXP)); 73 #endif /* MRB_WITHOUT_FLOAT */ 25 74 } 26 75 -
EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-numeric-ext/test/numeric.rb
r331 r439 1 1 ## 2 2 # Numeric(Ext) Test 3 4 assert('Integer#chr') do5 assert_equal("A", 65.chr)6 assert_equal("B", 0x42.chr)7 8 # multibyte encoding (not support yet)9 assert_raise(RangeError) { 256.chr }10 end11 3 12 4 assert('Integer#div') do … … 15 7 16 8 assert('Float#div') do 9 skip unless Object.const_defined?(:Float) 17 10 assert_float 52, 365.2425.div(7) 18 11 end -
EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-object-ext/mrbgem.rake
r321 r439 2 2 spec.license = 'MIT' 3 3 spec.author = 'mruby developers' 4 spec.summary = ' Object class extension'4 spec.summary = 'extensional methods shared by all objects' 5 5 end -
EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-object-ext/mrblib/object.rb
r321 r439 1 class Object 1 module Kernel 2 # call-seq: 3 # obj.yield_self {|_obj|...} -> an_object 4 # obj.then {|_obj|...} -> an_object 5 # 6 # Yields <i>obj</i> and returns the result. 7 # 8 # 'my string'.yield_self {|s|s.upcase} #=> "MY STRING" 9 # 10 def yield_self(&block) 11 return to_enum :yield_self unless block 12 block.call(self) 13 end 14 alias then yield_self 15 2 16 ## 3 17 # call-seq: -
EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-object-ext/src/object.c
r331 r439 2 2 #include <mruby/array.h> 3 3 #include <mruby/class.h> 4 #include <mruby/hash.h> 4 5 #include <mruby/proc.h> 5 6 … … 17 18 } 18 19 20 #ifndef MRB_WITHOUT_FLOAT 19 21 /* 20 22 * call-seq: … … 28 30 { 29 31 return mrb_float_value(mrb, 0.0); 32 } 33 #endif 34 35 /* 36 * call-seq: 37 * nil.to_h -> {} 38 * 39 * Always returns an empty hash. 40 */ 41 42 static mrb_value 43 nil_to_h(mrb_state *mrb, mrb_value obj) 44 { 45 return mrb_hash_new(mrb); 30 46 } 31 47 … … 41 57 { 42 58 return mrb_fixnum_value(0); 59 } 60 61 /* 62 * call-seq: 63 * obj.itself -> an_object 64 * 65 * Returns <i>obj</i>. 66 * 67 * string = 'my string' #=> "my string" 68 * string.itself.object_id == string.object_id #=> true 69 * 70 */ 71 static mrb_value 72 mrb_f_itself(mrb_state *mrb, mrb_value self) 73 { 74 return self; 43 75 } 44 76 … … 68 100 mrb_value blk; 69 101 struct RClass *c; 70 mrb_value args;71 102 72 mrb_get_args(mrb, "*&", &argv, &argc, &blk); 73 74 if (mrb_nil_p(blk)) { 75 mrb_raise(mrb, E_ARGUMENT_ERROR, "no block given"); 76 } 103 mrb_get_args(mrb, "*&!", &argv, &argc, &blk); 77 104 78 105 switch (mrb_type(self)) { 79 106 case MRB_TT_SYMBOL: 80 107 case MRB_TT_FIXNUM: 108 #ifndef MRB_WITHOUT_FLOAT 81 109 case MRB_TT_FLOAT: 110 #endif 82 111 c = NULL; 83 112 break; … … 86 115 break; 87 116 } 88 args = mrb_ary_new_from_values(mrb, argc, argv);89 argv = RARRAY_PTR(args);90 117 mrb->c->ci->target_class = c; 91 118 return mrb_yield_cont(mrb, blk, self, argc, argv); … … 98 125 99 126 mrb_define_method(mrb, n, "to_a", nil_to_a, MRB_ARGS_NONE()); 127 #ifndef MRB_WITHOUT_FLOAT 100 128 mrb_define_method(mrb, n, "to_f", nil_to_f, MRB_ARGS_NONE()); 129 #endif 130 mrb_define_method(mrb, n, "to_h", nil_to_h, MRB_ARGS_NONE()); 101 131 mrb_define_method(mrb, n, "to_i", nil_to_i, MRB_ARGS_NONE()); 102 132 103 mrb_define_method(mrb, mrb->kernel_module, "instance_exec", mrb_obj_instance_exec, MRB_ARGS_ANY() | MRB_ARGS_BLOCK()); 133 mrb_define_method(mrb, mrb->kernel_module, "itself", mrb_f_itself, MRB_ARGS_NONE()); 134 135 mrb_define_method(mrb, mrb_class_get(mrb, "BasicObject"), "instance_exec", mrb_obj_instance_exec, MRB_ARGS_ANY() | MRB_ARGS_BLOCK()); 104 136 } 105 137 -
EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-object-ext/test/nil.rb
r321 r439 4 4 5 5 assert('NilClass#to_f') do 6 skip unless Object.const_defined?(:Float) 6 7 assert_equal 0.0, nil.to_f 8 end 9 10 assert('NilClass#to_h') do 11 assert_equal Hash.new, nil.to_h 7 12 end 8 13 -
EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-objectspace/src/mruby_objectspace.c
r331 r439 58 58 } 59 59 60 if (!mrb_ test(mrb_hash_empty_p(mrb, hash))) {60 if (!mrb_hash_empty_p(mrb, hash)) { 61 61 mrb_hash_clear(mrb, hash); 62 62 } … … 162 162 mrb_value cls = mrb_nil_value(); 163 163 struct os_each_object_data d; 164 mrb_get_args(mrb, "&|C", &d.block, &cls); 165 166 if (mrb_nil_p(d.block)) { 167 mrb_raise(mrb, E_ARGUMENT_ERROR, "Expected block in ObjectSpace.each_object."); 168 } 164 mrb_get_args(mrb, "&!|C", &d.block, &cls); 169 165 170 166 d.target_module = mrb_nil_p(cls) ? NULL : mrb_class_ptr(cls); -
EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-objectspace/test/objectspace.rb
r321 r439 1 1 assert('ObjectSpace.count_objects') do 2 2 h = {} 3 f = Fiber.new {} if Object.const_defined? :Fiber3 f = Fiber.new {} if Object.const_defined?(:Fiber) 4 4 ObjectSpace.count_objects(h) 5 5 assert_kind_of(Hash, h) … … 32 32 objs << {} 33 33 end 34 ObjectSpace.count_objects(h) 34 35 objs = nil 35 ObjectSpace.count_objects(h)36 36 GC.start 37 37 ObjectSpace.count_objects(h_after) … … 57 57 58 58 assert 'Check class pointer of ObjectSpace.each_object.' do 59 ObjectSpace.each_object { |obj| !obj}59 assert_nothing_raised { ObjectSpace.each_object { |obj| !obj } } 60 60 end -
EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-print/mrblib/print.rb
r321 r439 46 46 i += 1 47 47 end 48 args [0]48 args.__svalue 49 49 end 50 50 51 unless Kernel.respond_to?(:sprintf) 52 def printf(*args) 53 raise NotImplementedError.new('printf not available') 54 end 55 def sprintf(*args) 56 raise NotImplementedError.new('sprintf not available') 57 end 58 else 59 def printf(*args) 60 __printstr__(sprintf(*args)) 61 nil 62 end 51 def printf(*args) 52 __printstr__(sprintf(*args)) 53 nil 63 54 end 64 55 end -
EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-print/src/print.c
r331 r439 1 1 #include <mruby.h> 2 3 #ifdef MRB_DISABLE_STDIO 4 # error print conflicts 'MRB_DISABLE_STDIO' configuration in your 'build_config.rb' 5 #endif 6 2 7 #include <mruby/string.h> 3 #include <stdio.h>4 8 #include <string.h> 5 9 #include <stdlib.h> … … 20 24 if (isatty(fileno(stdout))) { 21 25 DWORD written; 22 int mlen = RSTRING_LEN(obj);26 int mlen = (int)RSTRING_LEN(obj); 23 27 char* utf8 = RSTRING_PTR(obj); 24 28 int wlen = MultiByteToWideChar(CP_UTF8, 0, utf8, mlen, NULL, 0); 25 29 wchar_t* utf16 = (wchar_t*)mrb_malloc(mrb, (wlen+1) * sizeof(wchar_t)); 26 if (utf16 == NULL) return;27 30 if (MultiByteToWideChar(CP_UTF8, 0, utf8, mlen, utf16, wlen) > 0) { 28 31 utf16[wlen] = 0; … … 34 37 #endif 35 38 fwrite(RSTRING_PTR(obj), RSTRING_LEN(obj), 1, stdout); 39 fflush(stdout); 36 40 } 37 41 } -
EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-proc-ext/mrblib/proc.rb
r321 r439 28 28 pproc = self 29 29 make_curry = proc do |given_args=[]| 30 send(type) do |*args|30 __send__(type) do |*args| 31 31 new_args = given_args + args 32 32 if new_args.size >= arity … … 40 40 end 41 41 42 def <<(other) 43 ->(*args, &block) { call(other.call(*args, &block)) } 44 end 45 46 def >>(other) 47 ->(*args, &block) { other.call(call(*args, &block)) } 48 end 49 42 50 end -
EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-proc-ext/src/proc.c
r331 r439 26 26 const char *filename; 27 27 28 filename = mrb_debug_get_filename( irep, 0);29 line = mrb_debug_get_line( irep, 0);28 filename = mrb_debug_get_filename(mrb, irep, 0); 29 line = mrb_debug_get_line(mrb, irep, 0); 30 30 31 31 return (!filename && line == -1)? mrb_nil_value() … … 39 39 struct RProc *p = mrb_proc_ptr(self); 40 40 mrb_value str = mrb_str_new_lit(mrb, "#<Proc:"); 41 mrb_str_c oncat(mrb, str, mrb_ptr_to_str(mrb, mrb_cptr(self)));41 mrb_str_cat_str(mrb, str, mrb_ptr_to_str(mrb, mrb_cptr(self))); 42 42 43 43 if (!MRB_PROC_CFUNC_P(p)) { … … 47 47 mrb_str_cat_lit(mrb, str, "@"); 48 48 49 filename = mrb_debug_get_filename( irep, 0);49 filename = mrb_debug_get_filename(mrb, irep, 0); 50 50 mrb_str_cat_cstr(mrb, str, filename ? filename : "-"); 51 51 mrb_str_cat_lit(mrb, str, ":"); 52 52 53 line = mrb_debug_get_line( irep, 0);53 line = mrb_debug_get_line(mrb, irep, 0); 54 54 if (line != -1) { 55 str = mrb_format(mrb, "%S:%S", str, mrb_fixnum_value(line));55 mrb_str_concat(mrb, str, mrb_fixnum_value(line)); 56 56 } 57 57 else { … … 73 73 mrb_value blk; 74 74 75 mrb_get_args(mrb, "&", &blk); 76 if (mrb_nil_p(blk)) { 77 mrb_raise(mrb, E_ARGUMENT_ERROR, "tried to create Proc object without a block"); 78 } 75 mrb_get_args(mrb, "&!", &blk); 79 76 80 77 return blk; … … 95 92 { 96 93 struct parameters_type { 94 size_t len; 95 const char *name; 97 96 int size; 98 const char *name;99 97 } *p, parameters_list [] = { 100 { 0, "req"},101 { 0, "opt"},102 { 0, "rest"},103 { 0, "req"},104 { 0, "block"},105 {0, NULL }98 {sizeof("req") - 1, "req", 0}, 99 {sizeof("opt") - 1, "opt", 0}, 100 {sizeof("rest") - 1, "rest", 0}, 101 {sizeof("req") - 1, "req", 0}, 102 {sizeof("block") - 1, "block", 0}, 103 {0, NULL, 0} 106 104 }; 107 105 const struct RProc *proc = mrb_proc_ptr(self); 108 106 const struct mrb_irep *irep = proc->body.irep; 109 107 mrb_aspec aspec; 110 mrb_value sname,parameters;108 mrb_value parameters; 111 109 int i, j; 110 int max = -1; 112 111 113 112 if (MRB_PROC_CFUNC_P(proc)) { … … 121 120 return mrb_ary_new(mrb); 122 121 } 123 if ( GET_OPCODE(*irep->iseq)!= OP_ENTER) {122 if (*irep->iseq != OP_ENTER) { 124 123 return mrb_ary_new(mrb); 125 124 } 126 125 127 126 if (!MRB_PROC_STRICT_P(proc)) { 127 parameters_list[0].len = sizeof("opt") - 1; 128 128 parameters_list[0].name = "opt"; 129 parameters_list[3].len = sizeof("opt") - 1; 129 130 parameters_list[3].name = "opt"; 130 131 } 131 132 132 aspec = GETARG_Ax(*irep->iseq);133 aspec = PEEK_W(irep->iseq+1); 133 134 parameters_list[0].size = MRB_ASPEC_REQ(aspec); 134 135 parameters_list[1].size = MRB_ASPEC_OPT(aspec); … … 139 140 parameters = mrb_ary_new_capa(mrb, irep->nlocals-1); 140 141 142 max = irep->nlocals-1; 141 143 for (i = 0, p = parameters_list; p->name; p++) { 142 if (p->size <= 0) continue;143 sname = mrb_symbol_value(mrb_intern_cstr(mrb, p->name)); 144 mrb_value sname = mrb_symbol_value(mrb_intern_static(mrb, p->name, p->len)); 145 144 146 for (j = 0; j < p->size; i++, j++) { 145 mrb_value a = mrb_ary_new(mrb); 147 mrb_value a; 148 149 a = mrb_ary_new(mrb); 146 150 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)); 151 if (i < max && irep->lv[i].name) { 152 mrb_sym sym = irep->lv[i].name; 153 const char *name = mrb_sym_name(mrb, sym); 154 switch (name[0]) { 155 case '*': case '&': 156 break; 157 default: 158 mrb_ary_push(mrb, a, mrb_symbol_value(sym)); 159 break; 160 } 149 161 } 150 162 mrb_ary_push(mrb, parameters, a); … … 164 176 mrb_define_method(mrb, p, "parameters", mrb_proc_parameters, MRB_ARGS_NONE()); 165 177 166 mrb_define_class_method(mrb, mrb->kernel_module, "proc", mrb_kernel_proc, MRB_ARGS_NONE() );167 mrb_define_method(mrb, mrb->kernel_module, "proc", mrb_kernel_proc, MRB_ARGS_NONE() );178 mrb_define_class_method(mrb, mrb->kernel_module, "proc", mrb_kernel_proc, MRB_ARGS_NONE()|MRB_ARGS_BLOCK()); 179 mrb_define_method(mrb, mrb->kernel_module, "proc", mrb_kernel_proc, MRB_ARGS_NONE()|MRB_ARGS_BLOCK()); 168 180 } 169 181 -
EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-proc-ext/test/proc.c
r331 r439 14 14 mrb_sym n; 15 15 mrb_value n_val; 16 mrb_method_t m; 17 struct RProc *p; 16 18 mrb_get_args(mrb, "n", &n); 17 19 n_val = mrb_symbol_value(n); 18 mrb_define_method_raw(mrb, mrb_class_ptr(self), n, 19 mrb_proc_new_cfunc_with_env(mrb, return_func_name, 1, &n_val)); 20 p = mrb_proc_new_cfunc_with_env(mrb, return_func_name, 1, &n_val); 21 MRB_METHOD_FROM_PROC(m, p); 22 mrb_define_method_raw(mrb, mrb_class_ptr(self), n, m); 20 23 return self; 21 24 } … … 34 37 mrb_sym n; 35 38 mrb_value *argv; mrb_int argc; 39 mrb_method_t m; 40 struct RProc *p; 36 41 mrb_get_args(mrb, "na", &n, &argv, &argc); 37 mrb_define_method_raw(mrb, mrb_class_ptr(self), n, 38 mrb_proc_new_cfunc_with_env(mrb, return_env, argc, argv)); 42 p = mrb_proc_new_cfunc_with_env(mrb, return_env, argc, argv); 43 MRB_METHOD_FROM_PROC(m, p); 44 mrb_define_method_raw(mrb, mrb_class_ptr(self), n, m); 39 45 return self; 40 46 } -
EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-proc-ext/test/proc.rb
r331 r439 2 2 # Proc(Ext) Test 3 3 4 def enable_debug_info? 5 return @enable_debug_info unless @enable_debug_info == nil 6 begin 7 raise 8 rescue => e 9 @enable_debug_info = !e.backtrace.empty? 10 end 11 end 12 4 13 assert('Proc#source_location') do 5 loc = Proc.new {}.source_location6 next true if loc.nil?7 assert_equal loc[0][-7, 7], 'proc.rb'8 assert_equal loc[1], 514 skip unless enable_debug_info? 15 file, line = Proc.new{}.source_location 16 assert_equal __FILE__, file 17 assert_equal __LINE__ - 2, line 9 18 end 10 19 11 20 assert('Proc#inspect') do 12 21 ins = Proc.new{}.inspect 13 assert_kind_of String, ins 22 if enable_debug_info? 23 metas = %w(\\ * ? [ ] { }) 24 file = __FILE__.split("").map{|c| metas.include?(c) ? "\\#{c}" : c}.join 25 line = __LINE__ - 4 26 else 27 file = line = "-" 28 end 29 assert_match "#<Proc:0x*@#{file}:#{line}>", ins 30 end 31 32 assert('Proc#parameters') do 33 parameters = Proc.new{|x,y=42,*other|}.parameters 34 assert_equal [[:opt, :x], [:opt, :y], [:rest, :other]], parameters 14 35 end 15 36 … … 67 88 assert('Kernel#proc') do 68 89 assert_true !proc{|a|}.lambda? 90 91 assert_raise LocalJumpError do 92 proc{ break }.call 93 end 94 end 95 96 assert "Proc#<< and Proc#>>" do 97 add3 = ->(n) { n + 3 } 98 mul2 = ->(n) { n * 2 } 99 100 f1 = mul2 << add3 101 assert_kind_of Proc, f1 102 assert_equal 16, f1.call(5) 103 104 f2 = mul2 >> add3 105 assert_kind_of Proc, f2 106 assert_equal 13, f2.call(5) 69 107 end 70 108 -
EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-random/src/random.c
r331 r439 10 10 #include <mruby/data.h> 11 11 #include <mruby/array.h> 12 #include "mt19937ar.h" 12 #include <mruby/istruct.h> 13 #if INT32_MAX <= INTPTR_MAX 14 # define XORSHIFT96 15 # define NSEEDS 3 16 #else 17 # define NSEEDS 4 18 #endif 19 #define LASTSEED (NSEEDS-1) 13 20 14 21 #include <time.h> 15 22 16 static char const MT_STATE_KEY[] = "$mrb_i_mt_state"; 17 18 static const struct mrb_data_type mt_state_type = { 19 MT_STATE_KEY, mrb_free, 20 }; 21 22 static mrb_value mrb_random_rand(mrb_state *mrb, mrb_value self); 23 static mrb_value mrb_random_srand(mrb_state *mrb, mrb_value self); 23 typedef struct rand_state { 24 uint32_t seed[NSEEDS]; 25 } rand_state; 24 26 25 27 static void 26 mt_srand(mt_state *t, unsigned long seed) 27 { 28 mrb_random_init_genrand(t, seed); 29 } 30 31 static unsigned long 32 mt_rand(mt_state *t) 33 { 34 return mrb_random_genrand_int32(t); 35 } 36 28 rand_init(rand_state *t) 29 { 30 t->seed[0] = 123456789; 31 t->seed[1] = 362436069; 32 t->seed[2] = 521288629; 33 #ifndef XORSHIFT96 34 t->seed[3] = 88675123; 35 #endif 36 } 37 38 static uint32_t 39 rand_seed(rand_state *t, uint32_t seed) 40 { 41 uint32_t old_seed = t->seed[LASTSEED]; 42 rand_init(t); 43 t->seed[LASTSEED] = seed; 44 return old_seed; 45 } 46 47 #ifdef XORSHIFT96 48 static uint32_t 49 rand_uint32(rand_state *state) 50 { 51 uint32_t *seed = state->seed; 52 uint32_t x = seed[0]; 53 uint32_t y = seed[1]; 54 uint32_t z = seed[2]; 55 uint32_t t; 56 57 t = (x ^ (x << 3)) ^ (y ^ (y >> 19)) ^ (z ^ (z << 6)); 58 x = y; y = z; z = t; 59 seed[0] = x; 60 seed[1] = y; 61 seed[2] = z; 62 63 return z; 64 } 65 #else /* XORSHIFT96 */ 66 static uint32_t 67 rand_uint32(rand_state *state) 68 { 69 uint32_t *seed = state->seed; 70 uint32_t x = seed[0]; 71 uint32_t y = seed[1]; 72 uint32_t z = seed[2]; 73 uint32_t w = seed[3]; 74 uint32_t t; 75 76 t = x ^ (x << 11); 77 x = y; y = z; z = w; 78 w = (w ^ (w >> 19)) ^ (t ^ (t >> 8)); 79 seed[0] = x; 80 seed[1] = y; 81 seed[2] = z; 82 seed[3] = w; 83 84 return w; 85 } 86 #endif /* XORSHIFT96 */ 87 88 #ifndef MRB_WITHOUT_FLOAT 37 89 static double 38 mt_rand_real(mt_state *t) 39 { 40 return mrb_random_genrand_real1(t); 41 } 42 43 static mrb_value 44 mrb_random_mt_srand(mrb_state *mrb, mt_state *t, mrb_value seed) 45 { 46 if (mrb_nil_p(seed)) { 47 seed = mrb_fixnum_value((mrb_int)(time(NULL) + mt_rand(t))); 48 if (mrb_fixnum(seed) < 0) { 49 seed = mrb_fixnum_value(0 - mrb_fixnum(seed)); 50 } 51 } 52 53 mt_srand(t, (unsigned) mrb_fixnum(seed)); 54 55 return seed; 56 } 57 58 static mrb_value 59 mrb_random_mt_rand(mrb_state *mrb, mt_state *t, mrb_value max) 90 rand_real(rand_state *t) 91 { 92 uint32_t x = rand_uint32(t); 93 return x*(1.0/4294967295.0); 94 } 95 #endif 96 97 static mrb_value 98 random_rand(mrb_state *mrb, rand_state *t, mrb_value max) 60 99 { 61 100 mrb_value value; 62 101 63 102 if (mrb_fixnum(max) == 0) { 64 value = mrb_float_value(mrb, mt_rand_real(t)); 65 } 66 else { 67 value = mrb_fixnum_value(mt_rand(t) % mrb_fixnum(max)); 103 #ifndef MRB_WITHOUT_FLOAT 104 value = mrb_float_value(mrb, rand_real(t)); 105 #else 106 mrb_raise(mrb, E_ARGUMENT_ERROR, "Float not supported"); 107 #endif 108 } 109 else { 110 value = mrb_fixnum_value(rand_uint32(t) % mrb_fixnum(max)); 68 111 } 69 112 … … 80 123 81 124 if (!mrb_nil_p(arg)) { 82 arg = mrb_check_convert_type(mrb, arg, MRB_TT_FIXNUM, "Fixnum", "to_int");83 if (mrb_nil_p(arg)) { 84 mrb_raise(mrb, E_ARGUMENT_ERROR, "invalid argument type");85 }86 if ( mrb_fixnum(arg)< 0) {87 arg = mrb_fixnum_value(0 - mrb_fixnum(arg));125 mrb_int i; 126 127 arg = mrb_to_int(mrb, arg); 128 i = mrb_fixnum(arg); 129 if (i < 0) { 130 arg = mrb_fixnum_value(0 - i); 88 131 } 89 132 } … … 91 134 } 92 135 93 static mrb_value 94 get_random(mrb_state *mrb) { 95 return mrb_const_get(mrb, 96 mrb_obj_value(mrb_class_get(mrb, "Random")), 97 mrb_intern_lit(mrb, "DEFAULT")); 98 } 99 100 static mt_state * 101 get_random_state(mrb_state *mrb) 102 { 103 mrb_value random_val = get_random(mrb); 104 return DATA_GET_PTR(mrb, random_val, &mt_state_type, mt_state); 105 } 106 107 static mrb_value 108 mrb_random_g_rand(mrb_state *mrb, mrb_value self) 109 { 110 mrb_value random = get_random(mrb); 111 return mrb_random_rand(mrb, random); 112 } 113 114 static mrb_value 115 mrb_random_g_srand(mrb_state *mrb, mrb_value self) 116 { 117 mrb_value random = get_random(mrb); 118 return mrb_random_srand(mrb, random); 119 } 120 121 static mrb_value 122 mrb_random_init(mrb_state *mrb, mrb_value self) 136 static void 137 random_check(mrb_state *mrb, mrb_value random) { 138 struct RClass *c = mrb_class_get(mrb, "Random"); 139 if (!mrb_obj_is_kind_of(mrb, random, c) || !mrb_istruct_p(random)) { 140 mrb_raise(mrb, E_TYPE_ERROR, "Random instance required"); 141 } 142 } 143 144 static mrb_value 145 random_default(mrb_state *mrb) { 146 struct RClass *c = mrb_class_get(mrb, "Random"); 147 mrb_value d = mrb_const_get(mrb, mrb_obj_value(c), mrb_intern_lit(mrb, "DEFAULT")); 148 if (!mrb_obj_is_kind_of(mrb, d, c)) { 149 mrb_raise(mrb, E_TYPE_ERROR, "Random::DEFAULT replaced"); 150 } 151 return d; 152 } 153 154 #define random_ptr(v) (rand_state*)mrb_istruct_ptr(v) 155 #define random_default_state(mrb) random_ptr(random_default(mrb)) 156 157 static mrb_value 158 random_m_init(mrb_state *mrb, mrb_value self) 123 159 { 124 160 mrb_value seed; 125 mt_state *t;161 rand_state *t; 126 162 127 163 seed = get_opt(mrb); 128 129 164 /* avoid memory leaks */ 130 t = (mt_state*)DATA_PTR(self); 131 if (t) { 132 mrb_free(mrb, t); 133 } 134 mrb_data_init(self, NULL, &mt_state_type); 135 136 t = (mt_state *)mrb_malloc(mrb, sizeof(mt_state)); 137 t->mti = N + 1; 138 139 seed = mrb_random_mt_srand(mrb, t, seed); 165 t = random_ptr(self); 140 166 if (mrb_nil_p(seed)) { 141 t->has_seed = FALSE; 142 } 143 else { 144 mrb_assert(mrb_fixnum_p(seed)); 145 t->has_seed = TRUE; 146 t->seed = mrb_fixnum(seed); 147 } 148 149 mrb_data_init(self, t, &mt_state_type); 167 rand_init(t); 168 } 169 else { 170 rand_seed(t, (uint32_t)mrb_fixnum(seed)); 171 } 150 172 151 173 return self; 152 174 } 153 175 154 static void 155 mrb_random_rand_seed(mrb_state *mrb, mt_state *t) 156 { 157 if (!t->has_seed) { 158 mrb_random_mt_srand(mrb, t, mrb_nil_value()); 159 } 160 } 161 162 static mrb_value 163 mrb_random_rand(mrb_state *mrb, mrb_value self) 176 static mrb_value 177 random_m_rand(mrb_state *mrb, mrb_value self) 164 178 { 165 179 mrb_value max; 166 mt_state *t = DATA_GET_PTR(mrb, self, &mt_state_type, mt_state);180 rand_state *t = random_ptr(self); 167 181 168 182 max = get_opt(mrb); 169 mrb_random_rand_seed(mrb, t); 170 return mrb_random_mt_rand(mrb, t, max); 171 } 172 173 static mrb_value 174 mrb_random_srand(mrb_state *mrb, mrb_value self) 175 { 176 mrb_value seed; 177 mrb_value old_seed; 178 mt_state *t = DATA_GET_PTR(mrb, self, &mt_state_type, mt_state); 179 180 seed = get_opt(mrb); 181 seed = mrb_random_mt_srand(mrb, t, seed); 182 old_seed = t->has_seed? mrb_fixnum_value(t->seed) : mrb_nil_value(); 183 if (mrb_nil_p(seed)) { 184 t->has_seed = FALSE; 185 } 186 else { 187 mrb_assert(mrb_fixnum_p(seed)); 188 t->has_seed = TRUE; 189 t->seed = mrb_fixnum(seed); 190 } 191 192 return old_seed; 183 return random_rand(mrb, t, max); 184 } 185 186 static mrb_value 187 random_m_srand(mrb_state *mrb, mrb_value self) 188 { 189 uint32_t seed; 190 uint32_t old_seed; 191 mrb_value sv; 192 rand_state *t = random_ptr(self); 193 194 sv = get_opt(mrb); 195 if (mrb_nil_p(sv)) { 196 seed = (uint32_t)time(NULL) + rand_uint32(t); 197 } 198 else { 199 seed = (uint32_t)mrb_fixnum(sv); 200 } 201 old_seed = rand_seed(t, seed); 202 203 return mrb_fixnum_value((mrb_int)old_seed); 193 204 } 194 205 … … 204 215 { 205 216 mrb_int i; 206 mt_state *random = NULL; 217 mrb_value max; 218 mrb_value r = mrb_nil_value(); 219 rand_state *random; 207 220 208 221 if (RARRAY_LEN(ary) > 1) { 209 mrb_get_args(mrb, "|d", &random, &mt_state_type); 210 211 if (random == NULL) { 212 random = get_random_state(mrb); 213 } 214 mrb_random_rand_seed(mrb, random); 215 222 mrb_get_args(mrb, "|o", &r); 223 224 if (mrb_nil_p(r)) { 225 random = random_default_state(mrb); 226 } 227 else { 228 random_check(mrb, r); 229 random = random_ptr(r); 230 } 216 231 mrb_ary_modify(mrb, mrb_ary_ptr(ary)); 217 232 max = mrb_fixnum_value(RARRAY_LEN(ary)); 218 233 for (i = RARRAY_LEN(ary) - 1; i > 0; i--) { 219 234 mrb_int j; 235 mrb_value *ptr = RARRAY_PTR(ary); 220 236 mrb_value tmp; 221 237 222 j = mrb_fixnum( mrb_random_mt_rand(mrb, random, mrb_fixnum_value(RARRAY_LEN(ary))));223 224 tmp = RARRAY_PTR(ary)[i];225 mrb_ary_ptr(ary)->ptr[i] = RARRAY_PTR(ary)[j];226 mrb_ary_ptr(ary)->ptr[j] = tmp;238 j = mrb_fixnum(random_rand(mrb, random, max)); 239 240 tmp = ptr[i]; 241 ptr[i] = ptr[j]; 242 ptr[j] = tmp; 227 243 } 228 244 } … … 267 283 mrb_int n = 0; 268 284 mrb_bool given; 269 mt_state *random = NULL; 285 mrb_value r = mrb_nil_value(); 286 rand_state *random; 270 287 mrb_int len; 271 288 272 mrb_get_args(mrb, "|i?d", &n, &given, &random, &mt_state_type); 273 if (random == NULL) { 274 random = get_random_state(mrb); 275 } 276 mrb_random_rand_seed(mrb, random); 277 mt_rand(random); 289 mrb_get_args(mrb, "|i?o", &n, &given, &r); 290 if (mrb_nil_p(r)) { 291 random = random_default_state(mrb); 292 } 293 else { 294 random_check(mrb, r); 295 random = random_ptr(r); 296 } 278 297 len = RARRAY_LEN(ary); 279 298 if (!given) { /* pick one element */ … … 284 303 return RARRAY_PTR(ary)[0]; 285 304 default: 286 return RARRAY_PTR(ary)[ mt_rand(random) % len];305 return RARRAY_PTR(ary)[rand_uint32(random) % len]; 287 306 } 288 307 } … … 299 318 for (;;) { 300 319 retry: 301 r = mt_rand(random) % len;320 r = (mrb_int)(rand_uint32(random) % len); 302 321 303 322 for (j=0; j<i; j++) { … … 317 336 } 318 337 338 static mrb_value 339 random_f_rand(mrb_state *mrb, mrb_value self) 340 { 341 rand_state *t = random_default_state(mrb); 342 return random_rand(mrb, t, get_opt(mrb)); 343 } 344 345 static mrb_value 346 random_f_srand(mrb_state *mrb, mrb_value self) 347 { 348 mrb_value random = random_default(mrb); 349 return random_m_srand(mrb, random); 350 } 351 319 352 320 353 void mrb_mruby_random_gem_init(mrb_state *mrb) … … 323 356 struct RClass *array = mrb->array_class; 324 357 325 mrb_define_method(mrb, mrb->kernel_module, "rand", mrb_random_g_rand, MRB_ARGS_OPT(1)); 326 mrb_define_method(mrb, mrb->kernel_module, "srand", mrb_random_g_srand, MRB_ARGS_OPT(1)); 358 mrb_assert(sizeof(rand_state) <= ISTRUCT_DATA_SIZE); 359 360 mrb_define_method(mrb, mrb->kernel_module, "rand", random_f_rand, MRB_ARGS_OPT(1)); 361 mrb_define_method(mrb, mrb->kernel_module, "srand", random_f_srand, MRB_ARGS_OPT(1)); 327 362 328 363 random = mrb_define_class(mrb, "Random", mrb->object_class); 329 MRB_SET_INSTANCE_TT(random, MRB_TT_ DATA);330 mrb_define_class_method(mrb, random, "rand", mrb_random_g_rand, MRB_ARGS_OPT(1));331 mrb_define_class_method(mrb, random, "srand", mrb_random_g_srand, MRB_ARGS_OPT(1));332 333 mrb_define_method(mrb, random, "initialize", mrb_random_init, MRB_ARGS_OPT(1));334 mrb_define_method(mrb, random, "rand", mrb_random_rand, MRB_ARGS_OPT(1));335 mrb_define_method(mrb, random, "srand", mrb_random_srand, MRB_ARGS_OPT(1));364 MRB_SET_INSTANCE_TT(random, MRB_TT_ISTRUCT); 365 mrb_define_class_method(mrb, random, "rand", random_f_rand, MRB_ARGS_OPT(1)); 366 mrb_define_class_method(mrb, random, "srand", random_f_srand, MRB_ARGS_OPT(1)); 367 368 mrb_define_method(mrb, random, "initialize", random_m_init, MRB_ARGS_OPT(1)); 369 mrb_define_method(mrb, random, "rand", random_m_rand, MRB_ARGS_OPT(1)); 370 mrb_define_method(mrb, random, "srand", random_m_srand, MRB_ARGS_OPT(1)); 336 371 337 372 mrb_define_method(mrb, array, "shuffle", mrb_ary_shuffle, MRB_ARGS_OPT(1)); -
EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-random/test/random.rb
r331 r439 2 2 # Random Test 3 3 4 assert("Random #srand") do4 assert("Random.new") do 5 5 r1 = Random.new(123) 6 6 r2 = Random.new(123) 7 r1.rand == r2.rand 7 r3 = Random.new(124) 8 assert_equal(r1.rand, r2.rand) 9 assert_not_equal(r1.rand, r3.rand) 8 10 end 9 11 10 assert("Kernel ::srand") do12 assert("Kernel.srand") do 11 13 srand(234) 12 14 r1 = rand 13 15 srand(234) 14 16 r2 = rand 15 r1 == r2 17 srand(235) 18 r3 = rand 19 assert_equal(r1, r2) 20 assert_not_equal(r1, r3) 16 21 end 17 22 18 assert("Random ::srand") do23 assert("Random.srand") do 19 24 Random.srand(345) 20 25 r1 = rand 21 26 srand(345) 22 27 r2 = Random.rand 23 r1 == r2 28 Random.srand(346) 29 r3 = rand 30 assert_equal(r1, r2) 31 assert_not_equal(r1, r3) 24 32 end 25 33 26 assert("fixnum") do 27 rand(3).class == Fixnum 28 end 29 30 assert("float") do 31 rand.class == Float 34 assert("return class of Kernel.rand") do 35 assert_kind_of(Fixnum, rand(3)) 36 assert_kind_of(Fixnum, rand(1.5)) 37 assert_kind_of(Float, rand) 38 assert_kind_of(Float, rand(0.5)) 32 39 end 33 40 34 41 assert("Array#shuffle") do 35 ary = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 42 orig = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 43 ary = orig.dup 36 44 shuffled = ary.shuffle 37 38 ary == [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] and shuffled != ary and 10.times { |x| ary.include? x } 45 assert_equal(orig, ary) 46 assert_not_equal(ary, shuffled) 47 assert_equal(orig, shuffled.sort) 39 48 end 40 49 41 50 assert('Array#shuffle!') do 42 ary = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 43 ary.shuffle! 44 45 ary != [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] and 10.times { |x| ary.include? x } 51 orig = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 52 ary = orig.dup 53 assert_same(ary, ary.shuffle!) 54 assert_not_equal(orig, ary) 55 assert_equal(orig, ary.sort) 46 56 end 47 57 … … 53 63 54 64 # verify that the same seed causes the same results 55 ary 1= [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]56 shuffle 1 = ary1.shuffle Random.new 34557 ary2 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]58 shuffle 2 = ary2.shuffle Random.new 34559 60 a ry1 != shuffle1 and 10.times { |x| shuffle1.include? x } and shuffle1 == shuffle265 ary = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 66 shuffled1 = ary.shuffle Random.new 345 67 shuffled2 = ary.shuffle Random.new 345 68 shuffled3 = ary.shuffle Random.new 346 69 assert_equal(shuffled1, shuffled2) 70 assert_not_equal(shuffled1, shuffled3) 61 71 end 62 72 … … 72 82 ary2 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 73 83 ary2.shuffle! Random.new 345 74 75 ary1 != [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] and 10.times { |x| ary1.include? x } and ary1 == ary2 84 ary3 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 85 ary3.shuffle! Random.new 346 86 assert_equal(ary1, ary2) 87 assert_not_equal(ary1, ary3) 76 88 end 77 89 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 90 assert('Array#sample') do 91 100.times do 92 assert_include([0, 1, 2], [2, 1, 0].sample) 93 [2, 1, 0].sample(2).each { |sample| assert_include([0, 1, 2], sample) } 94 h = {} 95 (1..10).to_a.sample(7).each do |sample| 96 assert_not_include(h, sample) 97 h[sample] = true 84 98 end 85 99 end 86 100 87 assert_equal [1, 2, 3, 4], $ary.sample(ArrayChange.new).sort 101 assert_nil([].sample) 102 assert_equal([], [].sample(1)) 103 assert_equal([], [2, 1].sample(0)) 104 assert_raise(TypeError) { [2, 1].sample(true) } 105 assert_raise(ArgumentError) { [2, 1].sample(-1) } 88 106 end 107 108 assert('Array#sample(random)') do 109 assert_raise(TypeError) do 110 # this will cause an exception due to the wrong argument 111 [1, 2].sample(2, "Not a Random instance") 112 end 113 114 # verify that the same seed causes the same results 115 ary = (1..10).to_a 116 srand(15) 117 samples1 = ary.sample(4) 118 samples2 = ary.sample(4, Random.new(15)) 119 samples3 = ary.sample(4, Random.new(16)) 120 assert_equal(samples1, samples2) 121 assert_not_equal(samples1, samples3) 122 end -
EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-range-ext/mrblib/range.rb
r331 r439 16 16 raise ArgumentError, "wrong number of arguments (given #{args.length}, expected 1)" unless args.length == 1 17 17 nv = args[0] 18 raise TypeError, "no implicit conversion from nil to integer" if nv.nil? 19 raise TypeError, "no implicit conversion of #{nv.class} into Integer" unless nv.respond_to?(:to_int) 20 n = nv.to_int 21 raise TypeError, "no implicit conversion of #{nv.class} into Integer" unless n.kind_of?(Integer) 18 n = nv.__to_int 22 19 raise ArgumentError, "negative array size (or size too big)" unless 0 <= n 23 20 ary = [] … … 29 26 ary 30 27 end 28 29 def max(&block) 30 val = self.first 31 last = self.last 32 return super if block 33 34 # fast path for numerics 35 if val.kind_of?(Numeric) && last.kind_of?(Numeric) 36 raise TypeError if exclude_end? && !last.kind_of?(Fixnum) 37 return nil if val > last 38 return nil if val == last && exclude_end? 39 40 max = last 41 max -= 1 if exclude_end? 42 return max 43 end 44 45 # delegate to Enumerable 46 super 47 end 48 49 def min(&block) 50 val = self.first 51 last = self.last 52 return super if block 53 54 # fast path for numerics 55 if val.kind_of?(Numeric) && last.kind_of?(Numeric) 56 return nil if val > last 57 return nil if val == last && exclude_end? 58 59 min = val 60 return min 61 end 62 63 # delegate to Enumerable 64 super 65 end 31 66 end -
EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-range-ext/src/range.c
r331 r439 2 2 #include <mruby/range.h> 3 3 #include <math.h> 4 #include <float.h>5 4 6 5 static mrb_bool 7 6 r_le(mrb_state *mrb, mrb_value a, mrb_value b) 8 7 { 9 mrb_value r = mrb_funcall(mrb, a, "<=>", 1, b); /* compare result */ 10 /* output :a < b => -1, a = b => 0, a > b => +1 */ 8 mrb_int n = mrb_cmp(mrb, a, b); 11 9 12 if (mrb_fixnum_p(r)) { 13 mrb_int c = mrb_fixnum(r); 14 if (c == 0 || c == -1) return TRUE; 15 } 16 10 if (n == 0 || n == -1) return TRUE; 17 11 return FALSE; 18 12 } … … 21 15 r_lt(mrb_state *mrb, mrb_value a, mrb_value b) 22 16 { 23 mrb_value r = mrb_funcall(mrb, a, "<=>", 1, b); 24 /* output :a < b => -1, a = b => 0, a > b => +1 */ 25 26 return mrb_fixnum_p(r) && mrb_fixnum(r) == -1; 17 return mrb_cmp(mrb, a, b) == -1; 27 18 } 28 19 … … 42 33 */ 43 34 static mrb_value 44 mrb_range_cover(mrb_state *mrb, mrb_value range)35 range_cover(mrb_state *mrb, mrb_value range) 45 36 { 46 37 mrb_value val; … … 50 41 mrb_get_args(mrb, "o", &val); 51 42 52 beg = r->edges->beg;53 end = r->edges->end;43 beg = RANGE_BEG(r); 44 end = RANGE_END(r); 54 45 55 46 if (r_le(mrb, beg, val)) { 56 if ( r->excl) {47 if (RANGE_EXCL(r)) { 57 48 if (r_lt(mrb, val, end)) 58 49 return mrb_true_value(); … … 84 75 */ 85 76 static mrb_value 86 mrb_range_last(mrb_state *mrb, mrb_value range)77 range_last(mrb_state *mrb, mrb_value range) 87 78 { 88 79 mrb_value num; 89 80 mrb_value array; 90 struct RRange *r = mrb_range_ptr(mrb, range);91 81 92 82 if (mrb_get_args(mrb, "|o", &num) == 0) { 93 return r->edges->end;83 return mrb_range_end(mrb, range); 94 84 } 95 85 … … 109 99 */ 110 100 101 #ifndef MRB_WITHOUT_FLOAT 111 102 static mrb_value 112 mrb_range_size(mrb_state *mrb, mrb_value range)103 range_size(mrb_state *mrb, mrb_value range) 113 104 { 114 105 struct RRange *r = mrb_range_ptr(mrb, range); … … 118 109 mrb_bool excl; 119 110 120 beg = r->edges->beg;121 end = r->edges->end;122 excl = r->excl;111 beg = RANGE_BEG(r); 112 end = RANGE_END(r); 113 excl = RANGE_EXCL(r); 123 114 if (mrb_fixnum_p(beg)) { 124 115 beg_f = (mrb_float)mrb_fixnum(beg); … … 161 152 return mrb_nil_value(); 162 153 } 154 #else 155 static mrb_value 156 range_size(mrb_state *mrb, mrb_value range) 157 { 158 struct RRange *r = mrb_range_ptr(mrb, range); 159 mrb_value beg, end; 160 mrb_int excl; 161 162 beg = RANGE_BEG(r); 163 end = RANGE_END(r); 164 excl = RANGE_EXCL(r) ? 0 : 1; 165 166 if (mrb_fixnum_p(beg) && mrb_fixnum_p(end)) { 167 mrb_int a = mrb_fixnum(beg); 168 mrb_int b = mrb_fixnum(end); 169 mrb_int c = b - a + excl; 170 171 return mrb_fixnum_value(c); 172 } 173 return mrb_nil_value(); 174 } 175 #endif /* MRB_WITHOUT_FLOAT */ 163 176 164 177 void … … 167 180 struct RClass * s = mrb_class_get(mrb, "Range"); 168 181 169 mrb_define_method(mrb, s, "cover?", mrb_range_cover, MRB_ARGS_REQ(1));170 mrb_define_method(mrb, s, "last", mrb_range_last, MRB_ARGS_OPT(1));171 mrb_define_method(mrb, s, "size", mrb_range_size, MRB_ARGS_NONE());182 mrb_define_method(mrb, s, "cover?", range_cover, MRB_ARGS_REQ(1)); 183 mrb_define_method(mrb, s, "last", range_last, MRB_ARGS_OPT(1)); 184 mrb_define_method(mrb, s, "size", range_size, MRB_ARGS_NONE()); 172 185 } 173 186 -
EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-range-ext/test/range.rb
r331 r439 11 11 assert_equal 10, (10..20).first 12 12 assert_equal [10, 11, 12], (10..20).first(3) 13 14 skip unless Object.const_defined?(:Float) 13 15 assert_equal [0, 1, 2], (0..Float::INFINITY).first(3) 14 16 end … … 24 26 assert_equal 42, (1..42).size 25 27 assert_equal 41, (1...42).size 28 assert_nil ('a'..'z').size 29 30 skip unless Object.const_defined?(:Float) 26 31 assert_equal 6, (1...6.3).size 27 32 assert_equal 5, (1...6.0).size … … 29 34 assert_equal 15, (1.0..15.9).size 30 35 assert_equal Float::INFINITY, (0..Float::INFINITY).size 31 assert_nil ('a'..'z').size32 36 end 37 38 assert('Range#max') do 39 # returns the maximum value in the range when called with no arguments 40 assert_equal 10, (1..10).max 41 assert_equal 9, (1...10).max 42 assert_equal 536870911, (0...2**29).max 43 44 # returns nil when the endpoint is less than the start point 45 assert_equal nil, (100..10).max 46 47 # returns nil when the endpoint equals the start point and the range is exclusive 48 assert_equal nil, (5...5).max 49 50 # returns the endpoint when the endpoint equals the start point and the range is inclusive 51 assert_equal 5, (5..5).max 52 53 skip unless Object.const_defined?(:Float) 54 55 # returns the maximum value in the Float range when called with no arguments 56 assert_equal 908.1111, (303.20..908.1111).max 57 58 # raises TypeError when called on an exclusive range and a non Integer value 59 assert_raise(TypeError) { (303.20...908.1111).max } 60 61 # returns nil when the endpoint is less than the start point in a Float range 62 assert_equal nil, (3003.20..908.1111).max 63 end 64 65 assert('Range#max given a block') do 66 # passes each pair of values in the range to the block 67 acc = [] 68 (1..10).max do |a, b| 69 acc << a 70 acc << b 71 a 72 end 73 (1..10).each do |value| 74 assert_true acc.include?(value) 75 end 76 77 # passes each pair of elements to the block in reversed order 78 acc = [] 79 (1..5).max do |a, b| 80 acc << [a, b] 81 a 82 end 83 assert_equal [[2, 1], [3, 2], [4, 3], [5, 4]], acc 84 85 # returns the element the block determines to be the maximum 86 assert_equal 1, ((1..3).max { |_a, _b| -3 }) 87 88 # returns nil when the endpoint is less than the start point 89 assert_equal nil, ((100..10).max { |x, y| x <=> y }) 90 assert_equal nil, ((5...5).max { |x, y| x <=> y }) 91 end 92 93 assert('Range#min') do 94 # returns the minimum value in the range when called with no arguments 95 assert_equal 1, (1..10).min 96 assert_equal 1, (1...10).min 97 98 # returns nil when the start point is greater than the endpoint 99 assert_equal nil, (100..10).min 100 101 # returns nil when the endpoint equals the start point and the range is exclusive 102 assert_equal nil, (5...5).max 103 104 # returns the endpoint when the endpoint equals the start point and the range is inclusive 105 assert_equal 5, (5..5).max 106 107 skip unless Object.const_defined?(:Float) 108 109 # returns the minimum value in the Float range when called with no arguments 110 assert_equal 303.20, (303.20..908.1111).min 111 112 # returns nil when the start point is greater than the endpoint in a Float range 113 assert_equal nil, (3003.20..908.1111).max 114 end 115 116 assert('Range#min given a block') do 117 # passes each pair of values in the range to the block 118 acc = [] 119 (1..10).min do |a, b| 120 acc << a 121 acc << b 122 a 123 end 124 (1..10).each do |value| 125 assert_true acc.include?(value) 126 end 127 128 # passes each pair of elements to the block in reversed order 129 acc = [] 130 (1..5).min do |a, b| 131 acc << [a, b] 132 a 133 end 134 assert_equal [[2, 1], [3, 1], [4, 1], [5, 1]], acc 135 136 # returns the element the block determines to be the minimum 137 assert_equal 3, ((1..3).min { |_a, _b| -3 }) 138 139 # returns nil when the start point is greater than the endpoint 140 assert_equal nil, ((100..10).min { |x, y| x <=> y }) 141 assert_equal nil, ((5...5).min { |x, y| x <=> y }) 142 end -
EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-sprintf/src/kernel.c
r331 r439 19 19 krn = mrb->kernel_module; 20 20 21 mrb_define_method(mrb, krn, "sprintf", mrb_f_sprintf, MRB_ARGS_ ANY());22 mrb_define_method(mrb, krn, "format", mrb_f_sprintf, MRB_ARGS_ ANY());21 mrb_define_method(mrb, krn, "sprintf", mrb_f_sprintf, MRB_ARGS_REQ(1)|MRB_ARGS_REST()); 22 mrb_define_method(mrb, krn, "format", mrb_f_sprintf, MRB_ARGS_REQ(1)|MRB_ARGS_REST()); 23 23 } 24 24 -
EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-sprintf/src/sprintf.c
r331 r439 7 7 #include <mruby.h> 8 8 9 #ifdef MRB_DISABLE_STDIO 10 # error sprintf conflicts 'MRB_DISABLE_STDIO' configuration in your 'build_config.rb' 11 #endif 12 9 13 #include <limits.h> 10 #include <stdio.h>11 14 #include <string.h> 12 15 #include <mruby/string.h> 13 16 #include <mruby/hash.h> 14 17 #include <mruby/numeric.h> 18 #ifndef MRB_WITHOUT_FLOAT 15 19 #include <math.h> 20 #endif 16 21 #include <ctype.h> 17 22 … … 20 25 #define EXTENDSIGN(n, l) (((~0U << (n)) >> (((n)*(l)) % BITSPERDIG)) & ~(~0U << (n))) 21 26 22 mrb_value mrb_str_format(mrb_state *, int, const mrb_value *, mrb_value); 27 mrb_value mrb_str_format(mrb_state *, mrb_int, const mrb_value *, mrb_value); 28 #ifndef MRB_WITHOUT_FLOAT 23 29 static void fmt_setup(char*,size_t,int,int,mrb_int,mrb_int); 30 #endif 24 31 25 32 static char* … … 78 85 79 86 if (base != 2) { 80 mrb_raisef(mrb, E_ARGUMENT_ERROR, "invalid radix % S", mrb_fixnum_value(base));87 mrb_raisef(mrb, E_ARGUMENT_ERROR, "invalid radix %d", base); 81 88 } 82 89 if (val == 0) { … … 116 123 117 124 #define CHECK(l) do {\ 118 /* int cr = ENC_CODERANGE(result);*/\119 125 while ((l) >= bsiz - blen) {\ 126 if (bsiz > MRB_INT_MAX/2) mrb_raise(mrb, E_ARGUMENT_ERROR, "too big specifier"); \ 120 127 bsiz*=2;\ 121 if (bsiz < 0) mrb_raise(mrb, E_ARGUMENT_ERROR, "too big specifier"); \122 128 }\ 123 129 mrb_str_resize(mrb, result, bsiz);\ 124 /* ENC_CODERANGE_SET(result, cr);*/\125 130 buf = RSTRING_PTR(result);\ 126 131 } while (0) … … 129 134 CHECK(l);\ 130 135 memcpy(&buf[blen], s, l);\ 131 blen += ( l);\136 blen += (mrb_int)(l);\ 132 137 } while (0) 133 138 … … 143 148 switch (posarg) { 144 149 case -1: 145 mrb_raisef(mrb, E_ARGUMENT_ERROR, "unnumbered(% S) mixed with numbered", mrb_fixnum_value(nextarg));150 mrb_raisef(mrb, E_ARGUMENT_ERROR, "unnumbered(%d) mixed with numbered", nextarg); 146 151 break; 147 152 case -2: 148 mrb_raisef(mrb, E_ARGUMENT_ERROR, "unnumbered(% S) mixed with named", mrb_fixnum_value(nextarg));153 mrb_raisef(mrb, E_ARGUMENT_ERROR, "unnumbered(%d) mixed with named", nextarg); 149 154 break; 150 155 default: … … 154 159 155 160 static void 156 check_pos_arg(mrb_state *mrb, int posarg, int n)161 check_pos_arg(mrb_state *mrb, int posarg, mrb_int n) 157 162 { 158 163 if (posarg > 0) { 159 mrb_raisef(mrb, E_ARGUMENT_ERROR, "numbered(% S) after unnumbered(%S)",160 mrb_fixnum_value(n), mrb_fixnum_value(posarg));164 mrb_raisef(mrb, E_ARGUMENT_ERROR, "numbered(%i) after unnumbered(%d)", 165 n, posarg); 161 166 } 162 167 if (posarg == -2) { 163 mrb_raisef(mrb, E_ARGUMENT_ERROR, "numbered(% S) after named", mrb_fixnum_value(n));168 mrb_raisef(mrb, E_ARGUMENT_ERROR, "numbered(%i) after named", n); 164 169 } 165 170 if (n < 1) { 166 mrb_raisef(mrb, E_ARGUMENT_ERROR, "invalid index - % S$", mrb_fixnum_value(n));171 mrb_raisef(mrb, E_ARGUMENT_ERROR, "invalid index - %i$", n); 167 172 } 168 173 } 169 174 170 175 static void 171 check_name_arg(mrb_state *mrb, int posarg, const char *name, int len)176 check_name_arg(mrb_state *mrb, int posarg, const char *name, size_t len) 172 177 { 173 178 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));179 mrb_raisef(mrb, E_ARGUMENT_ERROR, "named%l after unnumbered(%d)", 180 name, len, posarg); 176 181 } 177 182 if (posarg == -1) { 178 mrb_raisef(mrb, E_ARGUMENT_ERROR, "named% S after numbered", mrb_str_new(mrb, (name), (len)));183 mrb_raisef(mrb, E_ARGUMENT_ERROR, "named%l after numbered", name, len); 179 184 } 180 185 } … … 199 204 #define GETNUM(n, val) \ 200 205 for (; p < end && ISDIGIT(*p); p++) {\ 201 int next_n = 10 * n + (*p - '0'); \ 202 if (next_n / 10 != n) {\ 206 if (n > (MRB_INT_MAX - (*p - '0'))/10) {\ 203 207 mrb_raise(mrb, E_ARGUMENT_ERROR, #val " too big"); \ 204 208 } \ 205 n = next_n; \209 n = 10 * n + (*p - '0'); \ 206 210 } \ 207 211 if (p >= end) { \ … … 225 229 226 230 static mrb_value 227 get_hash(mrb_state *mrb, mrb_value *hash, int argc, const mrb_value *argv)231 get_hash(mrb_state *mrb, mrb_value *hash, mrb_int argc, const mrb_value *argv) 228 232 { 229 233 mrb_value tmp; … … 233 237 mrb_raise(mrb, E_ARGUMENT_ERROR, "one hash required"); 234 238 } 235 tmp = mrb_check_ convert_type(mrb, argv[1], MRB_TT_HASH, "Hash", "to_hash");239 tmp = mrb_check_hash_type(mrb, argv[1]); 236 240 if (mrb_nil_p(tmp)) { 237 241 mrb_raise(mrb, E_ARGUMENT_ERROR, "one hash required"); … … 519 523 520 524 mrb_value 521 mrb_str_format(mrb_state *mrb, int argc, const mrb_value *argv, mrb_value fmt)525 mrb_str_format(mrb_state *mrb, mrb_int argc, const mrb_value *argv, mrb_value fmt) 522 526 { 523 527 const char *p, *end; … … 529 533 mrb_int width; 530 534 mrb_int prec; 531 int flags = FNONE;532 535 int nextarg = 1; 533 536 int posarg = 0; … … 553 556 ++argc; 554 557 --argv; 555 fmt = mrb_str_to_str(mrb, fmt);558 mrb_to_str(mrb, fmt); 556 559 p = RSTRING_PTR(fmt); 557 560 end = p + RSTRING_LEN(fmt); 558 561 blen = 0; 559 562 bsiz = 120; 560 result = mrb_str_ buf_new(mrb, bsiz);563 result = mrb_str_new_capa(mrb, bsiz); 561 564 buf = RSTRING_PTR(result); 562 565 memset(buf, 0, bsiz); … … 565 568 const char *t; 566 569 mrb_sym id = 0; 570 int flags = FNONE; 567 571 568 572 for (t = p; t < end && *t != '%'; t++) ; … … 580 584 switch (*p) { 581 585 default: 582 mrb_raisef(mrb, E_ARGUMENT_ERROR, "malformed format string - \\%%S", mrb_str_new(mrb, p, 1));586 mrb_raisef(mrb, E_ARGUMENT_ERROR, "malformed format string - %%%c", *p); 583 587 break; 584 588 … … 619 623 if (*p == '$') { 620 624 if (!mrb_undef_p(nextvalue)) { 621 mrb_raisef(mrb, E_ARGUMENT_ERROR, "value given twice - % S$", mrb_fixnum_value(n));625 mrb_raisef(mrb, E_ARGUMENT_ERROR, "value given twice - %i$", n); 622 626 } 623 627 nextvalue = GETPOSARG(n); … … 639 643 p++; 640 644 if (id) { 641 mrb_raisef(mrb, E_ARGUMENT_ERROR, "name% S after <%S>",642 mrb_str_new(mrb, start, p - start + 1), mrb_sym2str(mrb, id));645 mrb_raisef(mrb, E_ARGUMENT_ERROR, "name%l after <%n>", 646 start, p - start + 1, id); 643 647 } 644 648 symname = mrb_str_new(mrb, start + 1, p - start - 1); 645 649 id = mrb_intern_str(mrb, symname); 646 nextvalue = GETNAMEARG(mrb_symbol_value(id), start, (int)(p - start + 1));650 nextvalue = GETNAMEARG(mrb_symbol_value(id), start, p - start + 1); 647 651 if (mrb_undef_p(nextvalue)) { 648 mrb_raisef(mrb, E_KEY_ERROR, "key% S not found", mrb_str_new(mrb, start, p - start + 1));652 mrb_raisef(mrb, E_KEY_ERROR, "key%l not found", start, p - start + 1); 649 653 } 650 654 if (term == '}') goto format_s; … … 702 706 tmp = mrb_check_string_type(mrb, val); 703 707 if (!mrb_nil_p(tmp)) { 704 if ( mrb_fixnum(mrb_funcall(mrb, tmp, "size", 0)) != 1) {708 if (RSTRING_LEN(tmp) != 1) { 705 709 mrb_raise(mrb, E_ARGUMENT_ERROR, "%c requires a character"); 706 710 } 707 711 } 708 712 else if (mrb_fixnum_p(val)) { 709 tmp = mrb_funcall(mrb, val, "chr", 0); 713 mrb_int n = mrb_fixnum(val); 714 715 if (n < 0x80) { 716 char buf[1]; 717 718 buf[0] = (char)n; 719 tmp = mrb_str_new(mrb, buf, 1); 720 } 721 else { 722 tmp = mrb_funcall(mrb, val, "chr", 0); 723 mrb_check_type(mrb, tmp, MRB_TT_STRING); 724 } 710 725 } 711 726 else { 712 727 mrb_raise(mrb, E_ARGUMENT_ERROR, "invalid character"); 713 728 } 714 mrb_check_type(mrb, tmp, MRB_TT_STRING);715 729 c = RSTRING_PTR(tmp); 716 730 n = RSTRING_LEN(tmp); … … 756 770 char *p = RSTRING_PTR(str) + prec; 757 771 slen = prec; 758 len = p - RSTRING_PTR(str);772 len = (mrb_int)(p - RSTRING_PTR(str)); 759 773 } 760 774 /* need to adjust multi-byte string pos */ … … 792 806 mrb_int len; 793 807 794 switch (*p) {795 case 'd':796 case 'i':797 sign = 1; break;798 default:799 break;800 }801 808 if (flags & FSHARP) { 802 809 switch (*p) { … … 812 819 bin_retry: 813 820 switch (mrb_type(val)) { 821 #ifndef MRB_WITHOUT_FLOAT 814 822 case MRB_TT_FLOAT: 815 823 val = mrb_flo_to_fixnum(mrb, val); 816 824 if (mrb_fixnum_p(val)) goto bin_retry; 817 825 break; 826 #endif 818 827 case MRB_TT_STRING: 819 828 val = mrb_str_to_inum(mrb, val, 0, TRUE); … … 839 848 case 'd': 840 849 case 'i': 850 sign = 1; 851 /* fall through */ 841 852 default: 842 853 base = 10; break; 843 854 } 844 855 845 if (base == 2) {846 if (v < 0 && !sign) {847 val = mrb_fix2binstr(mrb, mrb_fixnum_value(v), base);848 dots = 1;849 }850 else {851 val = mrb_fixnum_to_str(mrb, mrb_fixnum_value(v), base);852 }853 }854 856 if (sign) { 855 if (v > 0) {857 if (v >= 0) { 856 858 if (flags & FPLUS) { 857 859 sc = '+'; … … 863 865 } 864 866 } 867 else { 868 sc = '-'; 869 width--; 870 } 871 mrb_assert(base == 10); 872 snprintf(nbuf, sizeof(nbuf), "%" MRB_PRId, v); 873 s = nbuf; 874 if (v < 0) s++; /* skip minus sign */ 875 } 876 else { 877 s = nbuf; 878 if (v < 0) { 879 dots = 1; 880 } 865 881 switch (base) { 866 882 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 } 879 s = nbuf; 880 } 881 else { 882 s = nbuf; 883 if (base != 10 && v < 0) { 884 dots = 1; 885 } 886 switch (base) { 887 case 2: 883 if (v < 0) { 884 val = mrb_fix2binstr(mrb, mrb_fixnum_value(v), base); 885 } 886 else { 887 val = mrb_fixnum_to_str(mrb, mrb_fixnum_value(v), base); 888 } 888 889 strncpy(++s, RSTRING_PTR(val), sizeof(nbuf)-1); 889 890 break; 890 891 case 8: 891 892 snprintf(++s, sizeof(nbuf)-1, "%" MRB_PRIo, v); 892 break;893 case 10:894 snprintf(++s, sizeof(nbuf)-1, "%" MRB_PRId, v);895 893 break; 896 894 case 16: … … 921 919 } 922 920 923 if (dots) {924 prec -= 2;925 width -= 2;926 }927 928 921 if (*p == 'X') { 929 922 char *pp = s; … … 973 966 if (!(flags&FMINUS) && width > 0) { 974 967 FILL(' ', width); 968 width = 0; 975 969 } 976 970 … … 981 975 PUSH(prefix, plen); 982 976 } 983 if (dots) PUSH("..", 2); 977 if (dots) { 978 prec -= 2; 979 width -= 2; 980 PUSH("..", 2); 981 } 984 982 985 983 if (prec > len) { 986 984 CHECK(prec - len); 987 if (v < 0) { 985 if ((flags & (FMINUS|FPREC)) != FMINUS) { 986 char c = '0'; 987 FILL(c, prec - len); 988 } else if (v < 0) { 988 989 char c = sign_bits(base, p); 989 FILL(c, prec - len);990 }991 else if ((flags & (FMINUS|FPREC)) != FMINUS) {992 char c = '0';993 990 FILL(c, prec - len); 994 991 } … … 1001 998 break; 1002 999 1000 #ifndef MRB_WITHOUT_FLOAT 1003 1001 case 'f': 1004 1002 case 'g': … … 1010 1008 mrb_value val = GETARG(); 1011 1009 double fval; 1012 int i,need = 6;1010 mrb_int need = 6; 1013 1011 char fbuf[32]; 1014 1012 … … 1016 1014 if (!isfinite(fval)) { 1017 1015 const char *expr; 1018 const int elen = 3;1016 const mrb_int elen = 3; 1019 1017 char sign = '\0'; 1020 1018 … … 1031 1029 sign = (flags & FPLUS) ? '+' : ' '; 1032 1030 if (sign) 1033 1031 ++need; 1034 1032 if ((flags & FWIDTH) && need < width) 1035 1033 need = width; … … 1055 1053 need = 0; 1056 1054 if (*p != 'e' && *p != 'E') { 1057 i = INT_MIN;1055 int i; 1058 1056 frexp(fval, &i); 1059 1057 if (i > 0) 1060 1058 need = BIT_DIGITS(i); 1061 1059 } 1060 if (need > MRB_INT_MAX - ((flags&FPREC) ? prec : 6)) { 1061 too_big_width: 1062 mrb_raise(mrb, E_ARGUMENT_ERROR, 1063 (width > prec ? "width too big" : "prec too big")); 1064 } 1062 1065 need += (flags&FPREC) ? prec : 6; 1063 1066 if ((flags&FWIDTH) && need < width) 1064 1067 need = width; 1068 if (need > MRB_INT_MAX - 20) { 1069 goto too_big_width; 1070 } 1065 1071 need += 20; 1066 if (need <= 0) {1067 mrb_raise(mrb, E_ARGUMENT_ERROR,1068 (width > prec ? "width too big" : "prec too big"));1069 }1070 1072 1071 1073 CHECK(need); 1072 1074 n = snprintf(&buf[blen], need, fbuf, fval); 1073 if (n < 0 ) {1075 if (n < 0 || n >= need) { 1074 1076 mrb_raise(mrb, E_RUNTIME_ERROR, "formatting error"); 1075 1077 } … … 1077 1079 } 1078 1080 break; 1081 #endif 1079 1082 } 1080 1083 flags = FNONE; … … 1088 1091 const char *mesg = "too many arguments for format string"; 1089 1092 if (mrb_test(ruby_debug)) mrb_raise(mrb, E_ARGUMENT_ERROR, mesg); 1090 if (mrb_test(ruby_verbose)) mrb_warn(mrb, "% S", mrb_str_new_cstr(mrb, mesg));1093 if (mrb_test(ruby_verbose)) mrb_warn(mrb, "%s", mesg); 1091 1094 } 1092 1095 #endif … … 1096 1099 } 1097 1100 1101 #ifndef MRB_WITHOUT_FLOAT 1098 1102 static void 1099 1103 fmt_setup(char *buf, size_t size, int c, int flags, mrb_int width, mrb_int prec) … … 1122 1126 *buf = '\0'; 1123 1127 } 1128 #endif -
EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-sprintf/test/sprintf.rb
r331 r439 4 4 assert('String#%') do 5 5 assert_equal "one=1", "one=%d" % 1 6 assert_equal "1 one 1.0", "%d %s %3.1f" % [ 1, "one", 1.01]6 assert_equal "1 one", "%d %s" % [ 1, "one" ] 7 7 assert_equal "123 < 456", "%{num} < %<str>s" % { num: 123, str: "456" } 8 8 assert_equal 15, ("%b" % (1<<14)).size 9 skip unless Object.const_defined?(:Float) 10 assert_equal "1.0", "%3.1f" % 1.01 9 11 end 10 12 11 13 assert('String#% with inf') do 14 skip unless Object.const_defined?(:Float) 12 15 inf = Float::INFINITY 13 16 … … 38 41 39 42 assert('String#% with nan') do 43 skip unless Object.const_defined?(:Float) 40 44 nan = Float::NAN 41 45 … … 76 80 77 81 assert_raise TypeError do 78 "%c" % 0 82 "%c" % 0x80 79 83 end 80 84 ensure … … 92 96 end 93 97 98 assert("String#% %d") do 99 assert_equal(" 10", "%4d" % 10) 100 assert_equal("1000", "%4d" % 1000) 101 assert_equal("10000", "%4d" % 10000) 102 end 103 94 104 assert("String#% invalid format") do 95 105 assert_raise ArgumentError do -
EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-string-ext/mrbgem.rake
r331 r439 3 3 spec.author = 'mruby developers' 4 4 spec.summary = 'String class extension' 5 spec.add_test_dependency 'mruby-enumerator', core: 'mruby-enumerator'6 5 end -
EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-string-ext/mrblib/string.rb
r331 r439 1 1 class String 2 3 ##4 # call-seq:5 # String.try_convert(obj) -> string or nil6 #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 converted9 # for any reason.10 #11 # String.try_convert("str") #=> "str"12 # String.try_convert(/re/) #=> nil13 #14 def self.try_convert(obj)15 if obj.respond_to?(:to_str)16 obj.to_str17 else18 nil19 end20 end21 2 22 3 ## … … 96 77 # 97 78 def lstrip! 98 raise RuntimeError, "can't modify frozen String" if frozen?79 raise FrozenError, "can't modify frozen String" if frozen? 99 80 s = self.lstrip 100 81 (s == self) ? nil : self.replace(s) … … 113 94 # 114 95 def rstrip! 115 raise RuntimeError, "can't modify frozen String" if frozen?96 raise FrozenError, "can't modify frozen String" if frozen? 116 97 s = self.rstrip 117 98 (s == self) ? nil : self.replace(s) … … 126 107 # 127 108 def strip! 128 raise RuntimeError, "can't modify frozen String" if frozen?109 raise FrozenError, "can't modify frozen String" if frozen? 129 110 s = self.strip 130 111 (s == self) ? nil : self.replace(s) … … 143 124 # 144 125 def casecmp(str) 145 self.downcase <=> str. to_str.downcase126 self.downcase <=> str.__to_str.downcase 146 127 rescue NoMethodError 147 raise TypeError, "no implicit conversion of #{str.class} into String" 128 nil 129 end 130 131 ## 132 # call-seq: 133 # str.casecmp?(other) -> true, false, or nil 134 # 135 # Returns true if str and other_str are equal after case folding, 136 # false if they are not equal, and nil if other_str is not a string. 137 138 def casecmp?(str) 139 c = self.casecmp(str) 140 return nil if c.nil? 141 return c == 0 148 142 end 149 143 … … 187 181 # 188 182 def slice!(arg1, arg2=nil) 189 raise RuntimeError, "can't modify frozen String" if frozen?183 raise FrozenError, "can't modify frozen String" if frozen? 190 184 raise "wrong number of arguments (for 1..2)" if arg1.nil? && arg2.nil? 191 185 … … 317 311 end 318 312 313 ## 314 # Call the given block for each character of 315 # +self+. 319 316 def each_char(&block) 320 317 return to_enum :each_char unless block 321 322 split('').each do |i| 323 block.call(i) 318 pos = 0 319 while pos < self.size 320 block.call(self[pos]) 321 pos += 1 324 322 end 325 323 self … … 353 351 self 354 352 end 353 354 ## 355 # call-seq: 356 # string.lines -> array of string 357 # string.lines {|s| block} -> array of string 358 # 359 # Returns strings per line; 360 # 361 # a = "abc\ndef" 362 # a.lines #=> ["abc\n", "def"] 363 # 364 # If a block is given, it works the same as <code>each_line</code>. 365 def lines(&blk) 366 lines = self.__lines 367 if blk 368 lines.each do |line| 369 blk.call(line) 370 end 371 end 372 lines 373 end 374 375 ## 376 # call-seq: 377 # str.upto(other_str, exclusive=false) {|s| block } -> str 378 # str.upto(other_str, exclusive=false) -> an_enumerator 379 # 380 # Iterates through successive values, starting at <i>str</i> and 381 # ending at <i>other_str</i> inclusive, passing each value in turn to 382 # the block. The <code>String#succ</code> method is used to generate 383 # each value. If optional second argument exclusive is omitted or is false, 384 # the last value will be included; otherwise it will be excluded. 385 # 386 # If no block is given, an enumerator is returned instead. 387 # 388 # "a8".upto("b6") {|s| print s, ' ' } 389 # for s in "a8".."b6" 390 # print s, ' ' 391 # end 392 # 393 # <em>produces:</em> 394 # 395 # a8 a9 b0 b1 b2 b3 b4 b5 b6 396 # a8 a9 b0 b1 b2 b3 b4 b5 b6 397 # 398 # If <i>str</i> and <i>other_str</i> contains only ascii numeric characters, 399 # both are recognized as decimal numbers. In addition, the width of 400 # string (e.g. leading zeros) is handled appropriately. 401 # 402 # "9".upto("11").to_a #=> ["9", "10", "11"] 403 # "25".upto("5").to_a #=> [] 404 # "07".upto("11").to_a #=> ["07", "08", "09", "10", "11"] 405 def upto(max, exclusive=false, &block) 406 return to_enum(:upto, max, exclusive) unless block 407 raise TypeError, "no implicit conversion of #{max.class} into String" unless max.kind_of? String 408 409 len = self.length 410 maxlen = max.length 411 # single character 412 if len == 1 and maxlen == 1 413 c = self.ord 414 e = max.ord 415 while c <= e 416 break if exclusive and c == e 417 yield c.chr(__ENCODING__) 418 c += 1 419 end 420 return self 421 end 422 # both edges are all digits 423 bi = self.to_i(10) 424 ei = max.to_i(10) 425 len = self.length 426 if (bi > 0 or bi == "0"*len) and (ei > 0 or ei == "0"*maxlen) 427 while bi <= ei 428 break if exclusive and bi == ei 429 s = bi.to_s 430 s = s.rjust(len, "0") if s.length < len 431 yield s 432 bi += 1 433 end 434 return self 435 end 436 bs = self 437 while true 438 n = (bs <=> max) 439 break if n > 0 440 break if exclusive and n == 0 441 yield bs 442 break if n == 0 443 bs = bs.succ 444 end 445 self 446 end 355 447 end -
EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-string-ext/src/string.c
r331 r439 6 6 #include <mruby/range.h> 7 7 8 static mrb_value 9 mrb_str_getbyte(mrb_state *mrb, mrb_value str) 10 { 11 mrb_int pos; 12 mrb_get_args(mrb, "i", &pos); 13 14 if (pos < 0) 15 pos += RSTRING_LEN(str); 16 if (pos < 0 || RSTRING_LEN(str) <= pos) 17 return mrb_nil_value(); 18 19 return mrb_fixnum_value((unsigned char)RSTRING_PTR(str)[pos]); 20 } 21 22 static mrb_value 23 mrb_str_setbyte(mrb_state *mrb, mrb_value str) 24 { 25 mrb_int pos, byte; 26 long len; 27 28 mrb_get_args(mrb, "ii", &pos, &byte); 29 30 len = RSTRING_LEN(str); 31 if (pos < -len || len <= pos) 32 mrb_raisef(mrb, E_INDEX_ERROR, "index %S is out of array", mrb_fixnum_value(pos)); 33 if (pos < 0) 34 pos += len; 35 36 mrb_str_modify(mrb, mrb_str_ptr(str)); 37 byte &= 0xff; 38 RSTRING_PTR(str)[pos] = byte; 39 return mrb_fixnum_value((unsigned char)byte); 40 } 41 42 static mrb_value 43 mrb_str_byteslice(mrb_state *mrb, mrb_value str) 44 { 45 mrb_value a1; 8 #define ENC_ASCII_8BIT "ASCII-8BIT" 9 #define ENC_BINARY "BINARY" 10 #define ENC_UTF8 "UTF-8" 11 12 #define ENC_COMP_P(enc, enc_lit) \ 13 str_casecmp_p(RSTRING_PTR(enc), RSTRING_LEN(enc), enc_lit, sizeof(enc_lit"")-1) 14 15 #ifdef MRB_WITHOUT_FLOAT 16 # define mrb_float_p(o) FALSE 17 #endif 18 19 static mrb_bool 20 str_casecmp_p(const char *s1, mrb_int len1, const char *s2, mrb_int len2) 21 { 22 const char *e1, *e2; 23 24 if (len1 != len2) return FALSE; 25 e1 = s1 + len1; 26 e2 = s2 + len2; 27 while (s1 < e1 && s2 < e2) { 28 if (*s1 != *s2 && TOUPPER(*s1) != TOUPPER(*s2)) return FALSE; 29 ++s1; 30 ++s2; 31 } 32 return TRUE; 33 } 34 35 static mrb_value 36 int_chr_binary(mrb_state *mrb, mrb_value num) 37 { 38 mrb_int cp = mrb_int(mrb, num); 39 char c; 40 mrb_value str; 41 42 if (cp < 0 || 0xff < cp) { 43 mrb_raisef(mrb, E_RANGE_ERROR, "%v out of char range", num); 44 } 45 c = (char)cp; 46 str = mrb_str_new(mrb, &c, 1); 47 RSTR_SET_ASCII_FLAG(mrb_str_ptr(str)); 48 return str; 49 } 50 51 #ifdef MRB_UTF8_STRING 52 static mrb_value 53 int_chr_utf8(mrb_state *mrb, mrb_value num) 54 { 55 mrb_int cp = mrb_int(mrb, num); 56 char utf8[4]; 46 57 mrb_int len; 47 int argc;48 49 argc = mrb_get_args(mrb, "o|i", &a1, &len); 50 if ( argc == 2) {51 return mrb_str_substr(mrb, str, mrb_fixnum(a1), len);52 } 53 switch (mrb_type(a1)) {54 case MRB_TT_RANGE:55 {56 mrb_int beg;57 58 len = RSTRING_LEN(str);59 switch (mrb_range_beg_len(mrb, a1, &beg, &len, len, TRUE)) {60 case 0: /* not range */61 break;62 case 1: /* range */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;67 }68 return mrb_nil_value();69 }70 case MRB_TT_FLOAT:71 a1 = mrb_fixnum_value((mrb_int)mrb_float(a1));72 /* fall through */73 case MRB_TT_FIXNUM:74 return mrb_str_substr(mrb, str, mrb_fixnum(a1), 1);75 default:76 mrb_raise(mrb, E_TYPE_ERROR, "wrong type of argument");77 }78 /* not reached */79 return mrb_nil_value(); 80 } 58 mrb_value str; 59 uint32_t ascii_flag = 0; 60 61 if (cp < 0 || 0x10FFFF < cp) { 62 mrb_raisef(mrb, E_RANGE_ERROR, "%v out of char range", num); 63 } 64 if (cp < 0x80) { 65 utf8[0] = (char)cp; 66 len = 1; 67 ascii_flag = MRB_STR_ASCII; 68 } 69 else if (cp < 0x800) { 70 utf8[0] = (char)(0xC0 | (cp >> 6)); 71 utf8[1] = (char)(0x80 | (cp & 0x3F)); 72 len = 2; 73 } 74 else if (cp < 0x10000) { 75 utf8[0] = (char)(0xE0 | (cp >> 12)); 76 utf8[1] = (char)(0x80 | ((cp >> 6) & 0x3F)); 77 utf8[2] = (char)(0x80 | ( cp & 0x3F)); 78 len = 3; 79 } 80 else { 81 utf8[0] = (char)(0xF0 | (cp >> 18)); 82 utf8[1] = (char)(0x80 | ((cp >> 12) & 0x3F)); 83 utf8[2] = (char)(0x80 | ((cp >> 6) & 0x3F)); 84 utf8[3] = (char)(0x80 | ( cp & 0x3F)); 85 len = 4; 86 } 87 str = mrb_str_new(mrb, utf8, len); 88 mrb_str_ptr(str)->flags |= ascii_flag; 89 return str; 90 } 91 #endif 81 92 82 93 /* … … 135 146 } 136 147 137 static mrb_value mrb_fixnum_chr(mrb_state *mrb, mrb_value num);138 139 148 /* 140 149 * call-seq: … … 146 155 * Append---Concatenates the given object to <i>str</i>. If the object is a 147 156 * <code>Integer</code>, it is considered as a codepoint, and is converted 148 * to a character before concatenation. 157 * to a character before concatenation 158 * (equivalent to <code>str.concat(integer.chr(__ENCODING__))</code>). 149 159 * 150 160 * a = "hello " … … 153 163 */ 154 164 static mrb_value 155 mrb_str_concat 2(mrb_state *mrb, mrb_value self)165 mrb_str_concat_m(mrb_state *mrb, mrb_value self) 156 166 { 157 167 mrb_value str; 158 168 159 169 mrb_get_args(mrb, "o", &str); 160 if (mrb_fixnum_p(str)) 161 str = mrb_fixnum_chr(mrb, str); 170 if (mrb_fixnum_p(str) || mrb_float_p(str)) 171 #ifdef MRB_UTF8_STRING 172 str = int_chr_utf8(mrb, str); 173 #else 174 str = int_chr_binary(mrb, str); 175 #endif 162 176 else 163 str = mrb_string_type(mrb, str);164 mrb_str_c oncat(mrb, self, str);177 mrb_ensure_string_type(mrb, str); 178 mrb_str_cat_str(mrb, self, str); 165 179 return self; 166 180 } … … 189 203 size_t len_l, len_r; 190 204 int ai = mrb_gc_arena_save(mrb); 191 sub = mrb_ string_type(mrb, argv[i]);205 sub = mrb_ensure_string_type(mrb, argv[i]); 192 206 mrb_gc_arena_restore(mrb, ai); 193 207 len_l = RSTRING_LEN(self); … … 218 232 size_t len_l, len_r; 219 233 int ai = mrb_gc_arena_save(mrb); 220 sub = mrb_ string_type(mrb, argv[i]);234 sub = mrb_ensure_string_type(mrb, argv[i]); 221 235 mrb_gc_arena_restore(mrb, ai); 222 236 len_l = RSTRING_LEN(self); … … 233 247 } 234 248 249 enum tr_pattern_type { 250 TR_UNINITIALIZED = 0, 251 TR_IN_ORDER = 1, 252 TR_RANGE = 2, 253 }; 254 255 /* 256 #tr Pattern syntax 257 258 <syntax> ::= (<pattern>)* | '^' (<pattern>)* 259 <pattern> ::= <in order> | <range> 260 <in order> ::= (<ch>)+ 261 <range> ::= <ch> '-' <ch> 262 */ 263 struct tr_pattern { 264 uint8_t type; // 1:in-order, 2:range 265 mrb_bool flag_reverse : 1; 266 mrb_bool flag_on_heap : 1; 267 uint16_t n; 268 union { 269 uint16_t start_pos; 270 char ch[2]; 271 } val; 272 struct tr_pattern *next; 273 }; 274 275 #define STATIC_TR_PATTERN { 0 } 276 277 static inline void 278 tr_free_pattern(mrb_state *mrb, struct tr_pattern *pat) 279 { 280 while (pat) { 281 struct tr_pattern *p = pat->next; 282 if (pat->flag_on_heap) { 283 mrb_free(mrb, pat); 284 } 285 pat = p; 286 } 287 } 288 289 static struct tr_pattern* 290 tr_parse_pattern(mrb_state *mrb, struct tr_pattern *ret, const mrb_value v_pattern, mrb_bool flag_reverse_enable) 291 { 292 const char *pattern = RSTRING_PTR(v_pattern); 293 mrb_int pattern_length = RSTRING_LEN(v_pattern); 294 mrb_bool flag_reverse = FALSE; 295 struct tr_pattern *pat1; 296 mrb_int i = 0; 297 298 if(flag_reverse_enable && pattern_length >= 2 && pattern[0] == '^') { 299 flag_reverse = TRUE; 300 i++; 301 } 302 303 while (i < pattern_length) { 304 /* is range pattern ? */ 305 mrb_bool const ret_uninit = (ret->type == TR_UNINITIALIZED); 306 pat1 = ret_uninit 307 ? ret 308 : (struct tr_pattern*)mrb_malloc_simple(mrb, sizeof(struct tr_pattern)); 309 if ((i+2) < pattern_length && pattern[i] != '\\' && pattern[i+1] == '-') { 310 if (pat1 == NULL && ret) { 311 nomem: 312 tr_free_pattern(mrb, ret); 313 mrb_exc_raise(mrb, mrb_obj_value(mrb->nomem_err)); 314 return NULL; /* not reached */ 315 } 316 pat1->type = TR_RANGE; 317 pat1->flag_reverse = flag_reverse; 318 pat1->flag_on_heap = !ret_uninit; 319 pat1->n = pattern[i+2] - pattern[i] + 1; 320 pat1->next = NULL; 321 pat1->val.ch[0] = pattern[i]; 322 pat1->val.ch[1] = pattern[i+2]; 323 i += 3; 324 } 325 else { 326 /* in order pattern. */ 327 mrb_int start_pos = i++; 328 mrb_int len; 329 330 while (i < pattern_length) { 331 if ((i+2) < pattern_length && pattern[i] != '\\' && pattern[i+1] == '-') 332 break; 333 i++; 334 } 335 336 len = i - start_pos; 337 if (len > UINT16_MAX) { 338 mrb_raise(mrb, E_ARGUMENT_ERROR, "tr pattern too long (max 65536)"); 339 } 340 if (pat1 == NULL && ret) { 341 goto nomem; 342 } 343 pat1->type = TR_IN_ORDER; 344 pat1->flag_reverse = flag_reverse; 345 pat1->flag_on_heap = !ret_uninit; 346 pat1->n = len; 347 pat1->next = NULL; 348 pat1->val.start_pos = start_pos; 349 } 350 351 if (ret == NULL || ret_uninit) { 352 ret = pat1; 353 } 354 else { 355 struct tr_pattern *p = ret; 356 while (p->next != NULL) { 357 p = p->next; 358 } 359 p->next = pat1; 360 } 361 } 362 363 return ret; 364 } 365 366 static inline mrb_int 367 tr_find_character(const struct tr_pattern *pat, const char *pat_str, int ch) 368 { 369 mrb_int ret = -1; 370 mrb_int n_sum = 0; 371 mrb_int flag_reverse = pat ? pat->flag_reverse : 0; 372 373 while (pat != NULL) { 374 if (pat->type == TR_IN_ORDER) { 375 int i; 376 for (i = 0; i < pat->n; i++) { 377 if (pat_str[pat->val.start_pos + i] == ch) ret = n_sum + i; 378 } 379 } 380 else if (pat->type == TR_RANGE) { 381 if (pat->val.ch[0] <= ch && ch <= pat->val.ch[1]) 382 ret = n_sum + ch - pat->val.ch[0]; 383 } 384 else { 385 mrb_assert(pat->type == TR_UNINITIALIZED); 386 } 387 n_sum += pat->n; 388 pat = pat->next; 389 } 390 391 if (flag_reverse) { 392 return (ret < 0) ? MRB_INT_MAX : -1; 393 } 394 return ret; 395 } 396 397 static inline mrb_int 398 tr_get_character(const struct tr_pattern *pat, const char *pat_str, mrb_int n_th) 399 { 400 mrb_int n_sum = 0; 401 402 while (pat != NULL) { 403 if (n_th < (n_sum + pat->n)) { 404 mrb_int i = (n_th - n_sum); 405 406 switch (pat->type) { 407 case TR_IN_ORDER: 408 return pat_str[pat->val.start_pos + i]; 409 case TR_RANGE: 410 return pat->val.ch[0]+i; 411 case TR_UNINITIALIZED: 412 return -1; 413 } 414 } 415 if (pat->next == NULL) { 416 switch (pat->type) { 417 case TR_IN_ORDER: 418 return pat_str[pat->val.start_pos + pat->n - 1]; 419 case TR_RANGE: 420 return pat->val.ch[1]; 421 case TR_UNINITIALIZED: 422 return -1; 423 } 424 } 425 n_sum += pat->n; 426 pat = pat->next; 427 } 428 429 return -1; 430 } 431 432 static inline void 433 tr_bitmap_set(uint8_t bitmap[32], uint8_t ch) 434 { 435 uint8_t idx1 = ch / 8; 436 uint8_t idx2 = ch % 8; 437 bitmap[idx1] |= (1<<idx2); 438 } 439 440 static inline mrb_bool 441 tr_bitmap_detect(uint8_t bitmap[32], uint8_t ch) 442 { 443 uint8_t idx1 = ch / 8; 444 uint8_t idx2 = ch % 8; 445 if (bitmap[idx1] & (1<<idx2)) 446 return TRUE; 447 return FALSE; 448 } 449 450 /* compile patter to bitmap */ 451 static void 452 tr_compile_pattern(const struct tr_pattern *pat, mrb_value pstr, uint8_t bitmap[32]) 453 { 454 const char *pattern = RSTRING_PTR(pstr); 455 mrb_int flag_reverse = pat ? pat->flag_reverse : 0; 456 int i; 457 458 for (i=0; i<32; i++) { 459 bitmap[i] = 0; 460 } 461 while (pat != NULL) { 462 if (pat->type == TR_IN_ORDER) { 463 for (i = 0; i < pat->n; i++) { 464 tr_bitmap_set(bitmap, pattern[pat->val.start_pos + i]); 465 } 466 } 467 else if (pat->type == TR_RANGE) { 468 for (i = pat->val.ch[0]; i < pat->val.ch[1]; i++) { 469 tr_bitmap_set(bitmap, i); 470 } 471 } 472 else { 473 mrb_assert(pat->type == TR_UNINITIALIZED); 474 } 475 pat = pat->next; 476 } 477 478 if (flag_reverse) { 479 for (i=0; i<32; i++) { 480 bitmap[i] ^= 0xff; 481 } 482 } 483 } 484 485 static mrb_bool 486 str_tr(mrb_state *mrb, mrb_value str, mrb_value p1, mrb_value p2, mrb_bool squeeze) 487 { 488 struct tr_pattern pat = STATIC_TR_PATTERN; 489 struct tr_pattern rep_storage = STATIC_TR_PATTERN; 490 char *s; 491 mrb_int len; 492 mrb_int i; 493 mrb_int j; 494 mrb_bool flag_changed = FALSE; 495 mrb_int lastch = -1; 496 struct tr_pattern *rep; 497 498 mrb_str_modify(mrb, mrb_str_ptr(str)); 499 tr_parse_pattern(mrb, &pat, p1, TRUE); 500 rep = tr_parse_pattern(mrb, &rep_storage, p2, FALSE); 501 s = RSTRING_PTR(str); 502 len = RSTRING_LEN(str); 503 504 for (i=j=0; i<len; i++,j++) { 505 mrb_int n = tr_find_character(&pat, RSTRING_PTR(p1), s[i]); 506 507 if (i>j) s[j] = s[i]; 508 if (n >= 0) { 509 flag_changed = TRUE; 510 if (rep == NULL) { 511 j--; 512 } 513 else { 514 mrb_int c = tr_get_character(rep, RSTRING_PTR(p2), n); 515 516 if (c < 0 || (squeeze && c == lastch)) { 517 j--; 518 continue; 519 } 520 if (c > 0x80) { 521 mrb_raisef(mrb, E_ARGUMENT_ERROR, "character (%i) out of range", c); 522 } 523 lastch = c; 524 s[i] = (char)c; 525 } 526 } 527 } 528 529 tr_free_pattern(mrb, &pat); 530 tr_free_pattern(mrb, rep); 531 532 if (flag_changed) { 533 RSTR_SET_LEN(RSTRING(str), j); 534 RSTRING_PTR(str)[j] = 0; 535 } 536 return flag_changed; 537 } 538 539 /* 540 * call-seq: 541 * str.tr(from_str, to_str) => new_str 542 * 543 * Returns a copy of str with the characters in from_str replaced by the 544 * corresponding characters in to_str. If to_str is shorter than from_str, 545 * it is padded with its last character in order to maintain the 546 * correspondence. 547 * 548 * "hello".tr('el', 'ip') #=> "hippo" 549 * "hello".tr('aeiou', '*') #=> "h*ll*" 550 * "hello".tr('aeiou', 'AA*') #=> "hAll*" 551 * 552 * Both strings may use the c1-c2 notation to denote ranges of characters, 553 * and from_str may start with a ^, which denotes all characters except 554 * those listed. 555 * 556 * "hello".tr('a-y', 'b-z') #=> "ifmmp" 557 * "hello".tr('^aeiou', '*') #=> "*e**o" 558 * 559 * The backslash character \ can be used to escape ^ or - and is otherwise 560 * ignored unless it appears at the end of a range or the end of the 561 * from_str or to_str: 562 * 563 * 564 * "hello^world".tr("\\^aeiou", "*") #=> "h*ll**w*rld" 565 * "hello-world".tr("a\\-eo", "*") #=> "h*ll**w*rld" 566 * 567 * "hello\r\nworld".tr("\r", "") #=> "hello\nworld" 568 * "hello\r\nworld".tr("\\r", "") #=> "hello\r\nwold" 569 * "hello\r\nworld".tr("\\\r", "") #=> "hello\nworld" 570 * 571 * "X['\\b']".tr("X\\", "") #=> "['b']" 572 * "X['\\b']".tr("X-\\]", "") #=> "'b'" 573 * 574 * Note: conversion is effective only in ASCII region. 575 */ 576 static mrb_value 577 mrb_str_tr(mrb_state *mrb, mrb_value str) 578 { 579 mrb_value dup; 580 mrb_value p1, p2; 581 582 mrb_get_args(mrb, "SS", &p1, &p2); 583 dup = mrb_str_dup(mrb, str); 584 str_tr(mrb, dup, p1, p2, FALSE); 585 return dup; 586 } 587 588 /* 589 * call-seq: 590 * str.tr!(from_str, to_str) -> str or nil 591 * 592 * Translates str in place, using the same rules as String#tr. 593 * Returns str, or nil if no changes were made. 594 */ 595 static mrb_value 596 mrb_str_tr_bang(mrb_state *mrb, mrb_value str) 597 { 598 mrb_value p1, p2; 599 600 mrb_get_args(mrb, "SS", &p1, &p2); 601 if (str_tr(mrb, str, p1, p2, FALSE)) { 602 return str; 603 } 604 return mrb_nil_value(); 605 } 606 607 /* 608 * call-seq: 609 * str.tr_s(from_str, to_str) -> new_str 610 * 611 * Processes a copy of str as described under String#tr, then removes 612 * duplicate characters in regions that were affected by the translation. 613 * 614 * "hello".tr_s('l', 'r') #=> "hero" 615 * "hello".tr_s('el', '*') #=> "h*o" 616 * "hello".tr_s('el', 'hx') #=> "hhxo" 617 */ 618 static mrb_value 619 mrb_str_tr_s(mrb_state *mrb, mrb_value str) 620 { 621 mrb_value dup; 622 mrb_value p1, p2; 623 624 mrb_get_args(mrb, "SS", &p1, &p2); 625 dup = mrb_str_dup(mrb, str); 626 str_tr(mrb, dup, p1, p2, TRUE); 627 return dup; 628 } 629 630 /* 631 * call-seq: 632 * str.tr_s!(from_str, to_str) -> str or nil 633 * 634 * Performs String#tr_s processing on str in place, returning 635 * str, or nil if no changes were made. 636 */ 637 static mrb_value 638 mrb_str_tr_s_bang(mrb_state *mrb, mrb_value str) 639 { 640 mrb_value p1, p2; 641 642 mrb_get_args(mrb, "SS", &p1, &p2); 643 if (str_tr(mrb, str, p1, p2, TRUE)) { 644 return str; 645 } 646 return mrb_nil_value(); 647 } 648 649 static mrb_bool 650 str_squeeze(mrb_state *mrb, mrb_value str, mrb_value v_pat) 651 { 652 struct tr_pattern pat_storage = STATIC_TR_PATTERN; 653 struct tr_pattern *pat = NULL; 654 mrb_int i, j; 655 char *s; 656 mrb_int len; 657 mrb_bool flag_changed = FALSE; 658 mrb_int lastch = -1; 659 uint8_t bitmap[32]; 660 661 mrb_str_modify(mrb, mrb_str_ptr(str)); 662 if (!mrb_nil_p(v_pat)) { 663 pat = tr_parse_pattern(mrb, &pat_storage, v_pat, TRUE); 664 tr_compile_pattern(pat, v_pat, bitmap); 665 tr_free_pattern(mrb, pat); 666 } 667 s = RSTRING_PTR(str); 668 len = RSTRING_LEN(str); 669 670 if (pat) { 671 for (i=j=0; i<len; i++,j++) { 672 if (i>j) s[j] = s[i]; 673 if (tr_bitmap_detect(bitmap, s[i]) && s[i] == lastch) { 674 flag_changed = TRUE; 675 j--; 676 } 677 lastch = s[i]; 678 } 679 } 680 else { 681 for (i=j=0; i<len; i++,j++) { 682 if (i>j) s[j] = s[i]; 683 if (s[i] >= 0 && s[i] == lastch) { 684 flag_changed = TRUE; 685 j--; 686 } 687 lastch = s[i]; 688 } 689 } 690 691 if (flag_changed) { 692 RSTR_SET_LEN(RSTRING(str), j); 693 RSTRING_PTR(str)[j] = 0; 694 } 695 return flag_changed; 696 } 697 698 /* 699 * call-seq: 700 * str.squeeze([other_str]) -> new_str 701 * 702 * Builds a set of characters from the other_str 703 * parameter(s) using the procedure described for String#count. Returns a 704 * new string where runs of the same character that occur in this set are 705 * replaced by a single character. If no arguments are given, all runs of 706 * identical characters are replaced by a single character. 707 * 708 * "yellow moon".squeeze #=> "yelow mon" 709 * " now is the".squeeze(" ") #=> " now is the" 710 * "putters shoot balls".squeeze("m-z") #=> "puters shot balls" 711 */ 712 static mrb_value 713 mrb_str_squeeze(mrb_state *mrb, mrb_value str) 714 { 715 mrb_value pat = mrb_nil_value(); 716 mrb_value dup; 717 718 mrb_get_args(mrb, "|S", &pat); 719 dup = mrb_str_dup(mrb, str); 720 str_squeeze(mrb, dup, pat); 721 return dup; 722 } 723 724 /* 725 * call-seq: 726 * str.squeeze!([other_str]) -> str or nil 727 * 728 * Squeezes str in place, returning either str, or nil if no 729 * changes were made. 730 */ 731 static mrb_value 732 mrb_str_squeeze_bang(mrb_state *mrb, mrb_value str) 733 { 734 mrb_value pat = mrb_nil_value(); 735 736 mrb_get_args(mrb, "|S", &pat); 737 if (str_squeeze(mrb, str, pat)) { 738 return str; 739 } 740 return mrb_nil_value(); 741 } 742 743 static mrb_bool 744 str_delete(mrb_state *mrb, mrb_value str, mrb_value v_pat) 745 { 746 struct tr_pattern pat = STATIC_TR_PATTERN; 747 mrb_int i, j; 748 char *s; 749 mrb_int len; 750 mrb_bool flag_changed = FALSE; 751 uint8_t bitmap[32]; 752 753 mrb_str_modify(mrb, mrb_str_ptr(str)); 754 tr_parse_pattern(mrb, &pat, v_pat, TRUE); 755 tr_compile_pattern(&pat, v_pat, bitmap); 756 tr_free_pattern(mrb, &pat); 757 758 s = RSTRING_PTR(str); 759 len = RSTRING_LEN(str); 760 761 for (i=j=0; i<len; i++,j++) { 762 if (i>j) s[j] = s[i]; 763 if (tr_bitmap_detect(bitmap, s[i])) { 764 flag_changed = TRUE; 765 j--; 766 } 767 } 768 if (flag_changed) { 769 RSTR_SET_LEN(RSTRING(str), j); 770 RSTRING_PTR(str)[j] = 0; 771 } 772 return flag_changed; 773 } 774 775 static mrb_value 776 mrb_str_delete(mrb_state *mrb, mrb_value str) 777 { 778 mrb_value pat; 779 mrb_value dup; 780 781 mrb_get_args(mrb, "S", &pat); 782 dup = mrb_str_dup(mrb, str); 783 str_delete(mrb, dup, pat); 784 return dup; 785 } 786 787 static mrb_value 788 mrb_str_delete_bang(mrb_state *mrb, mrb_value str) 789 { 790 mrb_value pat; 791 792 mrb_get_args(mrb, "S", &pat); 793 if (str_delete(mrb, str, pat)) { 794 return str; 795 } 796 return mrb_nil_value(); 797 } 798 799 /* 800 * call_seq: 801 * str.count([other_str]) -> integer 802 * 803 * Each other_str parameter defines a set of characters to count. The 804 * intersection of these sets defines the characters to count in str. Any 805 * other_str that starts with a caret ^ is negated. The sequence c1-c2 806 * means all characters between c1 and c2. The backslash character \ can 807 * be used to escape ^ or - and is otherwise ignored unless it appears at 808 * the end of a sequence or the end of a other_str. 809 */ 810 static mrb_value 811 mrb_str_count(mrb_state *mrb, mrb_value str) 812 { 813 mrb_value v_pat = mrb_nil_value(); 814 mrb_int i; 815 char *s; 816 mrb_int len; 817 mrb_int count = 0; 818 struct tr_pattern pat = STATIC_TR_PATTERN; 819 uint8_t bitmap[32]; 820 821 mrb_get_args(mrb, "S", &v_pat); 822 tr_parse_pattern(mrb, &pat, v_pat, TRUE); 823 tr_compile_pattern(&pat, v_pat, bitmap); 824 tr_free_pattern(mrb, &pat); 825 826 s = RSTRING_PTR(str); 827 len = RSTRING_LEN(str); 828 for (i = 0; i < len; i++) { 829 if (tr_bitmap_detect(bitmap, s[i])) count++; 830 } 831 return mrb_fixnum_value(count); 832 } 833 235 834 static mrb_value 236 835 mrb_str_hex(mrb_state *mrb, mrb_value self) … … 260 859 } 261 860 262 static mrb_value 263 mrb_fixnum_chr(mrb_state *mrb, mrb_value num) 264 { 265 mrb_int cp = mrb_fixnum(num); 861 /* 862 * call-seq: 863 * int.chr([encoding]) -> string 864 * 865 * Returns a string containing the character represented by the +int+'s value 866 * according to +encoding+. +"ASCII-8BIT"+ (+"BINARY"+) and +"UTF-8"+ (only 867 * with +MRB_UTF8_STRING+) can be specified as +encoding+ (default is 868 * +"ASCII-8BIT"+). 869 * 870 * 65.chr #=> "A" 871 * 230.chr #=> "\xE6" 872 * 230.chr("ASCII-8BIT") #=> "\xE6" 873 * 230.chr("UTF-8") #=> "\u00E6" 874 */ 875 static mrb_value 876 mrb_int_chr(mrb_state *mrb, mrb_value num) 877 { 878 mrb_value enc; 879 mrb_bool enc_given; 880 881 mrb_get_args(mrb, "|S?", &enc, &enc_given); 882 if (!enc_given || 883 ENC_COMP_P(enc, ENC_ASCII_8BIT) || 884 ENC_COMP_P(enc, ENC_BINARY)) { 885 return int_chr_binary(mrb, num); 886 } 266 887 #ifdef MRB_UTF8_STRING 267 char utf8[4]; 268 mrb_int len; 269 270 if (cp < 0 || 0x10FFFF < cp) { 271 mrb_raisef(mrb, E_RANGE_ERROR, "%S out of char range", num); 272 } 273 if (cp < 0x80) { 274 utf8[0] = (char)cp; 275 len = 1; 276 } 277 else if (cp < 0x800) { 278 utf8[0] = (char)(0xC0 | (cp >> 6)); 279 utf8[1] = (char)(0x80 | (cp & 0x3F)); 280 len = 2; 281 } 282 else if (cp < 0x10000) { 283 utf8[0] = (char)(0xE0 | (cp >> 12)); 284 utf8[1] = (char)(0x80 | ((cp >> 6) & 0x3F)); 285 utf8[2] = (char)(0x80 | ( cp & 0x3F)); 286 len = 3; 287 } 888 else if (ENC_COMP_P(enc, ENC_UTF8)) { 889 return int_chr_utf8(mrb, num); 890 } 891 #endif 288 892 else { 289 utf8[0] = (char)(0xF0 | (cp >> 18)); 290 utf8[1] = (char)(0x80 | ((cp >> 12) & 0x3F)); 291 utf8[2] = (char)(0x80 | ((cp >> 6) & 0x3F)); 292 utf8[3] = (char)(0x80 | ( cp & 0x3F)); 293 len = 4; 294 } 295 return mrb_str_new(mrb, utf8, len); 296 #else 297 char c; 298 299 if (cp < 0 || 0xff < cp) { 300 mrb_raisef(mrb, E_RANGE_ERROR, "%S out of char range", num); 301 } 302 c = (char)cp; 303 return mrb_str_new(mrb, &c, 1); 304 #endif 305 } 306 307 /* 308 * call-seq: 309 * string.lines -> array of string 310 * 311 * Returns strings per line; 312 * 313 * a = "abc\ndef" 314 * a.lines #=> ["abc\n", "def"] 315 */ 316 static mrb_value 317 mrb_str_lines(mrb_state *mrb, mrb_value self) 318 { 319 mrb_value result; 320 mrb_value blk; 321 int ai; 322 mrb_int len; 323 mrb_value arg; 324 char *b = RSTRING_PTR(self); 325 char *p = b, *t; 326 char *e = b + RSTRING_LEN(self); 327 328 mrb_get_args(mrb, "&", &blk); 329 330 result = mrb_ary_new(mrb); 331 ai = mrb_gc_arena_save(mrb); 332 if (!mrb_nil_p(blk)) { 333 while (p < e) { 334 t = p; 335 while (p < e && *p != '\n') p++; 336 if (*p == '\n') p++; 337 len = (mrb_int) (p - t); 338 arg = mrb_str_new(mrb, t, len); 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); 347 } 348 return self; 349 } 350 while (p < e) { 351 t = p; 352 while (p < e && *p != '\n') p++; 353 if (*p == '\n') p++; 354 len = (mrb_int) (p - t); 355 mrb_ary_push(mrb, result, mrb_str_new(mrb, t, len)); 356 mrb_gc_arena_restore(mrb, ai); 357 } 358 return result; 893 mrb_raisef(mrb, E_ARGUMENT_ERROR, "unknown encoding name - %v", enc); 894 } 895 /* not reached */ 896 return mrb_nil_value(); 359 897 } 360 898 … … 522 1060 #endif 523 1061 524 static mrb_bool525 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 1062 /* 535 1063 * 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; 1064 * str.delete_prefix!(prefix) -> self or nil 1065 * 1066 * Deletes leading <code>prefix</code> from <i>str</i>, returning 1067 * <code>nil</code> if no change was made. 1068 * 1069 * "hello".delete_prefix!("hel") #=> "lo" 1070 * "hello".delete_prefix!("llo") #=> nil 1071 */ 1072 static mrb_value 1073 mrb_str_del_prefix_bang(mrb_state *mrb, mrb_value self) 1074 { 1075 mrb_int plen, slen; 1076 char *ptr, *s; 1077 struct RString *str = RSTRING(self); 1078 1079 mrb_get_args(mrb, "s", &ptr, &plen); 1080 slen = RSTR_LEN(str); 1081 if (plen > slen) return mrb_nil_value(); 1082 s = RSTR_PTR(str); 1083 if (memcmp(s, ptr, plen) != 0) return mrb_nil_value(); 1084 if (!mrb_frozen_p(str) && (RSTR_SHARED_P(str) || RSTR_FSHARED_P(str))) { 1085 str->as.heap.ptr += plen; 1086 } 1087 else { 1088 mrb_str_modify(mrb, str); 1089 s = RSTR_PTR(str); 1090 memmove(s, s+plen, slen-plen); 1091 } 1092 RSTR_SET_LEN(str, slen-plen); 1093 return self; 1094 } 1095 1096 /* 1097 * call-seq: 1098 * str.delete_prefix(prefix) -> new_str 1099 * 1100 * Returns a copy of <i>str</i> with leading <code>prefix</code> deleted. 1101 * 1102 * "hello".delete_prefix("hel") #=> "lo" 1103 * "hello".delete_prefix("llo") #=> "hello" 1104 */ 1105 static mrb_value 1106 mrb_str_del_prefix(mrb_state *mrb, mrb_value self) 1107 { 1108 mrb_int plen, slen; 1109 char *ptr; 1110 1111 mrb_get_args(mrb, "s", &ptr, &plen); 1112 slen = RSTRING_LEN(self); 1113 if (plen > slen) return mrb_str_dup(mrb, self); 1114 if (memcmp(RSTRING_PTR(self), ptr, plen) != 0) 1115 return mrb_str_dup(mrb, self); 1116 return mrb_str_substr(mrb, self, plen, slen-plen); 1117 } 1118 1119 /* 1120 * call-seq: 1121 * str.delete_suffix!(suffix) -> self or nil 1122 * 1123 * Deletes trailing <code>suffix</code> from <i>str</i>, returning 1124 * <code>nil</code> if no change was made. 1125 * 1126 * "hello".delete_suffix!("llo") #=> "he" 1127 * "hello".delete_suffix!("hel") #=> nil 1128 */ 1129 static mrb_value 1130 mrb_str_del_suffix_bang(mrb_state *mrb, mrb_value self) 1131 { 1132 mrb_int plen, slen; 1133 char *ptr, *s; 1134 struct RString *str = RSTRING(self); 1135 1136 mrb_get_args(mrb, "s", &ptr, &plen); 1137 slen = RSTR_LEN(str); 1138 if (plen > slen) return mrb_nil_value(); 1139 s = RSTR_PTR(str); 1140 if (memcmp(s+slen-plen, ptr, plen) != 0) return mrb_nil_value(); 1141 if (!mrb_frozen_p(str) && (RSTR_SHARED_P(str) || RSTR_FSHARED_P(str))) { 1142 /* no need to modify string */ 1143 } 1144 else { 1145 mrb_str_modify(mrb, str); 1146 } 1147 RSTR_SET_LEN(str, slen-plen); 1148 return self; 1149 } 1150 1151 /* 1152 * call-seq: 1153 * str.delete_suffix(suffix) -> new_str 1154 * 1155 * Returns a copy of <i>str</i> with leading <code>suffix</code> deleted. 1156 * 1157 * "hello".delete_suffix("hel") #=> "lo" 1158 * "hello".delete_suffix("llo") #=> "hello" 1159 */ 1160 static mrb_value 1161 mrb_str_del_suffix(mrb_state *mrb, mrb_value self) 1162 { 1163 mrb_int plen, slen; 1164 char *ptr; 1165 1166 mrb_get_args(mrb, "s", &ptr, &plen); 1167 slen = RSTRING_LEN(self); 1168 if (plen > slen) return mrb_str_dup(mrb, self); 1169 if (memcmp(RSTRING_PTR(self)+slen-plen, ptr, plen) != 0) 1170 return mrb_str_dup(mrb, self); 1171 return mrb_str_substr(mrb, self, 0, slen-plen); 1172 } 1173 1174 static mrb_value 1175 mrb_str_lines(mrb_state *mrb, mrb_value self) 1176 { 1177 mrb_value result; 1178 int ai; 1179 mrb_int len; 1180 char *b = RSTRING_PTR(self); 1181 char *p = b, *t; 1182 char *e = b + RSTRING_LEN(self); 1183 1184 result = mrb_ary_new(mrb); 1185 ai = mrb_gc_arena_save(mrb); 1186 while (p < e) { 1187 t = p; 1188 while (p < e && *p != '\n') p++; 1189 if (*p == '\n') p++; 1190 len = (mrb_int) (p - t); 1191 mrb_ary_push(mrb, result, mrb_str_new(mrb, t, len)); 639 1192 mrb_gc_arena_restore(mrb, ai); 640 1193 } 641 642 return beg; 1194 return result; 643 1195 } 644 1196 … … 649 1201 650 1202 mrb_define_method(mrb, s, "dump", mrb_str_dump, MRB_ARGS_NONE()); 651 mrb_define_method(mrb, s, "getbyte", mrb_str_getbyte, MRB_ARGS_REQ(1));652 mrb_define_method(mrb, s, "setbyte", mrb_str_setbyte, MRB_ARGS_REQ(2));653 mrb_define_method(mrb, s, "byteslice", mrb_str_byteslice, MRB_ARGS_REQ(1)|MRB_ARGS_OPT(1));654 1203 mrb_define_method(mrb, s, "swapcase!", mrb_str_swapcase_bang, MRB_ARGS_NONE()); 655 1204 mrb_define_method(mrb, s, "swapcase", mrb_str_swapcase, MRB_ARGS_NONE()); 656 mrb_define_method(mrb, s, "concat", mrb_str_concat2, MRB_ARGS_REQ(1)); 657 mrb_define_method(mrb, s, "<<", mrb_str_concat2, MRB_ARGS_REQ(1)); 1205 mrb_define_method(mrb, s, "concat", mrb_str_concat_m, MRB_ARGS_REQ(1)); 1206 mrb_define_method(mrb, s, "<<", mrb_str_concat_m, MRB_ARGS_REQ(1)); 1207 mrb_define_method(mrb, s, "count", mrb_str_count, MRB_ARGS_REQ(1)); 1208 mrb_define_method(mrb, s, "tr", mrb_str_tr, MRB_ARGS_REQ(2)); 1209 mrb_define_method(mrb, s, "tr!", mrb_str_tr_bang, MRB_ARGS_REQ(2)); 1210 mrb_define_method(mrb, s, "tr_s", mrb_str_tr_s, MRB_ARGS_REQ(2)); 1211 mrb_define_method(mrb, s, "tr_s!", mrb_str_tr_s_bang, MRB_ARGS_REQ(2)); 1212 mrb_define_method(mrb, s, "squeeze", mrb_str_squeeze, MRB_ARGS_OPT(1)); 1213 mrb_define_method(mrb, s, "squeeze!", mrb_str_squeeze_bang, MRB_ARGS_OPT(1)); 1214 mrb_define_method(mrb, s, "delete", mrb_str_delete, MRB_ARGS_REQ(1)); 1215 mrb_define_method(mrb, s, "delete!", mrb_str_delete_bang, MRB_ARGS_REQ(1)); 658 1216 mrb_define_method(mrb, s, "start_with?", mrb_str_start_with, MRB_ARGS_REST()); 659 1217 mrb_define_method(mrb, s, "end_with?", mrb_str_end_with, MRB_ARGS_REST()); … … 661 1219 mrb_define_method(mrb, s, "oct", mrb_str_oct, MRB_ARGS_NONE()); 662 1220 mrb_define_method(mrb, s, "chr", mrb_str_chr, MRB_ARGS_NONE()); 663 mrb_define_method(mrb, s, "lines", mrb_str_lines, MRB_ARGS_NONE());664 1221 mrb_define_method(mrb, s, "succ", mrb_str_succ, MRB_ARGS_NONE()); 665 1222 mrb_define_method(mrb, s, "succ!", mrb_str_succ_bang, MRB_ARGS_NONE()); 666 mrb_alias_method(mrb, s, mrb_intern_lit(mrb, "next"), mrb_intern_lit(mrb, "succ")); 667 mrb_alias_method(mrb, s, mrb_intern_lit(mrb, "next!"), mrb_intern_lit(mrb, "succ!")); 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()); 670 671 mrb_define_method(mrb, mrb->fixnum_class, "chr", mrb_fixnum_chr, MRB_ARGS_NONE()); 1223 mrb_define_method(mrb, s, "next", mrb_str_succ, MRB_ARGS_NONE()); 1224 mrb_define_method(mrb, s, "next!", mrb_str_succ_bang, MRB_ARGS_NONE()); 1225 mrb_define_method(mrb, s, "ord", mrb_str_ord, MRB_ARGS_NONE()); 1226 mrb_define_method(mrb, s, "delete_prefix!", mrb_str_del_prefix_bang, MRB_ARGS_REQ(1)); 1227 mrb_define_method(mrb, s, "delete_prefix", mrb_str_del_prefix, MRB_ARGS_REQ(1)); 1228 mrb_define_method(mrb, s, "delete_suffix!", mrb_str_del_suffix_bang, MRB_ARGS_REQ(1)); 1229 mrb_define_method(mrb, s, "delete_suffix", mrb_str_del_suffix, MRB_ARGS_REQ(1)); 1230 1231 mrb_define_method(mrb, s, "__lines", mrb_str_lines, MRB_ARGS_NONE()); 1232 1233 mrb_define_method(mrb, mrb_module_get(mrb, "Integral"), "chr", mrb_int_chr, MRB_ARGS_OPT(1)); 672 1234 } 673 1235 -
EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-string-ext/test/string.rb
r331 r439 1 # coding: utf-8 1 2 ## 2 3 # String(Ext) Test 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 12 13 assert('String#getbyte') do 14 str1 = "hello" 15 bytes1 = [104, 101, 108, 108, 111] 16 assert_equal bytes1[0], str1.getbyte(0) 17 assert_equal bytes1[-1], str1.getbyte(-1) 18 assert_equal bytes1[6], str1.getbyte(6) 19 20 str2 = "\xFF" 21 bytes2 = [0xFF] 22 assert_equal bytes2[0], str2.getbyte(0) 23 end 24 25 assert('String#setbyte') do 26 str1 = "hello" 27 h = "H".getbyte(0) 28 str1.setbyte(0, h) 29 assert_equal(h, str1.getbyte(0)) 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) } 43 end 44 45 assert('String#byteslice') do 46 str1 = "hello" 47 assert_equal("e", str1.byteslice(1)) 48 assert_equal("o", str1.byteslice(-1)) 49 assert_equal("ell", str1.byteslice(1..3)) 50 assert_equal("el", str1.byteslice(1...3)) 5 UTF8STRING = __ENCODING__ == "UTF-8" 6 7 def assert_upto(exp, receiver, *args) 8 act = [] 9 receiver.upto(*args) { |v| act << v } 10 assert_equal exp, act 51 11 end 52 12 53 13 assert('String#dump') do 54 ("\1" * 100).dump # should not raise an exception - regress #1210 55 "\0".inspect == "\"\\000\"" and 56 "foo".dump == "\"foo\"" 14 assert_equal("\"\\x00\"", "\0".dump) 15 assert_equal("\"foo\"", "foo".dump) 16 assert_equal('"\xe3\x82\x8b"', "る".dump) 17 assert_nothing_raised { ("\1" * 100).dump } # regress #1210 57 18 end 58 19 59 20 assert('String#strip') do 60 21 s = " abc " 61 "".strip == "" and " \t\r\n\f\v".strip == "" and 62 "\0a\0".strip == "\0a" and 63 "abc".strip == "abc" and 64 " abc".strip == "abc" and 65 "abc ".strip == "abc" and 66 " abc ".strip == "abc" and 67 s == " abc " 22 assert_equal("abc", s.strip) 23 assert_equal(" abc ", s) 24 assert_equal("", "".strip) 25 assert_equal("", " \t\r\n\f\v".strip) 26 assert_equal("\0a", "\0a\0".strip) 27 assert_equal("abc", "abc".strip) 28 assert_equal("abc", " abc".strip) 29 assert_equal("abc", "abc ".strip) 68 30 end 69 31 70 32 assert('String#lstrip') do 71 33 s = " abc " 72 s.lstrip73 "".lstrip == "" and " \t\r\n\f\v".lstrip == "" and74 "\0a\0".lstrip == "\0a\0" and75 "abc".lstrip == "abc" and76 " abc".lstrip == "abc" and77 "abc ".lstrip == "abc " and78 " abc ".lstrip == "abc " and79 s == " abc "34 assert_equal("abc ", s.lstrip) 35 assert_equal(" abc ", s) 36 assert_equal("", "".lstrip) 37 assert_equal("", " \t\r\n\f\v".lstrip) 38 assert_equal("\0a\0", "\0a\0".lstrip) 39 assert_equal("abc", "abc".lstrip) 40 assert_equal("abc", " abc".lstrip) 41 assert_equal("abc ", "abc ".lstrip) 80 42 end 81 43 82 44 assert('String#rstrip') do 83 45 s = " abc " 84 s.rstrip85 "".rstrip == "" and " \t\r\n\f\v".rstrip == "" and86 "\0a\0".rstrip == "\0a" and87 "abc".rstrip == "abc" and88 " abc".rstrip == " abc" and89 "abc ".rstrip == "abc" and90 " abc ".rstrip == " abc" and91 s == " abc "46 assert_equal(" abc", s.rstrip) 47 assert_equal(" abc ", s) 48 assert_equal("", "".rstrip) 49 assert_equal("", " \t\r\n\f\v".rstrip) 50 assert_equal("\0a", "\0a\0".rstrip) 51 assert_equal("abc", "abc".rstrip) 52 assert_equal(" abc", " abc".rstrip) 53 assert_equal("abc", "abc ".rstrip) 92 54 end 93 55 … … 95 57 s = " abc " 96 58 t = "abc" 97 s.strip! == "abc" and s == "abc" and t.strip! == nil 59 assert_equal("abc", s.strip!) 60 assert_equal("abc", s) 61 assert_nil(t.strip!) 62 assert_equal("abc", t) 98 63 end 99 64 … … 101 66 s = " abc " 102 67 t = "abc " 103 s.lstrip! == "abc " and s == "abc " and t.lstrip! == nil 68 assert_equal("abc ", s.lstrip!) 69 assert_equal("abc ", s) 70 assert_nil(t.lstrip!) 71 assert_equal("abc ", t) 104 72 end 105 73 … … 107 75 s = " abc " 108 76 t = " abc" 109 s.rstrip! == " abc" and s == " abc" and t.rstrip! == nil 77 assert_equal(" abc", s.rstrip!) 78 assert_equal(" abc", s) 79 assert_nil(t.rstrip!) 80 assert_equal(" abc", t) 110 81 end 111 82 … … 125 96 assert_equal "Hello World!", "Hello " << "World" << 33 126 97 assert_equal "Hello World!", "Hello ".concat("World").concat(33) 127 128 o = Object.new129 def o.to_str130 "to_str"131 end132 assert_equal "hi to_str", "hi " << o133 134 98 assert_raise(TypeError) { "".concat(Object.new) } 99 100 if UTF8STRING 101 assert_equal "H«", "H" << 0xab 102 assert_equal "Hは", "H" << 12399 103 else 104 assert_equal "H\xab", "H" << 0xab 105 assert_raise(RangeError) { "H" << 12399 } 106 end 135 107 end 136 108 … … 140 112 assert_equal(-1, "abcdef".casecmp("abcdefg")) 141 113 assert_equal 0, "abcdef".casecmp("ABCDEF") 142 o = Object.new 143 def o.to_str 144 "ABCDEF" 145 end 146 assert_equal 0, "abcdef".casecmp(o) 114 end 115 116 assert('String#count') do 117 s = "abccdeff123" 118 assert_equal 0, s.count("") 119 assert_equal 1, s.count("a") 120 assert_equal 2, s.count("ab") 121 assert_equal 9, s.count("^c") 122 assert_equal 8, s.count("a-z") 123 assert_equal 4, s.count("a0-9") 124 end 125 126 assert('String#tr') do 127 assert_equal "ABC", "abc".tr('a-z', 'A-Z') 128 assert_equal "hippo", "hello".tr('el', 'ip') 129 assert_equal "Ruby", "Lisp".tr("Lisp", "Ruby") 130 assert_equal "*e**o", "hello".tr('^aeiou', '*') 131 assert_equal "heo", "hello".tr('l', '') 132 end 133 134 assert('String#tr!') do 135 s = "abcdefghijklmnopqR" 136 assert_equal "ab12222hijklmnopqR", s.tr!("cdefg", "12") 137 assert_equal "ab12222hijklmnopqR", s 138 end 139 140 assert('String#tr_s') do 141 assert_equal "hero", "hello".tr_s('l', 'r') 142 assert_equal "h*o", "hello".tr_s('el', '*') 143 assert_equal "hhxo", "hello".tr_s('el', 'hx') 144 end 145 146 assert('String#tr_s!') do 147 s = "hello" 148 assert_equal "hero", s.tr_s!('l', 'r') 149 assert_equal "hero", s 150 assert_nil s.tr_s!('l', 'r') 151 end 152 153 assert('String#squeeze') do 154 assert_equal "yelow mon", "yellow moon".squeeze 155 assert_equal " now is the", " now is the".squeeze(" ") 156 assert_equal "puters shot balls", "putters shoot balls".squeeze("m-z") 157 end 158 159 assert('String#squeeze!') do 160 s = " now is the" 161 assert_equal " now is the", s.squeeze!(" ") 162 assert_equal " now is the", s 163 end 164 165 assert('String#delete') do 166 assert_equal "he", "hello".delete("lo") 167 assert_equal "hll", "hello".delete("aeiou") 168 assert_equal "ll", "hello".delete("^l") 169 assert_equal "ho", "hello".delete("ej-m") 170 end 171 172 assert('String#delete!') do 173 s = "hello" 174 assert_equal "he", s.delete!("lo") 175 assert_equal "he", s 176 assert_nil s.delete!("lz") 147 177 end 148 178 … … 202 232 assert_equal 8, "010".oct 203 233 assert_equal (-8), "-10".oct 204 end205 206 assert('String#chr') do207 assert_equal "a", "abcde".chr208 # test Fixnum#chr as well209 assert_equal "a", 97.chr210 234 end 211 235 … … 496 520 497 521 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 522 assert_upto %w(a8 a9 b0 b1 b2 b3 b4 b5 b6), "a8", "b6" 523 assert_upto ["9", "10", "11"], "9", "11" 524 assert_upto [], "25", "5" 525 assert_upto ["07", "08", "09", "10", "11"], "07", "11" 526 assert_upto ["9", ":", ";", "<", "=", ">", "?", "@", "A"], "9", "A" 527 528 if UTF8STRING 529 assert_upto %w(あ ぃ い ぅ う ぇ え ぉ お), "あ", "お" 530 end 508 531 509 532 a = "aa" … … 587 610 588 611 assert('String#chr') do 612 assert_equal "a", "abcde".chr 589 613 assert_equal "h", "hello!".chr 590 end 614 assert_equal "", "".chr 615 end 616 591 617 assert('String#chr(UTF-8)') do 592 618 assert_equal "こ", "こんにちは世界!".chr … … 614 640 615 641 assert('String#each_char') do 616 s = ""642 chars = [] 617 643 "hello!".each_char do |x| 618 s +=x619 end 620 assert_equal "hello!",s644 chars << x 645 end 646 assert_equal ["h", "e", "l", "l", "o", "!"], chars 621 647 end 622 648 623 649 assert('String#each_char(UTF-8)') do 624 s = ""650 chars = [] 625 651 "こんにちは世界!".each_char do |x| 626 s +=x627 end 628 assert_equal "こんにちは世界!",s652 chars << x 653 end 654 assert_equal ["こ", "ん", "に", "ち", "は", "世", "界", "!"], chars 629 655 end if UTF8STRING 630 656 … … 666 692 assert_equal expect, cp 667 693 end if UTF8STRING 694 695 assert('String#delete_prefix') do 696 assert_equal "llo", "hello".delete_prefix("he") 697 assert_equal "hello", "hello".delete_prefix("llo") 698 assert_equal "llo", "hello".delete_prefix!("he") 699 assert_nil "hello".delete_prefix!("llo") 700 end 701 702 assert('String#delete_suffix') do 703 assert_equal "he", "hello".delete_suffix("llo") 704 assert_equal "hello", "hello".delete_suffix("he") 705 assert_equal "he", "hello".delete_suffix!("llo") 706 assert_nil "hello".delete_suffix!("he") 707 end -
EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-struct/mrblib/struct.rb
r331 r439 47 47 end 48 48 49 def _inspect 49 def _inspect(recur_list) 50 return "#<struct #{self.class}:...>" if recur_list[self.object_id] 51 recur_list[self.object_id] = true 50 52 name = self.class.to_s 51 53 if name[0] == "#" … … 56 58 buf = [] 57 59 self.each_pair do |k,v| 58 buf.push [k.to_s + "=" + v._inspect]60 buf.push k.to_s + "=" + v._inspect(recur_list) 59 61 end 60 62 str + buf.join(", ") + ">" … … 71 73 # 72 74 def inspect 73 begin 74 self._inspect 75 rescue SystemStackError 76 "#<struct #{self.class.to_s}:...>" 77 end 75 self._inspect({}) 78 76 end 79 77 … … 82 80 # 83 81 alias to_s inspect 84 end85 82 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 83 ## 84 # call-seq: 85 # hsh.dig(key,...) -> object 86 # 87 # Extracts the nested value specified by the sequence of <i>key</i> 88 # objects by calling +dig+ at each step, returning +nil+ if any 89 # intermediate step is +nil+. 90 # 91 def dig(idx,*args) 92 n = self[idx] 93 if args.size > 0 94 n&.dig(*args) 95 else 96 n 97 end 100 98 end 101 99 end 102 100 end 103 -
EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-struct/src/struct.c
r331 r439 13 13 #include <mruby/hash.h> 14 14 #include <mruby/range.h> 15 16 #define RSTRUCT_LEN(st) mrb_ary_ptr(st)->len 17 #define RSTRUCT_PTR(st) mrb_ary_ptr(st)->ptr 15 #include <mruby/proc.h> 16 17 #define RSTRUCT_LEN(st) RARRAY_LEN(st) 18 #define RSTRUCT_PTR(st) RARRAY_PTR(st) 18 19 19 20 static struct RClass * … … 24 25 25 26 static inline mrb_value 26 struct_ivar_get(mrb_state *mrb, mrb_value c , mrb_sym id)27 { 28 struct RClass* kclass;27 struct_ivar_get(mrb_state *mrb, mrb_value cls, mrb_sym id) 28 { 29 struct RClass* c = mrb_class_ptr(cls); 29 30 struct RClass* sclass = struct_class(mrb); 30 31 mrb_value ans; 31 32 32 33 for (;;) { 33 ans = mrb_iv_get(mrb, c, id);34 ans = mrb_iv_get(mrb, mrb_obj_value(c), id); 34 35 if (!mrb_nil_p(ans)) return ans; 35 kclass = RCLASS_SUPER(c);36 if ( kclass == 0 || kclass == sclass)36 c = c->super; 37 if (c == sclass || c == 0) 37 38 return mrb_nil_value(); 38 c = mrb_obj_value(kclass);39 39 } 40 40 } … … 67 67 else { 68 68 mrb_raisef(mrb, E_TYPE_ERROR, 69 "struct size differs (% S required %Sgiven)",70 mrb_fixnum_value(RARRAY_LEN(members)), mrb_fixnum_value(RSTRUCT_LEN(s)));69 "struct size differs (%i required %i given)", 70 RARRAY_LEN(members), RSTRUCT_LEN(s)); 71 71 } 72 72 } … … 88 88 mrb_struct_modify(mrb_state *mrb, mrb_value strct) 89 89 { 90 if (MRB_FROZEN_P(mrb_basic_ptr(strct))) { 91 mrb_raise(mrb, E_RUNTIME_ERROR, "can't modify frozen struct"); 92 } 93 90 mrb_check_frozen(mrb, mrb_basic_ptr(strct)); 94 91 mrb_write_barrier(mrb, mrb_basic_ptr(strct)); 95 92 } … … 114 111 } 115 112 116 static mrb_value struct_aref_sym(mrb_state *mrb, mrb_value obj, mrb_sym id);117 118 113 static mrb_value 119 114 mrb_struct_ref(mrb_state *mrb, mrb_value obj) 120 115 { 121 return struct_aref_sym(mrb, obj, mrb->c->ci->mid); 116 mrb_int i = mrb_fixnum(mrb_proc_cfunc_env_get(mrb, 0)); 117 mrb_value *ptr = RSTRUCT_PTR(obj); 118 119 if (!ptr) return mrb_nil_value(); 120 return ptr[i]; 122 121 } 123 122 … … 125 124 mrb_id_attrset(mrb_state *mrb, mrb_sym id) 126 125 { 126 #define ONSTACK_ALLOC_MAX 32 127 #define ONSTACK_STRLEN_MAX (ONSTACK_ALLOC_MAX - 1) /* '=' character */ 128 127 129 const char *name; 128 130 char *buf; 129 131 mrb_int len; 130 132 mrb_sym mid; 131 132 name = mrb_sym2name_len(mrb, id, &len); 133 buf = (char *)mrb_malloc(mrb, (size_t)len+2); 133 char onstack[ONSTACK_ALLOC_MAX]; 134 135 name = mrb_sym_name_len(mrb, id, &len); 136 if (len > ONSTACK_STRLEN_MAX) { 137 buf = (char *)mrb_malloc(mrb, (size_t)len+1); 138 } 139 else { 140 buf = onstack; 141 } 134 142 memcpy(buf, name, (size_t)len); 135 143 buf[len] = '='; 136 buf[len+1] = '\0';137 144 138 145 mid = mrb_intern(mrb, buf, len+1); 139 mrb_free(mrb, buf); 146 if (buf != onstack) { 147 mrb_free(mrb, buf); 148 } 140 149 return mid; 141 150 } 142 151 143 static mrb_value mrb_struct_aset_sym(mrb_state *mrb, mrb_value s, mrb_sym id, mrb_value val);144 145 152 static mrb_value 146 153 mrb_struct_set_m(mrb_state *mrb, mrb_value obj) 147 154 { 155 mrb_int i = mrb_fixnum(mrb_proc_cfunc_env_get(mrb, 0)); 156 mrb_value *ptr; 148 157 mrb_value val; 149 158 150 const char *name;151 mrb_int slen;152 mrb_sym mid;153 154 159 mrb_get_args(mrb, "o", &val); 155 156 /* get base id */ 157 name = mrb_sym2name_len(mrb, mrb->c->ci->mid, &slen); 158 mid = mrb_intern(mrb, name, slen-1); /* omit last "=" */ 159 160 return mrb_struct_aset_sym(mrb, obj, mid, val); 161 } 162 163 static mrb_bool 164 is_local_id(mrb_state *mrb, const char *name) 165 { 166 if (!name) return FALSE; 167 return !ISUPPER(name[0]); 168 } 169 170 static mrb_bool 171 is_const_id(mrb_state *mrb, const char *name) 172 { 173 if (!name) return FALSE; 174 return ISUPPER(name[0]); 160 mrb_struct_modify(mrb, obj); 161 ptr = RSTRUCT_PTR(obj); 162 if (ptr == NULL || i >= RSTRUCT_LEN(obj)) { 163 mrb_ary_set(mrb, obj, i, val); 164 } 165 else { 166 ptr[i] = val; 167 } 168 return val; 175 169 } 176 170 … … 185 179 for (i=0; i<len; i++) { 186 180 mrb_sym id = mrb_symbol(ptr_members[i]); 187 const char *name = mrb_sym2name_len(mrb, id, NULL); 188 189 if (is_local_id(mrb, name) || is_const_id(mrb, name)) { 190 mrb_define_method_id(mrb, c, id, mrb_struct_ref, MRB_ARGS_NONE()); 191 mrb_define_method_id(mrb, c, mrb_id_attrset(mrb, id), mrb_struct_set_m, MRB_ARGS_REQ(1)); 192 mrb_gc_arena_restore(mrb, ai); 193 } 194 } 195 } 196 197 static mrb_value 198 make_struct(mrb_state *mrb, mrb_value name, mrb_value members, struct RClass * klass) 181 mrb_method_t m; 182 mrb_value at = mrb_fixnum_value(i); 183 struct RProc *aref = mrb_proc_new_cfunc_with_env(mrb, mrb_struct_ref, 1, &at); 184 struct RProc *aset = mrb_proc_new_cfunc_with_env(mrb, mrb_struct_set_m, 1, &at); 185 MRB_METHOD_FROM_PROC(m, aref); 186 mrb_define_method_raw(mrb, c, id, m); 187 MRB_METHOD_FROM_PROC(m, aset); 188 mrb_define_method_raw(mrb, c, mrb_id_attrset(mrb, id), m); 189 mrb_gc_arena_restore(mrb, ai); 190 } 191 } 192 193 static mrb_value 194 make_struct(mrb_state *mrb, mrb_value name, mrb_value members, struct RClass *klass) 199 195 { 200 196 mrb_value nstr; … … 207 203 else { 208 204 /* old style: should we warn? */ 209 name = mrb_str_to_str(mrb, name);205 mrb_to_str(mrb, name); 210 206 id = mrb_obj_to_sym(mrb, name); 211 if (! is_const_id(mrb, mrb_sym2name_len(mrb, id, NULL))) {212 mrb_name_error(mrb, id, "identifier % Sneeds to be constant", name);207 if (!mrb_const_name_p(mrb, RSTRING_PTR(name), RSTRING_LEN(name))) { 208 mrb_name_error(mrb, id, "identifier %v needs to be constant", name); 213 209 } 214 210 if (mrb_const_defined_at(mrb, mrb_obj_value(klass), id)) { 215 mrb_warn(mrb, "redefining constant Struct::% S", name);211 mrb_warn(mrb, "redefining constant Struct::%v", name); 216 212 mrb_const_remove(mrb, mrb_obj_value(klass), id); 217 213 } … … 277 273 278 274 name = mrb_nil_value(); 279 rest = mrb_nil_value();280 275 mrb_get_args(mrb, "*&", &argv, &argc, &b); 281 276 if (argc == 0) { /* special case to avoid crash */ 282 rest = mrb_ary_new(mrb);277 mrb_argnum_error(mrb, argc, 1, -1); 283 278 } 284 279 else { 285 if (argc > 0) name = argv[0]; 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++; 280 pargv = argv; 281 argcnt = argc; 282 if (argc > 0) { 283 name = argv[0]; 284 if (mrb_symbol_p(name)) { 285 /* 1stArgument:symbol -> name=nil rest=argv[0..n] */ 286 name = mrb_nil_value(); 287 } 288 else { 289 pargv++; 290 argcnt--; 291 } 293 292 } 294 293 rest = mrb_ary_new_from_values(mrb, argcnt, pargv); 295 for (i=0; i< RARRAY_LEN(rest); i++) {294 for (i=0; i<argcnt; i++) { 296 295 id = mrb_obj_to_sym(mrb, RARRAY_PTR(rest)[i]); 297 296 mrb_ary_set(mrb, rest, i, mrb_symbol_value(id)); 298 297 } 299 } 300 st = make_struct(mrb, name, rest, mrb_class_ptr(klass)); 301 if (!mrb_nil_p(b)) { 302 mrb_yield_with_class(mrb, b, 1, &st, st, mrb_class_ptr(st)); 303 } 304 305 return st; 298 st = make_struct(mrb, name, rest, mrb_class_ptr(klass)); 299 if (!mrb_nil_p(b)) { 300 mrb_yield_with_class(mrb, b, 1, &st, st, mrb_class_ptr(st)); 301 } 302 303 return st; 304 } 305 /* not reached */ 306 return mrb_nil_value(); 306 307 } 307 308 … … 347 348 mrb_int argc; 348 349 349 mrb_get_args(mrb, "* ", &argv, &argc);350 mrb_get_args(mrb, "*!", &argv, &argc); 350 351 return mrb_struct_initialize_withArg(mrb, argc, argv, self); 351 352 } … … 388 389 } 389 390 } 390 mrb_ raisef(mrb, E_INDEX_ERROR, "'%S' is not a struct member", mrb_sym2str(mrb, id));391 mrb_name_error(mrb, id, "no member '%n' in struct", id); 391 392 return mrb_nil_value(); /* not reached */ 392 393 } … … 395 396 struct_aref_int(mrb_state *mrb, mrb_value s, mrb_int i) 396 397 { 397 if (i < 0) i = RSTRUCT_LEN(s) + i; 398 if (i < 0) 399 mrb_raisef(mrb, E_INDEX_ERROR, 400 "offset %S too small for struct(size:%S)", 401 mrb_fixnum_value(i), mrb_fixnum_value(RSTRUCT_LEN(s))); 402 if (RSTRUCT_LEN(s) <= i) 398 mrb_int idx = i < 0 ? RSTRUCT_LEN(s) + i : i; 399 400 if (idx < 0) 403 401 mrb_raisef(mrb, E_INDEX_ERROR, 404 "offset %S too large for struct(size:%S)", 405 mrb_fixnum_value(i), mrb_fixnum_value(RSTRUCT_LEN(s))); 406 return RSTRUCT_PTR(s)[i]; 402 "offset %i too small for struct(size:%i)", i, RSTRUCT_LEN(s)); 403 if (RSTRUCT_LEN(s) <= idx) 404 mrb_raisef(mrb, E_INDEX_ERROR, 405 "offset %i too large for struct(size:%i)", i, RSTRUCT_LEN(s)); 406 return RSTRUCT_PTR(s)[idx]; 407 407 } 408 408 … … 436 436 437 437 if (mrb_nil_p(sym)) { 438 mrb_name_error(mrb, mrb_intern_str(mrb, idx), "no member '% S' in struct", idx);438 mrb_name_error(mrb, mrb_intern_str(mrb, idx), "no member '%v' in struct", idx); 439 439 } 440 440 idx = sym; … … 464 464 } 465 465 } 466 mrb_name_error(mrb, id, "no member '% S' in struct", mrb_sym2str(mrb, id));466 mrb_name_error(mrb, id, "no member '%n' in struct", id); 467 467 return val; /* not reach */ 468 468 } … … 503 503 504 504 if (mrb_nil_p(sym)) { 505 mrb_name_error(mrb, mrb_intern_str(mrb, idx), "no member '% S' in struct", idx);505 mrb_name_error(mrb, mrb_intern_str(mrb, idx), "no member '%v' in struct", idx); 506 506 } 507 507 idx = sym; … … 515 515 if (i < 0) { 516 516 mrb_raisef(mrb, E_INDEX_ERROR, 517 "offset %S too small for struct(size:%S)", 518 mrb_fixnum_value(i), mrb_fixnum_value(RSTRUCT_LEN(s))); 517 "offset %i too small for struct(size:%i)", i, RSTRUCT_LEN(s)); 519 518 } 520 519 if (RSTRUCT_LEN(s) <= i) { 521 520 mrb_raisef(mrb, E_INDEX_ERROR, 522 "offset %S too large for struct(size:%S)", 523 mrb_fixnum_value(i), mrb_fixnum_value(RSTRUCT_LEN(s))); 521 "offset %i too large for struct(size:%i)", i, RSTRUCT_LEN(s)); 524 522 } 525 523 mrb_struct_modify(mrb, s); -
EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-struct/test/struct.rb
r331 r439 10 10 assert_equal Struct, c.superclass 11 11 assert_equal [:m1, :m2], c.members 12 end13 14 # Check crash bug with Struc.new and no params.15 assert('Struct.new', '15.2.18.3.1') do16 c = Struct.new()17 assert_equal Struct, c.superclass18 assert_equal [], c.members19 12 end 20 13 … … 124 117 125 118 assert('struct inspect') do 126 c = Struct.new(:m1, :m2, :m3, :m4, :m5) 127 cc = c.new(1,2,3,4,5) 128 assert_equal "#<struct m1=1, m2=2, m3=3, m4=4, m5=5>", cc.inspect 119 c = Struct.new(:m1, :m2, :m3, :m4, :m5, :recur) 120 cc = c.new(1,2,3,4,5,nil) 121 cc.recur = cc 122 assert_equal "#<struct m1=1, m2=2, m3=3, m4=4, m5=5, recur=#<struct #{cc.class}:...>>", cc.inspect 129 123 end 130 124 … … 160 154 end 161 155 162 assert("Struct.new removes existing constant") do 163 skip "redefining Struct with same name cause warnings" 164 begin165 assert_not_equal Struct.new("Test", :a), Struct.new("Test", :a, :b)166 ensure167 Struct.remove_const :Test168 end169 end156 # TODO: suppress redefining Struct warning during test 157 # assert("Struct.new removes existing constant") do 158 # begin 159 # assert_not_equal Struct.new("Test", :a), Struct.new("Test", :a, :b) 160 # ensure 161 # Struct.remove_const :Test 162 # end 163 # end 170 164 171 165 assert("Struct#initialize_copy requires struct to be the same type") do … … 189 183 end 190 184 185 assert("Struct.new does not allow invalid class name") do 186 assert_raise(NameError) { Struct.new("Test-", :a) } 187 end 188 191 189 assert("Struct.new generates subclass of Struct") do 192 190 begin 193 191 original_struct = Struct 194 192 Struct = String 195 assert_equal original_struct, original_struct.new .superclass193 assert_equal original_struct, original_struct.new(:foo).superclass 196 194 ensure 197 195 Struct = original_struct … … 207 205 208 206 o.freeze 209 assert_raise( RuntimeError) { o.m = :modify }210 assert_raise( RuntimeError) { o[:m] = :modify }207 assert_raise(FrozenError) { o.m = :modify } 208 assert_raise(FrozenError) { o[:m] = :modify } 211 209 assert_equal :test, o.m 212 210 end -
EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-symbol-ext/mrblib/symbol.rb
r321 r439 3 3 4 4 alias intern to_sym 5 6 def to_proc7 ->(obj,*args,&block) do8 obj.__send__(self, *args, &block)9 end10 end11 5 12 6 ## … … 49 43 return nil unless other.kind_of?(Symbol) 50 44 lhs = self.to_s; lhs.upcase! 51 rhs = other.to_s ; rhs.upcase!45 rhs = other.to_s.upcase 52 46 lhs <=> rhs 47 end 48 49 ## 50 # call-seq: 51 # sym.casecmp?(other) -> true, false, or nil 52 # 53 # Returns true if sym and other_sym are equal after case folding, 54 # false if they are not equal, and nil if other_sym is not a string. 55 56 def casecmp?(sym) 57 c = self.casecmp(sym) 58 return nil if c.nil? 59 return c == 0 53 60 end 54 61 -
EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-symbol-ext/src/symbol.c
r331 r439 2 2 #include <mruby/khash.h> 3 3 #include <mruby/array.h> 4 5 typedef struct symbol_name { 6 size_t len; 7 const char *name; 8 } symbol_name; 4 #include <mruby/string.h> 9 5 10 6 /* … … 23 19 * :wait2, :$>] 24 20 */ 21 #ifdef MRB_ENABLE_ALL_SYMBOLS 25 22 static mrb_value 26 23 mrb_sym_all_symbols(mrb_state *mrb, mrb_value self) … … 30 27 31 28 for (i=1, lim=mrb->symidx+1; i<lim; i++) { 32 mrb_ary_push(mrb, ary, mrb_symbol_value(i)); 29 mrb_sym sym = i<<1; 30 mrb_ary_push(mrb, ary, mrb_symbol_value(sym)); 33 31 } 34 32 35 33 return ary; 36 34 } 35 #endif 37 36 38 37 /* … … 46 45 { 47 46 mrb_int len; 48 mrb_sym2name_len(mrb, mrb_symbol(self), &len); 47 #ifdef MRB_UTF8_STRING 48 mrb_int byte_len; 49 const char *name = mrb_sym_name_len(mrb, mrb_symbol(self), &byte_len); 50 len = mrb_utf8_strlen(name, byte_len); 51 #else 52 mrb_sym_name_len(mrb, mrb_symbol(self), &len); 53 #endif 49 54 return mrb_fixnum_value(len); 50 55 } … … 54 59 { 55 60 struct RClass *s = mrb->symbol_class; 61 #ifdef MRB_ENABLE_ALL_SYMBOLS 56 62 mrb_define_class_method(mrb, s, "all_symbols", mrb_sym_all_symbols, MRB_ARGS_NONE()); 63 #endif 57 64 mrb_define_method(mrb, s, "length", mrb_sym_length, MRB_ARGS_NONE()); 58 65 mrb_define_method(mrb, s, "size", mrb_sym_length, MRB_ARGS_NONE()); -
EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-symbol-ext/test/symbol.rb
r321 r439 1 # coding: utf-8 1 2 ## 2 3 # Symbol(Ext) Test 3 4 4 assert('Symbol#to_proc') do 5 assert_equal 5, :abs.to_proc[-5] 5 if Symbol.respond_to?(:all_symbols) 6 assert('Symbol.all_symbols') do 7 foo = [:__symbol_test_1, :__symbol_test_2, :__symbol_test_3].sort 8 symbols = Symbol.all_symbols.select{|sym|sym.to_s.include? '__symbol_test'}.sort 9 assert_equal foo, symbols 10 end 6 11 end 7 12 8 assert('Symbol.all_symbols') do 9 foo = [:__symbol_test_1, :__symbol_test_2, :__symbol_test_3].sort 10 symbols = Symbol.all_symbols.select{|sym|sym.to_s.include? '__symbol_test'}.sort 11 assert_equal foo, symbols 12 end 13 14 assert("Symbol#length") do 15 assert_equal 5, :hello.size 16 assert_equal 5, :mruby.length 13 %w[size length].each do |n| 14 assert("Symbol##{n}") do 15 assert_equal 5, :hello.__send__(n) 16 assert_equal 4, :"aA\0b".__send__(n) 17 if __ENCODING__ == "UTF-8" 18 assert_equal 8, :"こんにちは世界!".__send__(n) 19 assert_equal 4, :"aあ\0b".__send__(n) 20 else 21 assert_equal 22, :"こんにちは世界!".__send__(n) 22 assert_equal 6, :"aあ\0b".__send__(n) 23 end 24 end 17 25 end 18 26 -
EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-test/driver.c
r331 r439 19 19 #include <mruby/array.h> 20 20 21 void 22 mrb_init_mrbtest(mrb_state *); 21 extern const uint8_t mrbtest_assert_irep[]; 22 23 void mrbgemtest_init(mrb_state* mrb); 24 void mrb_init_test_vformat(mrb_state* mrb); 23 25 24 26 /* Print a short remark for the user */ … … 30 32 31 33 static int 32 check_error(mrb_state *mrb)33 {34 /* Error check */35 /* $ko_test and $kill_test should be 0 */36 mrb_value ko_test = mrb_gv_get(mrb, mrb_intern_lit(mrb, "$ko_test"));37 mrb_value kill_test = mrb_gv_get(mrb, mrb_intern_lit(mrb, "$kill_test"));38 39 return mrb_fixnum_p(ko_test) && mrb_fixnum(ko_test) == 0 && mrb_fixnum_p(kill_test) && mrb_fixnum(kill_test) == 0;40 }41 42 static int43 34 eval_test(mrb_state *mrb) 44 35 { 45 36 /* evaluate the test */ 46 mrb_ funcall(mrb, mrb_top_self(mrb), "report", 0);37 mrb_value result = mrb_funcall(mrb, mrb_top_self(mrb), "report", 0); 47 38 /* did an exception occur? */ 48 39 if (mrb->exc) { … … 51 42 return EXIT_FAILURE; 52 43 } 53 else if (!check_error(mrb)) { 54 return EXIT_FAILURE; 55 } 56 return EXIT_SUCCESS; 57 } 58 59 static void 60 t_printstr(mrb_state *mrb, mrb_value obj) 61 { 62 char *s; 63 int len; 64 65 if (mrb_string_p(obj)) { 66 s = RSTRING_PTR(obj); 67 len = RSTRING_LEN(obj); 68 fwrite(s, len, 1, stdout); 69 } 70 } 71 72 mrb_value 73 mrb_t_printstr(mrb_state *mrb, mrb_value self) 74 { 75 mrb_value argv; 76 77 mrb_get_args(mrb, "o", &argv); 78 t_printstr(mrb, argv); 79 80 return argv; 44 else { 45 return mrb_bool(result) ? EXIT_SUCCESS : EXIT_FAILURE; 46 } 47 } 48 49 /* Implementation of print due to the reason that there might be no print */ 50 static mrb_value 51 t_print(mrb_state *mrb, mrb_value self) 52 { 53 mrb_value *argv; 54 mrb_int argc; 55 mrb_int i; 56 57 mrb_get_args(mrb, "*!", &argv, &argc); 58 for (i = 0; i < argc; ++i) { 59 mrb_value s = mrb_obj_as_string(mrb, argv[i]); 60 fwrite(RSTRING_PTR(s), RSTRING_LEN(s), 1, stdout); 61 } 62 fflush(stdout); 63 64 return mrb_nil_value(); 65 } 66 67 #define UNESCAPE(p, endp) ((p) != (endp) && *(p) == '\\' ? (p)+1 : (p)) 68 #define CHAR_CMP(c1, c2) ((unsigned char)(c1) - (unsigned char)(c2)) 69 70 static const char * 71 str_match_bracket(const char *p, const char *pat_end, 72 const char *s, const char *str_end) 73 { 74 mrb_bool ok = FALSE, negated = FALSE; 75 76 if (p == pat_end) return NULL; 77 if (*p == '!' || *p == '^') { 78 negated = TRUE; 79 ++p; 80 } 81 82 while (*p != ']') { 83 const char *t1 = p; 84 if ((t1 = UNESCAPE(t1, pat_end)) == pat_end) return NULL; 85 if ((p = t1 + 1) == pat_end) return NULL; 86 if (p[0] == '-' && p[1] != ']') { 87 const char *t2 = p + 1; 88 if ((t2 = UNESCAPE(t2, pat_end)) == pat_end) return NULL; 89 p = t2 + 1; 90 if (!ok && CHAR_CMP(*t1, *s) <= 0 && CHAR_CMP(*s, *t2) <= 0) ok = TRUE; 91 } 92 else { 93 if (!ok && CHAR_CMP(*t1, *s) == 0) ok = TRUE; 94 } 95 } 96 97 return ok == negated ? NULL : p + 1; 98 } 99 100 static mrb_bool 101 str_match_no_brace_p(const char *pat, mrb_int pat_len, 102 const char *str, mrb_int str_len) 103 { 104 const char *p = pat, *s = str; 105 const char *pat_end = pat + pat_len, *str_end = str + str_len; 106 const char *p_tmp = NULL, *s_tmp = NULL; 107 108 for (;;) { 109 if (p == pat_end) return s == str_end; 110 switch (*p) { 111 case '*': 112 do { ++p; } while (p != pat_end && *p == '*'); 113 if (UNESCAPE(p, pat_end) == pat_end) return TRUE; 114 if (s == str_end) return FALSE; 115 p_tmp = p; 116 s_tmp = s; 117 continue; 118 case '?': 119 if (s == str_end) return FALSE; 120 ++p; 121 ++s; 122 continue; 123 case '[': { 124 const char *t; 125 if (s == str_end) return FALSE; 126 if ((t = str_match_bracket(p+1, pat_end, s, str_end))) { 127 p = t; 128 ++s; 129 continue; 130 } 131 goto L_failed; 132 } 133 } 134 135 /* ordinary */ 136 p = UNESCAPE(p, pat_end); 137 if (s == str_end) return p == pat_end; 138 if (p == pat_end) goto L_failed; 139 if (*p++ != *s++) goto L_failed; 140 continue; 141 142 L_failed: 143 if (p_tmp && s_tmp) { 144 /* try next '*' position */ 145 p = p_tmp; 146 s = ++s_tmp; 147 continue; 148 } 149 150 return FALSE; 151 } 152 } 153 154 #define COPY_AND_INC(dst, src, len) \ 155 do { memcpy(dst, src, len); dst += len; } while (0) 156 157 static mrb_bool 158 str_match_p(mrb_state *mrb, 159 const char *pat, mrb_int pat_len, 160 const char *str, mrb_int str_len) 161 { 162 const char *p = pat, *pat_end = pat + pat_len; 163 const char *lbrace = NULL, *rbrace = NULL; 164 int nest = 0; 165 mrb_bool ret = FALSE; 166 167 for (; p != pat_end; ++p) { 168 if (*p == '{' && nest++ == 0) lbrace = p; 169 else if (*p == '}' && lbrace && --nest == 0) { rbrace = p; break; } 170 else if (*p == '\\' && ++p == pat_end) break; 171 } 172 173 if (lbrace && rbrace) { 174 /* expand brace */ 175 char *ex_pat = (char *)mrb_malloc(mrb, pat_len-2); /* expanded pattern */ 176 char *ex_p = ex_pat; 177 178 COPY_AND_INC(ex_p, pat, lbrace-pat); 179 p = lbrace; 180 while (p < rbrace) { 181 char *orig_ex_p = ex_p; 182 const char *t = ++p; 183 for (nest = 0; p < rbrace && !(*p == ',' && nest == 0); ++p) { 184 if (*p == '{') ++nest; 185 else if (*p == '}') --nest; 186 else if (*p == '\\' && ++p == rbrace) break; 187 } 188 COPY_AND_INC(ex_p, t, p-t); 189 COPY_AND_INC(ex_p, rbrace+1, pat_end-rbrace-1); 190 if ((ret = str_match_p(mrb, ex_pat, ex_p-ex_pat, str, str_len))) break; 191 ex_p = orig_ex_p; 192 } 193 mrb_free(mrb, ex_pat); 194 } 195 else if (!lbrace && !rbrace) { 196 ret = str_match_no_brace_p(pat, pat_len, str, str_len); 197 } 198 199 return ret; 200 } 201 202 static mrb_value 203 m_str_match_p(mrb_state *mrb, mrb_value self) 204 { 205 const char *pat, *str; 206 mrb_int pat_len, str_len; 207 208 mrb_get_args(mrb, "ss", &pat, &pat_len, &str, &str_len); 209 return mrb_bool_value(str_match_p(mrb, pat, pat_len, str, str_len)); 81 210 } 82 211 … … 87 216 88 217 krn = mrb->kernel_module; 89 mrb_define_method(mrb, krn, "__t_printstr__", mrb_t_printstr, MRB_ARGS_REQ(1)); 218 mrb_define_method(mrb, krn, "t_print", t_print, MRB_ARGS_ANY()); 219 mrb_define_method(mrb, krn, "_str_match?", m_str_match_p, MRB_ARGS_REQ(2)); 90 220 91 221 mrbtest = mrb_define_module(mrb, "Mrbtest"); … … 95 225 mrb_define_const(mrb, mrbtest, "FIXNUM_BIT", mrb_fixnum_value(MRB_INT_BIT)); 96 226 227 #ifndef MRB_WITHOUT_FLOAT 97 228 #ifdef MRB_USE_FLOAT 98 229 mrb_define_const(mrb, mrbtest, "FLOAT_TOLERANCE", mrb_float_value(mrb, 1e-6)); … … 100 231 mrb_define_const(mrb, mrbtest, "FLOAT_TOLERANCE", mrb_float_value(mrb, 1e-12)); 101 232 #endif 233 #endif 234 235 mrb_init_test_vformat(mrb); 102 236 103 237 if (verbose) { … … 128 262 TEST_COUNT_PASS(ko_test); 129 263 TEST_COUNT_PASS(kill_test); 264 TEST_COUNT_PASS(warning_test); 265 TEST_COUNT_PASS(skip_test); 130 266 131 267 #undef TEST_COUNT_PASS … … 165 301 166 302 mrb_init_test_driver(mrb, verbose); 167 mrb_init_mrbtest(mrb); 303 mrb_load_irep(mrb, mrbtest_assert_irep); 304 mrbgemtest_init(mrb); 168 305 ret = eval_test(mrb); 169 306 mrb_close(mrb); -
EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-test/mrbgem.rake
r331 r439 13 13 exec = exefile("#{build.build_dir}/bin/mrbtest") 14 14 15 libmruby = libfile("#{build.build_dir}/lib/libmruby")16 libmruby_core = libfile("#{build.build_dir}/lib/libmruby_core")17 18 15 mrbtest_lib = libfile("#{build_dir}/mrbtest") 19 16 mrbtest_objs = [] 20 17 21 driver_obj = objfile("#{build_dir}/driver") 22 driver = "#{spec.dir}/driver.c" 18 driver_objs = Dir.glob("#{dir}/*.{c,cpp,cxx,cc,m,asm,s,S}").map do |f| 19 objfile(f.relative_path_from(dir).to_s.pathmap("#{build_dir}/%X")) 20 end 23 21 24 22 assert_c = "#{build_dir}/assert.c" … … 28 26 29 27 file assert_lib => assert_c 30 file assert_c => assert_rbdo |t|28 file assert_c => [assert_rb, build.mrbcfile] do |t| 31 29 open(t.name, 'w') do |f| 32 30 mrbc.run f, assert_rb, 'mrbtest_assert_irep' … … 42 40 43 41 file test_rbobj => g.test_rbireps 44 file g.test_rbireps => [g.test_rbfiles ].flatten do |t|45 FileUtils.mkdir_p File.dirname(t.name)42 file g.test_rbireps => [g.test_rbfiles, build.mrbcfile].flatten do |t| 43 mkdir_p File.dirname(t.name) 46 44 open(t.name, 'w') do |f| 47 45 g.print_gem_test_header(f) … … 98 96 f.puts %Q[ if (mrb2->exc) {] 99 97 f.puts %Q[ mrb_print_error(mrb2);] 98 f.puts %Q[ mrb_close(mrb2);] 100 99 f.puts %Q[ exit(EXIT_FAILURE);] 101 100 f.puts %Q[ }] … … 136 135 137 136 unless build.build_mrbtest_lib_only? 138 file exec => [ driver_obj, mlib, mrbtest_lib, libmruby_core, libmruby] do |t|137 file exec => [*driver_objs, mlib, mrbtest_lib, build.libmruby_static] do |t| 139 138 gem_flags = build.gems.map { |g| g.linker.flags } 140 139 gem_flags_before_libraries = build.gems.map { |g| g.linker.flags_before_libraries } … … 142 141 gem_libraries = build.gems.map { |g| g.linker.libraries } 143 142 gem_library_paths = build.gems.map { |g| g.linker.library_paths } 144 build.linker.run t.name, t.prerequisites, gem_libraries, gem_library_paths, gem_flags, gem_flags_before_libraries 143 build.linker.run t.name, t.prerequisites, gem_libraries, gem_library_paths, gem_flags, 144 gem_flags_before_libraries, gem_flags_after_libraries 145 145 end 146 146 end 147 148 init = "#{spec.dir}/init_mrbtest.c"149 147 150 148 # store the last gem selection and make the re-build 151 149 # of the test gem depending on a change to the gem 152 150 # 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.name158 end151 active_gems_path = "#{build_dir}/active_gems_path.lst" 152 active_gem_list = File.read active_gems_path if File.exist? active_gems_path 153 current_gem_list = build.gems.map(&:name).join("\n") 154 task active_gems_path do |_t| 155 mkdir_p File.dirname(active_gems_path) 156 File.write active_gems_path, current_gem_list 159 157 end 160 file clib => active_gems 158 file clib => active_gems_path if active_gem_list != current_gem_list 161 159 162 160 file mlib => clib 163 file clib => init do |t|161 file clib => [build.mrbcfile, __FILE__] do |_t| 164 162 _pp "GEN", "*.rb", "#{clib.relative_path}" 165 FileUtils.mkdir_p File.dirname(clib)163 mkdir_p File.dirname(clib) 166 164 open(clib, 'w') do |f| 167 165 f.puts %Q[/*] … … 174 172 f.puts %Q[ */] 175 173 f.puts %Q[] 176 f.puts IO.read(init) 174 f.puts %Q[struct mrb_state;] 175 f.puts %Q[typedef struct mrb_state mrb_state;] 177 176 build.gems.each do |g| 178 177 f.puts %Q[void GENERATED_TMP_mrb_#{g.funcname}_gem_test(mrb_state *mrb);] -
EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-time/src/time.c
r331 r439 5 5 */ 6 6 7 #ifndef MRB_WITHOUT_FLOAT 7 8 #include <math.h> 8 #include <time.h> 9 #endif 10 9 11 #include <mruby.h> 10 12 #include <mruby/class.h> 11 13 #include <mruby/data.h> 12 13 #i fndef DISABLE_STDIO14 #include <stdio.h> 15 # else14 #include <mruby/numeric.h> 15 #include <mruby/time.h> 16 17 #ifdef MRB_DISABLE_STDIO 16 18 #include <string.h> 17 19 #endif 18 20 21 #include <stdlib.h> 22 19 23 #define NDIV(x,y) (-(-((x)+1)/(y))-1) 20 21 #if _MSC_VER < 1800 24 #define TO_S_FMT "%Y-%m-%d %H:%M:%S " 25 26 #if defined(_MSC_VER) && _MSC_VER < 1800 22 27 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 31 32 #if !defined(__MINGW64__) && defined(_WIN32) 33 # define llround(x) round(x) 28 return floor(x + 0.5); 29 } 30 #endif 31 32 #ifndef MRB_WITHOUT_FLOAT 33 # if !defined(__MINGW64__) && defined(_WIN32) 34 # define llround(x) round(x) 35 # endif 34 36 #endif 35 37 … … 52 54 53 55 #ifdef _WIN32 54 #if _MSC_VER56 #ifdef _MSC_VER 55 57 /* Win32 platform do not provide gmtime_r/localtime_r; emulate them using gmtime_s/localtime_s */ 56 58 #define gmtime_r(tp, tm) ((gmtime_s((tm), (tp)) == 0) ? (tm) : NULL) … … 144 146 unsigned int *nday = (unsigned int*) ndays[is_leapyear(tm->tm_year+1900)]; 145 147 146 for (i = 70; i < tm->tm_year; ++i) 147 r += is_leapyear(i+1900) ? 366*24*60*60 : 365*24*60*60; 148 static const int epoch_year = 70; 149 if(tm->tm_year >= epoch_year) { 150 for (i = epoch_year; i < tm->tm_year; ++i) 151 r += is_leapyear(i+1900) ? 366*24*60*60 : 365*24*60*60; 152 } else { 153 for (i = tm->tm_year; i < epoch_year; ++i) 154 r -= is_leapyear(i+1900) ? 366*24*60*60 : 365*24*60*60; 155 } 148 156 for (i = 0; i < tm->tm_mon; ++i) 149 157 r += nday[i] * 24 * 60 * 60; … … 161 169 */ 162 170 163 enum mrb_timezone {164 MRB_TIMEZONE_NONE = 0,165 MRB_TIMEZONE_UTC = 1,166 MRB_TIMEZONE_LOCAL = 2,167 MRB_TIMEZONE_LAST = 3168 };169 170 171 typedef struct mrb_timezone_name { 171 172 const char name[8]; … … 179 180 }; 180 181 181 #ifndef DISABLE_STDIO182 #ifndef MRB_DISABLE_STDIO 182 183 static const char mon_names[12][4] = { 183 184 "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", … … 198 199 static const struct mrb_data_type mrb_time_type = { "Time", mrb_free }; 199 200 201 #ifndef MRB_WITHOUT_FLOAT 202 void mrb_check_num_exact(mrb_state *mrb, mrb_float num); 203 typedef mrb_float mrb_sec; 204 #define mrb_sec_value(mrb, sec) mrb_float_value(mrb, sec) 205 #else 206 typedef mrb_int mrb_sec; 207 #define mrb_sec_value(mrb, sec) mrb_fixnum_value(sec) 208 #endif 209 210 #define MRB_TIME_T_UINT (~(time_t)0 > 0) 211 #define MRB_TIME_MIN ( \ 212 MRB_TIME_T_UINT ? 0 : \ 213 (sizeof(time_t) <= 4 ? INT32_MIN : INT64_MIN) \ 214 ) 215 #define MRB_TIME_MAX ( \ 216 MRB_TIME_T_UINT ? (sizeof(time_t) <= 4 ? UINT32_MAX : UINT64_MAX) : \ 217 (sizeof(time_t) <= 4 ? INT32_MAX : INT64_MAX) \ 218 ) 219 220 static mrb_bool 221 fixable_time_t_p(time_t v) 222 { 223 if (MRB_INT_MIN <= MRB_TIME_MIN && MRB_TIME_MAX <= MRB_INT_MAX) return TRUE; 224 return FIXABLE(v); 225 } 226 227 static time_t 228 mrb_to_time_t(mrb_state *mrb, mrb_value obj, time_t *usec) 229 { 230 time_t t; 231 232 switch (mrb_type(obj)) { 233 #ifndef MRB_WITHOUT_FLOAT 234 case MRB_TT_FLOAT: 235 { 236 mrb_float f = mrb_float(obj); 237 238 mrb_check_num_exact(mrb, f); 239 if (f >= ((mrb_float)MRB_TIME_MAX-1.0) || f < ((mrb_float)MRB_TIME_MIN+1.0)) { 240 goto out_of_range; 241 } 242 243 if (usec) { 244 t = (time_t)f; 245 *usec = (time_t)llround((f - t) * 1.0e+6); 246 } 247 else { 248 t = (time_t)llround(f); 249 } 250 } 251 break; 252 #endif /* MRB_WITHOUT_FLOAT */ 253 default: 254 case MRB_TT_FIXNUM: 255 { 256 mrb_int i = mrb_int(mrb, obj); 257 258 if ((MRB_INT_MAX > MRB_TIME_MAX && i > 0 && i > (mrb_int)MRB_TIME_MAX) || 259 (MRB_TIME_MIN > MRB_INT_MIN && MRB_TIME_MIN > i)) { 260 goto out_of_range; 261 } 262 263 t = (time_t)i; 264 if (usec) { *usec = 0; } 265 } 266 break; 267 } 268 269 return t; 270 271 out_of_range: 272 mrb_raisef(mrb, E_ARGUMENT_ERROR, "%v out of Time range", obj); 273 274 /* not reached */ 275 if (usec) { *usec = 0; } 276 return 0; 277 } 278 200 279 /** Updates the datetime of a mrb_time based on it's timezone and 201 seconds setting. Returns self on success, NULL of failure. */ 280 seconds setting. Returns self on success, NULL of failure. 281 if `dealloc` is set `true`, it frees `self` on error. */ 202 282 static struct mrb_time* 203 time_update_datetime(mrb_state *mrb, struct mrb_time *self )283 time_update_datetime(mrb_state *mrb, struct mrb_time *self, int dealloc) 204 284 { 205 285 struct tm *aid; 286 time_t t = self->sec; 206 287 207 288 if (self->timezone == MRB_TIMEZONE_UTC) { 208 aid = gmtime_r(& self->sec, &self->datetime);289 aid = gmtime_r(&t, &self->datetime); 209 290 } 210 291 else { 211 aid = localtime_r(& self->sec, &self->datetime);292 aid = localtime_r(&t, &self->datetime); 212 293 } 213 294 if (!aid) { 214 mrb_raisef(mrb, E_ARGUMENT_ERROR, "%S out of Time range", mrb_float_value(mrb, (mrb_float)self->sec)); 295 mrb_sec sec = (mrb_sec)t; 296 297 if (dealloc) mrb_free(mrb, self); 298 mrb_raisef(mrb, E_ARGUMENT_ERROR, "%v out of Time range", mrb_sec_value(mrb, sec)); 215 299 /* not reached */ 216 300 return NULL; … … 229 313 } 230 314 231 void mrb_check_num_exact(mrb_state *mrb, mrb_float num);232 233 315 /* Allocates a mrb_time object and initializes it. */ 234 316 static struct mrb_time* 235 time_alloc(mrb_state *mrb, double sec, double usec, enum mrb_timezone timezone) 236 { 237 struct mrb_time *tm; 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 243 if (sizeof(time_t) == 4 && (sec > (double)INT32_MAX || (double)INT32_MIN > sec)) { 244 goto out_of_range; 245 } 246 if (sizeof(time_t) == 8 && (sec > (double)INT64_MAX || (double)INT64_MIN > sec)) { 247 goto out_of_range; 248 } 249 tsec = (time_t)sec; 250 if ((sec > 0 && tsec < 0) || (sec < 0 && (double)tsec > sec)) { 251 out_of_range: 252 mrb_raisef(mrb, E_ARGUMENT_ERROR, "%S out of Time range", mrb_float_value(mrb, sec)); 253 } 317 time_alloc_time(mrb_state *mrb, time_t sec, time_t usec, enum mrb_timezone timezone) 318 { 319 struct mrb_time *tm; 320 254 321 tm = (struct mrb_time *)mrb_malloc(mrb, sizeof(struct mrb_time)); 255 tm->sec = tsec;256 tm->usec = (time_t)llround((sec - tm->sec) * 1.0e6 + usec);322 tm->sec = sec; 323 tm->usec = usec; 257 324 if (tm->usec < 0) { 258 long sec2 = (long)NDIV( usec,1000000); /* negative div */325 long sec2 = (long)NDIV(tm->usec,1000000); /* negative div */ 259 326 tm->usec -= sec2 * 1000000; 260 327 tm->sec += sec2; 261 328 } 262 329 else if (tm->usec >= 1000000) { 263 long sec2 = (long)( usec / 1000000);330 long sec2 = (long)(tm->usec / 1000000); 264 331 tm->usec -= sec2 * 1000000; 265 332 tm->sec += sec2; 266 333 } 267 334 tm->timezone = timezone; 268 time_update_datetime(mrb, tm );335 time_update_datetime(mrb, tm, TRUE); 269 336 270 337 return tm; 271 338 } 272 339 273 static mrb_value 274 mrb_time_make(mrb_state *mrb, struct RClass *c, double sec, double usec, enum mrb_timezone timezone) 340 static struct mrb_time* 341 time_alloc(mrb_state *mrb, mrb_value sec, mrb_value usec, enum mrb_timezone timezone) 342 { 343 time_t tsec, tusec; 344 345 tsec = mrb_to_time_t(mrb, sec, &tusec); 346 tusec += mrb_to_time_t(mrb, usec, NULL); 347 348 return time_alloc_time(mrb, tsec, tusec, timezone); 349 } 350 351 static mrb_value 352 mrb_time_make_time(mrb_state *mrb, struct RClass *c, time_t sec, time_t usec, enum mrb_timezone timezone) 353 { 354 return mrb_time_wrap(mrb, c, time_alloc_time(mrb, sec, usec, timezone)); 355 } 356 357 static mrb_value 358 mrb_time_make(mrb_state *mrb, struct RClass *c, mrb_value sec, mrb_value usec, enum mrb_timezone timezone) 275 359 { 276 360 return mrb_time_wrap(mrb, c, time_alloc(mrb, sec, usec, timezone)); … … 280 364 current_mrb_time(mrb_state *mrb) 281 365 { 282 struct mrb_time *tm; 283 284 tm = (struct mrb_time *)mrb_malloc(mrb, sizeof(*tm)); 285 #if defined(TIME_UTC) 366 struct mrb_time tmzero = {0}; 367 struct mrb_time *tm; 368 time_t sec, usec; 369 370 #if defined(TIME_UTC) && !defined(__ANDROID__) 286 371 { 287 372 struct timespec ts; 288 373 if (timespec_get(&ts, TIME_UTC) == 0) { 289 mrb_free(mrb, tm);290 374 mrb_raise(mrb, E_RUNTIME_ERROR, "timespec_get() failed for unknown reasons"); 291 375 } 292 tm->sec = ts.tv_sec;293 tm->usec = ts.tv_nsec / 1000;376 sec = ts.tv_sec; 377 usec = ts.tv_nsec / 1000; 294 378 } 295 379 #elif defined(NO_GETTIMEOFDAY) … … 297 381 static time_t last_sec = 0, last_usec = 0; 298 382 299 tm->sec= time(NULL);300 if ( tm->sec != last_sec) {301 last_sec = tm->sec;383 sec = time(NULL); 384 if (sec != last_sec) { 385 last_sec = sec; 302 386 last_usec = 0; 303 387 } … … 306 390 last_usec += 1; 307 391 } 308 tm->usec = last_usec;392 usec = last_usec; 309 393 } 310 394 #else … … 313 397 314 398 gettimeofday(&tv, NULL); 315 tm->sec = tv.tv_sec; 316 tm->usec = tv.tv_usec; 317 } 318 #endif 399 sec = tv.tv_sec; 400 usec = tv.tv_usec; 401 } 402 #endif 403 tm = (struct mrb_time *)mrb_malloc(mrb, sizeof(*tm)); 404 *tm = tmzero; 405 tm->sec = sec; tm->usec = usec; 319 406 tm->timezone = MRB_TIMEZONE_LOCAL; 320 time_update_datetime(mrb, tm );407 time_update_datetime(mrb, tm, TRUE); 321 408 322 409 return tm; … … 328 415 { 329 416 return mrb_time_wrap(mrb, mrb_class_ptr(self), current_mrb_time(mrb)); 417 } 418 419 MRB_API mrb_value 420 mrb_time_at(mrb_state *mrb, time_t sec, time_t usec, enum mrb_timezone zone) 421 { 422 return mrb_time_make_time(mrb, mrb_class_get(mrb, "Time"), sec, usec, zone); 330 423 } 331 424 … … 333 426 /* Creates an instance of time at the given time in seconds, etc. */ 334 427 static mrb_value 335 mrb_time_at(mrb_state *mrb, mrb_value self) 336 { 337 mrb_float f, f2 = 0; 338 339 mrb_get_args(mrb, "f|f", &f, &f2); 340 return mrb_time_make(mrb, mrb_class_ptr(self), f, f2, MRB_TIMEZONE_LOCAL); 428 mrb_time_at_m(mrb_state *mrb, mrb_value self) 429 { 430 mrb_value sec; 431 mrb_value usec = mrb_fixnum_value(0); 432 433 mrb_get_args(mrb, "o|o", &sec, &usec); 434 435 return mrb_time_make(mrb, mrb_class_ptr(self), sec, usec, MRB_TIMEZONE_LOCAL); 341 436 } 342 437 … … 375 470 } 376 471 377 return time_alloc (mrb, (double)nowsecs, ausec, timezone);472 return time_alloc_time(mrb, nowsecs, ausec, timezone); 378 473 } 379 474 … … 461 556 mrb_time_plus(mrb_state *mrb, mrb_value self) 462 557 { 463 mrb_float f; 464 struct mrb_time *tm; 465 466 mrb_get_args(mrb, "f", &f); 467 tm = time_get_ptr(mrb, self); 468 return mrb_time_make(mrb, mrb_obj_class(mrb, self), (double)tm->sec+f, (double)tm->usec, tm->timezone); 558 mrb_value o; 559 struct mrb_time *tm; 560 time_t sec, usec; 561 562 mrb_get_args(mrb, "o", &o); 563 tm = time_get_ptr(mrb, self); 564 sec = mrb_to_time_t(mrb, o, &usec); 565 return mrb_time_make_time(mrb, mrb_obj_class(mrb, self), tm->sec+sec, tm->usec+usec, tm->timezone); 469 566 } 470 567 … … 472 569 mrb_time_minus(mrb_state *mrb, mrb_value self) 473 570 { 474 mrb_float f;475 571 mrb_value other; 476 572 struct mrb_time *tm, *tm2; … … 480 576 tm2 = DATA_CHECK_GET_PTR(mrb, other, &mrb_time_type, struct mrb_time); 481 577 if (tm2) { 482 f = (mrb_float)(tm->sec - tm2->sec) 483 + (mrb_float)(tm->usec - tm2->usec) / 1.0e6; 578 #ifndef MRB_WITHOUT_FLOAT 579 mrb_float f; 580 f = (mrb_sec)(tm->sec - tm2->sec) 581 + (mrb_sec)(tm->usec - tm2->usec) / 1.0e6; 484 582 return mrb_float_value(mrb, f); 583 #else 584 mrb_int f; 585 f = tm->sec - tm2->sec; 586 if (tm->usec < tm2->usec) f--; 587 return mrb_fixnum_value(f); 588 #endif 485 589 } 486 590 else { 487 mrb_get_args(mrb, "f", &f); 488 return mrb_time_make(mrb, mrb_obj_class(mrb, self), (double)tm->sec-f, (double)tm->usec, tm->timezone); 591 time_t sec, usec; 592 sec = mrb_to_time_t(mrb, other, &usec); 593 return mrb_time_make_time(mrb, mrb_obj_class(mrb, self), tm->sec-sec, tm->usec-usec, tm->timezone); 489 594 } 490 595 } … … 547 652 int len; 548 653 549 #if defined( DISABLE_STDIO)654 #if defined(MRB_DISABLE_STDIO) 550 655 char *s; 551 656 # ifdef NO_ASCTIME_R … … 559 664 char buf[256]; 560 665 561 len = snprintf(buf, sizeof(buf), "%s %s % 02d %02d:%02d:%02d %s%d",666 len = snprintf(buf, sizeof(buf), "%s %s %2d %02d:%02d:%02d %.4d", 562 667 wday_names[d->tm_wday], mon_names[d->tm_mon], d->tm_mday, 563 668 d->tm_hour, d->tm_min, d->tm_sec, 564 tm->timezone == MRB_TIMEZONE_UTC ? "UTC " : "",565 669 d->tm_year + 1900); 566 670 #endif … … 603 707 *tm2 = *tm; 604 708 tm2->timezone = MRB_TIMEZONE_UTC; 605 time_update_datetime(mrb, tm2 );709 time_update_datetime(mrb, tm2, TRUE); 606 710 return mrb_time_wrap(mrb, mrb_obj_class(mrb, self), tm2); 607 711 } … … 618 722 *tm2 = *tm; 619 723 tm2->timezone = MRB_TIMEZONE_LOCAL; 620 time_update_datetime(mrb, tm2 );724 time_update_datetime(mrb, tm2, TRUE); 621 725 return mrb_time_wrap(mrb, mrb_obj_class(mrb, self), tm2); 622 726 } … … 640 744 mrb_int ayear = 0, amonth = 1, aday = 1, ahour = 0, 641 745 amin = 0, asec = 0, ausec = 0; 642 int n;746 mrb_int n; 643 747 struct mrb_time *tm; 644 748 … … 696 800 tm = time_get_ptr(mrb, self); 697 801 tm->timezone = MRB_TIMEZONE_LOCAL; 698 time_update_datetime(mrb, tm );802 time_update_datetime(mrb, tm, FALSE); 699 803 return self; 700 804 } … … 744 848 } 745 849 746 850 #ifndef MRB_WITHOUT_FLOAT 747 851 /* 15.2.19.7.24 */ 748 852 /* Returns a Float with the time since the epoch in seconds. */ … … 755 859 return mrb_float_value(mrb, (mrb_float)tm->sec + (mrb_float)tm->usec/1.0e6); 756 860 } 861 #endif 757 862 758 863 /* 15.2.19.7.25 */ 759 /* Returns a Fixnumwith the time since the epoch in seconds. */864 /* Returns an Integer with the time since the epoch in seconds. */ 760 865 static mrb_value 761 866 mrb_time_to_i(mrb_state *mrb, mrb_value self) … … 764 869 765 870 tm = time_get_ptr(mrb, self); 766 if (tm->sec > MRB_INT_MAX || tm->sec < MRB_INT_MIN) { 871 #ifndef MRB_WITHOUT_FLOAT 872 if (!fixable_time_t_p(tm->sec)) { 767 873 return mrb_float_value(mrb, (mrb_float)tm->sec); 768 874 } 875 #endif 769 876 return mrb_fixnum_value((mrb_int)tm->sec); 770 877 } 771 878 772 879 /* 15.2.19.7.26 */ 773 /* Returns a Floatwith the time since the epoch in microseconds. */880 /* Returns an Integer with the time since the epoch in microseconds. */ 774 881 static mrb_value 775 882 mrb_time_usec(mrb_state *mrb, mrb_value self) … … 778 885 779 886 tm = time_get_ptr(mrb, self); 780 if (tm->usec > MRB_INT_MAX || tm->usec < MRB_INT_MIN) { 887 #ifndef MRB_WITHOUT_FLOAT 888 if (!fixable_time_t_p(tm->usec)) { 781 889 return mrb_float_value(mrb, (mrb_float)tm->usec); 782 890 } 891 #endif 783 892 return mrb_fixnum_value((mrb_int)tm->usec); 784 893 } … … 793 902 tm = time_get_ptr(mrb, self); 794 903 tm->timezone = MRB_TIMEZONE_UTC; 795 time_update_datetime(mrb, tm );904 time_update_datetime(mrb, tm, FALSE); 796 905 return self; 797 906 } … … 808 917 } 809 918 919 static size_t 920 time_to_s_utc(mrb_state *mrb, struct mrb_time *tm, char *buf, size_t buf_len) 921 { 922 return strftime(buf, buf_len, TO_S_FMT "UTC", &tm->datetime); 923 } 924 925 static size_t 926 time_to_s_local(mrb_state *mrb, struct mrb_time *tm, char *buf, size_t buf_len) 927 { 928 #if defined(_MSC_VER) && _MSC_VER < 1900 || defined(__MINGW64__) || defined(__MINGW32__) 929 struct tm datetime = {0}; 930 time_t utc_sec = timegm(&tm->datetime); 931 size_t len; 932 int offset; 933 934 if (utc_sec == (time_t)-1) { 935 mrb_raise(mrb, E_ARGUMENT_ERROR, "Not a valid time."); 936 } 937 offset = abs((int)(utc_sec - tm->sec) / 60); 938 datetime.tm_year = 100; 939 datetime.tm_hour = offset / 60; 940 datetime.tm_min = offset % 60; 941 len = strftime(buf, buf_len, TO_S_FMT, &tm->datetime); 942 buf[len++] = utc_sec < tm->sec ? '-' : '+'; 943 944 return len + strftime(buf + len, buf_len - len, "%H%M", &datetime); 945 #else 946 return strftime(buf, buf_len, TO_S_FMT "%z", &tm->datetime); 947 #endif 948 } 949 950 static mrb_value 951 mrb_time_to_s(mrb_state *mrb, mrb_value self) 952 { 953 char buf[64]; 954 struct mrb_time *tm = time_get_ptr(mrb, self); 955 mrb_bool utc = tm->timezone == MRB_TIMEZONE_UTC; 956 size_t len = (utc ? time_to_s_utc : time_to_s_local)(mrb, tm, buf, sizeof(buf)); 957 return mrb_str_new(mrb, buf, len); 958 } 810 959 811 960 void … … 817 966 MRB_SET_INSTANCE_TT(tc, MRB_TT_DATA); 818 967 mrb_include_module(mrb, tc, mrb_module_get(mrb, "Comparable")); 819 mrb_define_class_method(mrb, tc, "at", mrb_time_at , MRB_ARGS_ARG(1, 1)); /* 15.2.19.6.1 */968 mrb_define_class_method(mrb, tc, "at", mrb_time_at_m, MRB_ARGS_ARG(1, 1)); /* 15.2.19.6.1 */ 820 969 mrb_define_class_method(mrb, tc, "gm", mrb_time_gm, MRB_ARGS_ARG(1,6)); /* 15.2.19.6.2 */ 821 970 mrb_define_class_method(mrb, tc, "local", mrb_time_local, MRB_ARGS_ARG(1,6)); /* 15.2.19.6.3 */ … … 828 977 mrb_define_method(mrb, tc, "+" , mrb_time_plus , MRB_ARGS_REQ(1)); /* 15.2.19.7.2 */ 829 978 mrb_define_method(mrb, tc, "-" , mrb_time_minus , MRB_ARGS_REQ(1)); /* 15.2.19.7.3 */ 830 mrb_define_method(mrb, tc, "to_s" , mrb_time_ asctime, MRB_ARGS_NONE());831 mrb_define_method(mrb, tc, "inspect", mrb_time_ asctime, MRB_ARGS_NONE());979 mrb_define_method(mrb, tc, "to_s" , mrb_time_to_s , MRB_ARGS_NONE()); 980 mrb_define_method(mrb, tc, "inspect", mrb_time_to_s , MRB_ARGS_NONE()); 832 981 mrb_define_method(mrb, tc, "asctime", mrb_time_asctime, MRB_ARGS_NONE()); /* 15.2.19.7.4 */ 833 982 mrb_define_method(mrb, tc, "ctime" , mrb_time_asctime, MRB_ARGS_NONE()); /* 15.2.19.7.5 */ … … 849 998 mrb_define_method(mrb, tc, "sec" , mrb_time_sec, MRB_ARGS_NONE()); /* 15.2.19.7.23 */ 850 999 mrb_define_method(mrb, tc, "to_i", mrb_time_to_i, MRB_ARGS_NONE()); /* 15.2.19.7.25 */ 1000 #ifndef MRB_WITHOUT_FLOAT 851 1001 mrb_define_method(mrb, tc, "to_f", mrb_time_to_f, MRB_ARGS_NONE()); /* 15.2.19.7.24 */ 1002 #endif 852 1003 mrb_define_method(mrb, tc, "usec", mrb_time_usec, MRB_ARGS_NONE()); /* 15.2.19.7.26 */ 853 1004 mrb_define_method(mrb, tc, "utc" , mrb_time_utc, MRB_ARGS_NONE()); /* 15.2.19.7.27 */ -
EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-time/test/time.rb
r331 r439 3 3 4 4 assert('Time.new', '15.2.3.3.3') do 5 Time.new.class == Time5 assert_equal(Time, Time.new.class) 6 6 end 7 7 8 8 assert('Time', '15.2.19') do 9 Time.class == Class9 assert_equal(Class, Time.class) 10 10 end 11 11 … … 22 22 23 23 assert('Time.gm', '15.2.19.6.2') do 24 Time.gm(2012, 12, 23) 24 t = Time.gm(2012, 9, 23) 25 assert_operator(2012, :eql?, t.year) 26 assert_operator( 9, :eql?, t.month) 27 assert_operator( 23, :eql?, t.day) 28 assert_operator( 0, :eql?, t.hour) 29 assert_operator( 0, :eql?, t.min) 30 assert_operator( 0, :eql?, t.sec) 31 assert_operator( 0, :eql?, t.usec) 25 32 end 26 33 27 34 assert('Time.local', '15.2.19.6.3') do 28 Time.local(2012, 12, 23) 35 t = Time.local(2014, 12, 27, 18) 36 assert_operator(2014, :eql?, t.year) 37 assert_operator( 12, :eql?, t.month) 38 assert_operator( 27, :eql?, t.day) 39 assert_operator( 18, :eql?, t.hour) 40 assert_operator( 0, :eql?, t.min) 41 assert_operator( 0, :eql?, t.sec) 42 assert_operator( 0, :eql?, t.usec) 29 43 end 30 44 31 45 assert('Time.mktime', '15.2.19.6.4') do 32 Time.mktime(2012, 12, 23) 46 t = Time.mktime(2013, 10, 4, 6, 15, 58, 3485) 47 assert_operator(2013, :eql?, t.year) 48 assert_operator( 10, :eql?, t.month) 49 assert_operator( 4, :eql?, t.day) 50 assert_operator( 6, :eql?, t.hour) 51 assert_operator( 15, :eql?, t.min) 52 assert_operator( 58, :eql?, t.sec) 53 assert_operator(3485, :eql?, t.usec) 33 54 end 34 55 35 56 assert('Time.now', '15.2.19.6.5') do 36 Time.now.class == Time57 assert_equal(Time, Time.now.class) 37 58 end 38 59 39 60 assert('Time.utc', '15.2.19.6.6') do 40 Time.utc(2012, 12, 23) 61 t = Time.utc(2034) 62 assert_operator(2034, :eql?, t.year) 63 assert_operator( 1, :eql?, t.month) 64 assert_operator( 1, :eql?, t.day) 65 assert_operator( 0, :eql?, t.hour) 66 assert_operator( 0, :eql?, t.min) 67 assert_operator( 0, :eql?, t.sec) 68 assert_operator( 0, :eql?, t.usec) 41 69 end 42 70 … … 45 73 t2 = t1.+(60) 46 74 47 assert_equal( t2.utc.asctime, "Sun Mar 13 07:07:40 UTC 2011")75 assert_equal("Sun Mar 13 07:07:40 2011", t2.utc.asctime) 48 76 49 77 assert_raise(FloatDomainError) { Time.at(0) + Float::NAN } … … 56 84 t2 = t1.-(60) 57 85 58 assert_equal( t2.utc.asctime, "Sun Mar 13 07:05:40 UTC 2011")86 assert_equal("Sun Mar 13 07:05:40 2011", t2.utc.asctime) 59 87 60 88 assert_raise(FloatDomainError) { Time.at(0) - Float::NAN } … … 68 96 t3 = Time.at(1500000000.0) 69 97 70 t2.<=>(t1) == 1 and71 t2.<=>(t2) == 0 and72 t2.<=>(t3) == -1 and73 t2.<=>(nil) == nil98 assert_equal(1, t2 <=> t1) 99 assert_equal(0, t2 <=> t2) 100 assert_equal(-1, t2 <=> t3) 101 assert_nil(t2 <=> nil) 74 102 end 75 103 76 104 assert('Time#asctime', '15.2.19.7.4') do 77 Time.at(1300000000.0).utc.asctime == "Sun Mar 13 07:06:40 UTC 2011"105 assert_equal("Thu Mar 4 05:06:07 1982", Time.gm(1982,3,4,5,6,7).asctime) 78 106 end 79 107 80 108 assert('Time#ctime', '15.2.19.7.5') do 81 Time.at(1300000000.0).utc.ctime == "Sun Mar 13 07:06:40 UTC 2011"109 assert_equal("Thu Oct 24 15:26:47 2013", Time.gm(2013,10,24,15,26,47).ctime) 82 110 end 83 111 84 112 assert('Time#day', '15.2.19.7.6') do 85 Time.gm(2012, 12, 23).day == 23113 assert_equal(23, Time.gm(2012, 12, 23).day) 86 114 end 87 115 88 116 assert('Time#dst?', '15.2.19.7.7') do 89 not Time.gm(2012, 12, 23).utc.dst?117 assert_not_predicate(Time.gm(2012, 12, 23).utc, :dst?) 90 118 end 91 119 92 120 assert('Time#getgm', '15.2.19.7.8') do 93 Time.at(1300000000.0).getgm.asctime == "Sun Mar 13 07:06:40 UTC 2011"121 assert_equal("Sun Mar 13 07:06:40 2011", Time.at(1300000000.0).getgm.asctime) 94 122 end 95 123 … … 99 127 t3 = t1.getlocal 100 128 101 t1 == t3 and t3 == t2.getlocal 129 assert_equal(t1, t3) 130 assert_equal(t3, t2.getlocal) 102 131 end 103 132 104 133 assert('Time#getutc', '15.2.19.7.10') do 105 Time.at(1300000000.0).getutc.asctime == "Sun Mar 13 07:06:40 UTC 2011"134 assert_equal("Sun Mar 13 07:06:40 2011", Time.at(1300000000.0).getutc.asctime) 106 135 end 107 136 108 137 assert('Time#gmt?', '15.2.19.7.11') do 109 Time.at(1300000000.0).utc.gmt?138 assert_predicate(Time.at(1300000000.0).utc, :gmt?) 110 139 end 111 140 … … 114 143 115 144 assert('Time#gmtime', '15.2.19.7.13') do 116 Time.at(1300000000.0).gmtime 145 t = Time.now 146 assert_predicate(t.gmtime, :gmt?) 147 assert_predicate(t, :gmt?) 117 148 end 118 149 … … 121 152 122 153 assert('Time#hour', '15.2.19.7.15') do 123 Time.gm(2012, 12, 23, 7, 6).hour == 7154 assert_equal(7, Time.gm(2012, 12, 23, 7, 6).hour) 124 155 end 125 156 … … 128 159 129 160 assert('Time#initialize_copy', '15.2.19.7.17') do 130 t ime_tmp_2= Time.at(7.0e6)131 time_tmp_2.clone == time_tmp_2161 t = Time.at(7.0e6) 162 assert_equal(t, t.clone) 132 163 end 133 164 134 165 assert('Time#localtime', '15.2.19.7.18') do 135 t1 = Time.at(1300000000.0) 136 t2 = Time.at(1300000000.0) 137 138 t1.localtime 139 t1 == t2.getlocal 166 t1 = Time.utc(2014, 5 ,6) 167 t2 = Time.utc(2014, 5 ,6) 168 t3 = t2.getlocal 169 170 assert_equal(t3, t1.localtime) 171 assert_equal(t3, t1) 140 172 end 141 173 142 174 assert('Time#mday', '15.2.19.7.19') do 143 Time.gm(2012, 12, 23).mday == 23175 assert_equal(23, Time.gm(2012, 12, 23).mday) 144 176 end 145 177 146 178 assert('Time#min', '15.2.19.7.20') do 147 Time.gm(2012, 12, 23, 7, 6).min == 6179 assert_equal(6, Time.gm(2012, 12, 23, 7, 6).min) 148 180 end 149 181 150 182 assert('Time#mon', '15.2.19.7.21') do 151 Time.gm(2012, 12, 23).mon == 12183 assert_equal(12, Time.gm(2012, 12, 23).mon) 152 184 end 153 185 154 186 assert('Time#month', '15.2.19.7.22') do 155 Time.gm(2012, 12, 23).month == 12187 assert_equal(12, Time.gm(2012, 12, 23).month) 156 188 end 157 189 158 190 assert('Times#sec', '15.2.19.7.23') do 159 Time.gm(2012, 12, 23, 7, 6, 40).sec == 40191 assert_equal(40, Time.gm(2012, 12, 23, 7, 6, 40).sec) 160 192 end 161 193 162 194 assert('Time#to_f', '15.2.19.7.24') do 163 Time.at(1300000000.0).to_f == 1300000000.0195 assert_operator(2.0, :eql?, Time.at(2).to_f) 164 196 end 165 197 166 198 assert('Time#to_i', '15.2.19.7.25') do 167 Time.at(1300000000.0).to_i == 1300000000199 assert_operator(2, :eql?, Time.at(2.0).to_i) 168 200 end 169 201 170 202 assert('Time#usec', '15.2.19.7.26') do 171 Time.at(1300000000.0).usec == 0203 assert_equal(0, Time.at(1300000000.0).usec) 172 204 end 173 205 174 206 assert('Time#utc', '15.2.19.7.27') do 175 Time.at(1300000000.0).utc 207 t = Time.now 208 assert_predicate(t.utc, :gmt?) 209 assert_predicate(t, :gmt?) 176 210 end 177 211 178 212 assert('Time#utc?', '15.2.19.7.28') do 179 Time.at(1300000000.0).utc.utc?213 assert_predicate(Time.at(1300000000.0).utc, :utc?) 180 214 end 181 215 … … 184 218 185 219 assert('Time#wday', '15.2.19.7.30') do 186 Time.gm(2012, 12, 23).wday == 0220 assert_equal(0, Time.gm(2012, 12, 23).wday) 187 221 end 188 222 189 223 assert('Time#yday', '15.2.19.7.31') do 190 Time.gm(2012, 12, 23).yday == 358224 assert_equal(358, Time.gm(2012, 12, 23).yday) 191 225 end 192 226 193 227 assert('Time#year', '15.2.19.7.32') do 194 Time.gm(2012, 12, 23).year == 2012228 assert_equal(2012, Time.gm(2012, 12, 23).year) 195 229 end 196 230 197 231 assert('Time#zone', '15.2.19.7.33') do 198 Time.at(1300000000.0).utc.zone == 'UTC'232 assert_equal('UTC', Time.at(1300000000.0).utc.zone) 199 233 end 200 234 … … 202 236 203 237 assert('Time#to_s') do 204 Time.at(1300000000.0).utc.to_s == "Sun Mar 13 07:06:40 UTC 2011"238 assert_equal("2003-04-05 06:07:08 UTC", Time.gm(2003,4,5,6,7,8,9).to_s) 205 239 end 206 240 207 241 assert('Time#inspect') do 208 Time.at(1300000000.0).utc.inspect == "Sun Mar 13 07:06:40 UTC 2011" 242 assert_match("2013-10-28 16:27:48 [+-][0-9][0-9][0-9][0-9]", 243 Time.local(2013,10,28,16,27,48).inspect) 209 244 end 210 245 … … 225 260 t += 0.0005 226 261 end 227 t.usec == 0 228 end 262 assert_equal(0, t.usec) 263 end 264 265 assert('Time.gm with Dec 31 23:59:59 1969 raise ArgumentError') do 266 assert_raise(ArgumentError) {Time.gm(1969, 12, 31, 23, 59, 59)} 267 end -
EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-toplevel-ext/test/toplevel.rb
r321 r439 17 17 self.include ToplevelTestModule2, ToplevelTestModule1 18 18 19 assert_true self.class. included_modules.include?( ToplevelTestModule1 )20 assert_true self.class. included_modules.include?( ToplevelTestModule2 )19 assert_true self.class.ancestors.include?( ToplevelTestModule1 ) 20 assert_true self.class.ancestors.include?( ToplevelTestModule2 ) 21 21 assert_equal :foo, method_foo 22 22 assert_equal :bar2, CONST_BAR -
EcnlProtoTool/trunk/mruby-2.1.1/mrblib/00class.rb
r331 r439 6 6 end 7 7 # 15.2.2.4.11 8 def attr(name) 9 attr_reader(name) 10 end 8 alias attr attr_reader 9 #def attr(name) 10 # attr_reader(name) 11 #end 11 12 12 13 # 15.2.2.4.27 … … 16 17 m.included(self) 17 18 end 19 self 18 20 end 19 21 … … 23 25 m.prepended(self) 24 26 end 27 self 25 28 end 26 29 end -
EcnlProtoTool/trunk/mruby-2.1.1/mrblib/10error.rb
r331 r439 3 3 end 4 4 5 # ISO 15.2.25 6 class LocalJumpError < S tandardError5 # ISO 15.2.25 says "LocalJumpError < StandardError" 6 class LocalJumpError < ScriptError 7 7 end 8 8 … … 52 52 end 53 53 54 class FrozenError < RuntimeError 55 end 56 54 57 class StopIteration < IndexError 55 58 attr_accessor :result -
EcnlProtoTool/trunk/mruby-2.1.1/mrblib/array.rb
r331 r439 1 # coding: utf-8 1 2 ## 2 3 # Array … … 10 11 # 11 12 # ISO 15.2.12.5.10 12 def each(&block)13 return to_enum :each unless block_given?14 15 idx = 016 while idx < length17 block.call(self[idx])18 idx += 119 end20 self21 end13 # def each(&block) 14 # return to_enum :each unless block 15 16 # idx = 0 17 # while idx < length 18 # block.call(self[idx]) 19 # idx += 1 20 # end 21 # self 22 # end 22 23 23 24 ## … … 27 28 # ISO 15.2.12.5.11 28 29 def each_index(&block) 29 return to_enum :each_index unless block _given?30 return to_enum :each_index unless block 30 31 31 32 idx = 0 … … 44 45 # ISO 15.2.12.5.7 45 46 def collect!(&block) 46 return to_enum :collect! unless block_given? 47 48 self.each_index { |idx| self[idx] = block.call(self[idx]) } 47 return to_enum :collect! unless block 48 49 idx = 0 50 len = size 51 while idx < len 52 self[idx] = block.call self[idx] 53 idx += 1 54 end 49 55 self 50 56 end … … 61 67 # ISO 15.2.12.5.15 62 68 def initialize(size=0, obj=nil, &block) 63 raise TypeError, "expected Integer for 1st argument" unless size.kind_of? Integer69 size = size.__to_int 64 70 raise ArgumentError, "negative array size" if size < 0 65 71 … … 78 84 end 79 85 80 def _inspect 81 return "[]" if self.size == 0 82 "["+self.map{|x|x.inspect}.join(", ")+"]" 86 def _inspect(recur_list) 87 size = self.size 88 return "[]" if size == 0 89 return "[...]" if recur_list[self.object_id] 90 recur_list[self.object_id] = true 91 ary=[] 92 i=0 93 while i<size 94 ary<<self[i]._inspect(recur_list) 95 i+=1 96 end 97 "["+ary.join(", ")+"]" 83 98 end 84 99 ## … … 87 102 # ISO 15.2.12.5.31 (x) 88 103 def inspect 89 begin 90 self._inspect 91 rescue SystemStackError 92 "[...]" 93 end 104 self._inspect({}) 94 105 end 95 106 # ISO 15.2.12.5.32 (x) … … 179 190 ret 180 191 end 181 182 # internal method to convert multi-value to single value183 def __svalue184 return self.first if self.size < 2185 self186 end187 192 end 188 193 … … 197 202 # elements. 198 203 def sort!(&block) 199 self.replace(self.sort(&block)) 204 stack = [ [ 0, self.size - 1 ] ] 205 until stack.empty? 206 left, mid, right = stack.pop 207 if right == nil 208 right = mid 209 # sort self[left..right] 210 if left < right 211 if left + 1 == right 212 lval = self[left] 213 rval = self[right] 214 cmp = if block then block.call(lval,rval) else lval <=> rval end 215 if cmp.nil? 216 raise ArgumentError, "comparison of #{lval.inspect} and #{rval.inspect} failed" 217 end 218 if cmp > 0 219 self[left] = rval 220 self[right] = lval 221 end 222 else 223 mid = ((left + right + 1) / 2).floor 224 stack.push [ left, mid, right ] 225 stack.push [ mid, right ] 226 stack.push [ left, (mid - 1) ] if left < mid - 1 227 end 228 end 229 else 230 lary = self[left, mid - left] 231 lsize = lary.size 232 233 # The entity sharing between lary and self may cause a large memory 234 # copy operation in the merge loop below. This harmless operation 235 # cancels the sharing and provides a huge performance gain. 236 lary[0] = lary[0] 237 238 # merge 239 lidx = 0 240 ridx = mid 241 (left..right).each { |i| 242 if lidx >= lsize 243 break 244 elsif ridx > right 245 self[i, lsize - lidx] = lary[lidx, lsize - lidx] 246 break 247 else 248 lval = lary[lidx] 249 rval = self[ridx] 250 cmp = if block then block.call(lval,rval) else lval <=> rval end 251 if cmp.nil? 252 raise ArgumentError, "comparison of #{lval.inspect} and #{rval.inspect} failed" 253 end 254 if cmp <= 0 255 self[i] = lval 256 lidx += 1 257 else 258 self[i] = rval 259 ridx += 1 260 end 261 end 262 } 263 end 264 end 265 self 266 end 267 268 def sort(&block) 269 self.dup.sort!(&block) 200 270 end 201 271 end -
EcnlProtoTool/trunk/mruby-2.1.1/mrblib/enum.rb
r331 r439 14 14 module Enumerable 15 15 16 NONE = Object.new 17 16 18 ## 17 19 # Call the given block for each element … … 64 66 65 67 ## 66 # Call the given block for each element67 # which is yield by +each+. Return68 # +ifnone+ if no block value was true.69 # Otherwise return the first block value70 # which had was true.68 # Return the first element for which 69 # value from the block is true. If no 70 # object matches, calls +ifnone+ and 71 # returns its result. Otherwise returns 72 # +nil+. 71 73 # 72 74 # ISO 15.3.2.2.4 73 75 def detect(ifnone=nil, &block) 74 ret = ifnone 76 return to_enum :detect, ifnone unless block 77 75 78 self.each{|*val| 76 79 if block.call(*val) 77 ret = val.__svalue 78 break 79 end 80 } 81 ret 80 return val.__svalue 81 end 82 } 83 ifnone.call unless ifnone.nil? 82 84 end 83 85 … … 283 285 # ISO 15.3.2.2.16 284 286 def partition(&block) 287 return to_enum :partition unless block 288 285 289 ary_T = [] 286 290 ary_F = [] … … 303 307 # ISO 15.3.2.2.17 304 308 def reject(&block) 309 return to_enum :reject unless block 310 305 311 ary = [] 306 312 self.each{|*val| … … 315 321 # ISO 15.3.2.2.18 316 322 alias select find_all 317 318 ##319 # TODO320 # Does this OK? Please test it.321 def __sort_sub__(sorted, work, src_ary, head, tail, &block)322 if head == tail323 sorted[head] = work[head] if src_ary == 1324 return325 end326 327 # on current step, which is a src ary?328 if src_ary == 0329 src, dst = sorted, work330 else331 src, dst = work, sorted332 end333 334 key = src[head] # key value for dividing values335 i, j = head, tail # position to store on the dst ary336 337 (head + 1).upto(tail){|idx|338 if ((block)? block.call(src[idx], key): (src[idx] <=> key)) > 0339 # larger than key340 dst[j] = src[idx]341 j -= 1342 else343 dst[i] = src[idx]344 i += 1345 end346 }347 348 sorted[i] = key349 350 # sort each sub-array351 src_ary = (src_ary + 1) % 2 # exchange a src ary352 __sort_sub__(sorted, work, src_ary, head, i - 1, &block) if i > head353 __sort_sub__(sorted, work, src_ary, i + 1, tail, &block) if i < tail354 end355 # private :__sort_sub__356 323 357 324 ## … … 365 332 # ISO 15.3.2.2.19 366 333 def sort(&block) 367 ary = [] 368 self.each{|*val| ary.push(val.__svalue)} 369 if ary.size > 1 370 __sort_sub__(ary, ::Array.new(ary.size), 0, 0, ary.size - 1, &block) 371 end 372 ary 334 self.map{|*val| val.__svalue}.sort(&block) 373 335 end 374 336 … … 384 346 i = 0 385 347 self.each do |e| 386 n = (e.hash & (0x7fffffff >> (i % 16))) << (i % 16) 387 h ^= n 348 h = __update_hash(h, i, e.hash) 388 349 i += 1 389 350 end -
EcnlProtoTool/trunk/mruby-2.1.1/mrblib/hash.rb
r331 r439 13 13 def ==(hash) 14 14 return true if self.equal?(hash) 15 begin 16 hash = hash.to_hash 17 rescue NoMethodError 15 unless Hash === hash 18 16 return false 19 17 end … … 33 31 def eql?(hash) 34 32 return true if self.equal?(hash) 35 begin 36 hash = hash.to_hash 37 rescue NoMethodError 33 unless Hash === hash 38 34 return false 39 35 end … … 56 52 def delete(key, &block) 57 53 if block && !self.has_key?(key) 58 block.call(key) 59 else 60 self.__delete(key) 61 end 54 return block.call(key) 55 end 56 self.__delete(key) 62 57 end 63 58 … … 85 80 # ISO 15.2.13.4.9 86 81 def each(&block) 87 return to_enum :each unless block _given?82 return to_enum :each unless block 88 83 89 84 keys = self.keys … … 118 113 # ISO 15.2.13.4.10 119 114 def each_key(&block) 120 return to_enum :each_key unless block _given?115 return to_enum :each_key unless block 121 116 122 117 self.keys.each{|k| block.call(k)} … … 144 139 # ISO 15.2.13.4.11 145 140 def each_value(&block) 146 return to_enum :each_value unless block _given?141 return to_enum :each_value unless block 147 142 148 143 self.keys.each{|k| block.call(self[k])} … … 155 150 # ISO 15.2.13.4.23 156 151 def replace(hash) 157 raise TypeError, " can't convert argument into Hash" unless hash.respond_to?(:to_hash)152 raise TypeError, "Hash required (#{hash.class} given)" unless Hash === hash 158 153 self.clear 159 hash = hash.to_hash160 154 hash.each_key{|k| 161 155 self[k] = hash[k] … … 180 174 # ISO 15.2.13.4.22 181 175 def merge(other, &block) 182 h = {} 183 raise TypeError, "can't convert argument into Hash" unless other.respond_to?(:to_hash) 184 other = other.to_hash 185 self.each_key{|k| h[k] = self[k]} 176 raise TypeError, "Hash required (#{other.class} given)" unless Hash === other 177 h = self.dup 186 178 if block 187 179 other.each_key{|k| … … 195 187 196 188 # internal method for Hash inspection 197 def _inspect 189 def _inspect(recur_list) 198 190 return "{}" if self.size == 0 199 "{"+self.map {|k,v| 200 k._inspect + "=>" + v._inspect 201 }.join(", ")+"}" 191 return "{...}" if recur_list[self.object_id] 192 recur_list[self.object_id] = true 193 ary=[] 194 keys=self.keys 195 size=keys.size 196 i=0 197 while i<size 198 k=keys[i] 199 ary<<(k._inspect(recur_list) + "=>" + self[k]._inspect(recur_list)) 200 i+=1 201 end 202 "{"+ary.join(", ")+"}" 202 203 end 203 204 ## … … 206 207 # ISO 15.2.13.4.30 (x) 207 208 def inspect 208 begin 209 self._inspect 210 rescue SystemStackError 211 "{...}" 212 end 209 self._inspect({}) 213 210 end 214 211 # ISO 15.2.13.4.31 (x) … … 225 222 # 1.8/1.9 Hash#reject! returns Hash; ISO says nothing. 226 223 # 227 def reject!(&b )228 return to_enum :reject! unless block _given?224 def reject!(&block) 225 return to_enum :reject! unless block 229 226 230 227 keys = [] 231 228 self.each{|k,v| 232 if b .call([k, v])229 if block.call([k, v]) 233 230 keys.push(k) 234 231 end … … 256 253 # 1.8/1.9 Hash#reject returns Hash; ISO says nothing. 257 254 # 258 def reject(&b )259 return to_enum :reject unless block _given?255 def reject(&block) 256 return to_enum :reject unless block 260 257 261 258 h = {} 262 259 self.each{|k,v| 263 unless b .call([k, v])260 unless block.call([k, v]) 264 261 h[k] = v 265 262 end … … 278 275 # 1.9 Hash#select! returns Hash; ISO says nothing. 279 276 # 280 def select!(&b )281 return to_enum :select! unless block _given?277 def select!(&block) 278 return to_enum :select! unless block 282 279 283 280 keys = [] 284 281 self.each{|k,v| 285 unless b .call([k, v])282 unless block.call([k, v]) 286 283 keys.push(k) 287 284 end … … 309 306 # 1.9 Hash#select returns Hash; ISO says nothing 310 307 # 311 def select(&b )312 return to_enum :select unless block _given?308 def select(&block) 309 return to_enum :select unless block 313 310 314 311 h = {} 315 312 self.each{|k,v| 316 if b .call([k, v])313 if block.call([k, v]) 317 314 h[k] = v 318 315 end 319 316 } 320 317 h 321 end322 323 ##324 # call-seq:325 # hsh.rehash -> hsh326 #327 # Rebuilds the hash based on the current hash values for each key. If328 # values of key objects have changed since they were inserted, this329 # method will reindex <i>hsh</i>.330 #331 # h = {"AAA" => "b"}332 # h.keys[0].chop!333 # h #=> {"AA"=>"b"}334 # h["AA"] #=> nil335 # h.rehash #=> {"AA"=>"b"}336 # h["AA"] #=> "b"337 #338 def rehash339 h = {}340 self.each{|k,v|341 h[k] = v342 }343 self.replace(h)344 end345 346 def __update(h)347 h.each_key{|k| self[k] = h[k]}348 self349 318 end 350 319 end -
EcnlProtoTool/trunk/mruby-2.1.1/mrblib/kernel.rb
r321 r439 7 7 # 15.3.1.2.1 Kernel.` 8 8 # provided by Kernel#` 9 # 15.3.1.3. 59 # 15.3.1.3.3 10 10 def `(s) 11 11 raise NotImplementedError.new("backquotes not implemented") … … 41 41 42 42 # internal method for inspect 43 def _inspect 43 def _inspect(_recur_list) 44 44 self.inspect 45 45 end -
EcnlProtoTool/trunk/mruby-2.1.1/mrblib/mrblib.rake
r321 r439 4 4 current_build_dir = "#{build_dir}/#{relative_from_root}" 5 5 6 self.libmruby << objfile("#{current_build_dir}/mrblib")6 self.libmruby_objs << objfile("#{current_build_dir}/mrblib") 7 7 8 8 file objfile("#{current_build_dir}/mrblib") => "#{current_build_dir}/mrblib.c" 9 9 file "#{current_build_dir}/mrblib.c" => [mrbcfile, __FILE__] + Dir.glob("#{current_dir}/*.rb").sort do |t| 10 10 _, _, *rbfiles = t.prerequisites 11 FileUtils.mkdir_p File.dirname(t.name)11 mkdir_p File.dirname(t.name) 12 12 open(t.name, 'w') do |f| 13 13 _pp "GEN", "*.rb", "#{t.name.relative_path}" -
EcnlProtoTool/trunk/mruby-2.1.1/mrblib/numeric.rb
r331 r439 46 46 # ISO 15.2.8.3.15 47 47 def downto(num, &block) 48 return to_enum(:downto, num) unless block _given?48 return to_enum(:downto, num) unless block 49 49 50 50 i = self.to_i … … 71 71 # ISO 15.2.8.3.22 72 72 def times &block 73 return to_enum :times unless block _given?73 return to_enum :times unless block 74 74 75 75 i = 0 … … 87 87 # ISO 15.2.8.3.27 88 88 def upto(num, &block) 89 return to_enum(:upto, num) unless block _given?89 return to_enum(:upto, num) unless block 90 90 91 91 i = self.to_i … … 103 103 def step(num=nil, step=1, &block) 104 104 raise ArgumentError, "step can't be 0" if step == 0 105 return to_enum(:step, num, step) unless block _given?105 return to_enum(:step, num, step) unless block 106 106 107 i = if num.kind_of? Float then self.to_f else self end 108 if num == nil 107 i = __coerce_step_counter(num, step) 108 if num == self || step.infinite? 109 block.call(i) if step > 0 && i <= (num||i) || step < 0 && i >= (num||-i) 110 elsif num == nil 109 111 while true 110 112 block.call(i) 111 i +=step113 i += step 112 114 end 113 return self 114 end 115 if step > 0 115 elsif step > 0 116 116 while i <= num 117 117 block.call(i) … … 162 162 alias truncate floor 163 163 end 164 165 ##166 # Float167 #168 # ISO 15.2.9169 class Float170 # mruby special - since mruby integers may be upgraded to floats,171 # floats should be compatible to integers.172 include Integral173 end -
EcnlProtoTool/trunk/mruby-2.1.1/mrblib/range.rb
r331 r439 11 11 # ISO 15.2.14.4.4 12 12 def each(&block) 13 return to_enum :each unless block _given?13 return to_enum :each unless block 14 14 15 15 val = self.first … … 27 27 end 28 28 29 if val.kind_of?(String) && last.kind_of?(String) # fixnums are special29 if val.kind_of?(String) && last.kind_of?(String) # strings are special 30 30 if val.respond_to? :upto 31 31 return val.upto(last, exclude_end?, &block) -
EcnlProtoTool/trunk/mruby-2.1.1/mrblib/string.rb
r331 r439 4 4 # ISO 15.2.10 5 5 class String 6 # ISO 15.2.10.3 6 7 include Comparable 8 7 9 ## 8 10 # Calls the given block for each line … … 10 12 # 11 13 # ISO 15.2.10.5.15 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 16 offset = 0 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 14 def each_line(separator = "\n", &block) 15 return to_enum(:each_line, separator) unless block 16 17 if separator.nil? 18 block.call(self) 19 return self 20 end 21 raise TypeError unless separator.is_a?(String) 22 23 paragraph_mode = false 24 if separator.empty? 25 paragraph_mode = true 26 separator = "\n\n" 27 end 28 start = 0 29 string = dup 30 self_len = length 31 sep_len = separator.length 32 should_yield_subclass_instances = self.class != String 33 34 while (pointer = string.index(separator, start)) 35 pointer += sep_len 36 pointer += 1 while paragraph_mode && string[pointer] == "\n" 37 if should_yield_subclass_instances 38 block.call(self.class.new(string[start, pointer - start])) 39 else 40 block.call(string[start, pointer - start]) 41 end 42 start = pointer 43 end 44 return self if start == self_len 45 46 if should_yield_subclass_instances 47 block.call(self.class.new(string[start, self_len - start])) 48 else 49 block.call(string[start, self_len - start]) 50 end 24 51 self 25 52 end … … 68 95 end 69 96 if !replace.nil? || !block 70 replace = replace.to_str97 replace.__to_str 71 98 end 72 99 offset = 0 … … 97 124 # ISO 15.2.10.5.19 98 125 def gsub!(*args, &block) 99 raise RuntimeError, "can't modify frozen String" if frozen?126 raise FrozenError, "can't modify frozen String" if frozen? 100 127 return to_enum(:gsub!, *args) if args.length == 1 && !block 101 128 str = self.gsub(*args, &block) 102 return nil if str == self129 return nil unless self.index(args[0]) 103 130 self.replace(str) 104 131 end 105 132 106 ## 107 # Calls the given block for each match of +pattern+ 108 # If no block is given return an array with all 109 # matches of +pattern+. 110 # 111 # ISO 15.2.10.5.32 112 def scan(reg, &block) 113 ### *** TODO *** ### 114 unless Object.const_defined?(:Regexp) 115 raise NotImplementedError, "scan not available (yet)" 116 end 117 end 133 # ## 134 # # Calls the given block for each match of +pattern+ 135 # # If no block is given return an array with all 136 # # matches of +pattern+. 137 ## 138 # # ISO 15.2.10.5.32 139 # def scan(pattern, &block) 140 # # TODO: String#scan is not implemented yet 141 # end 118 142 119 143 ## … … 130 154 131 155 pattern, replace = *args 132 pattern = pattern.to_str156 pattern.__to_str 133 157 if args.length == 2 && block 134 158 block = nil 135 159 end 136 if !block137 replace = replace.to_str160 unless block 161 replace.__to_str 138 162 end 139 163 result = [] … … 160 184 # ISO 15.2.10.5.37 161 185 def sub!(*args, &block) 162 raise RuntimeError, "can't modify frozen String" if frozen?186 raise FrozenError, "can't modify frozen String" if frozen? 163 187 str = self.sub(*args, &block) 164 return nil if str == self188 return nil unless self.index(args[0]) 165 189 self.replace(str) 166 end167 168 ##169 # Call the given block for each character of170 # +self+.171 def each_char(&block)172 pos = 0173 while pos < self.size174 block.call(self[pos])175 pos += 1176 end177 self178 190 end 179 191 … … 181 193 # Call the given block for each byte of +self+. 182 194 def each_byte(&block) 195 return to_enum(:each_byte, &block) unless block 183 196 bytes = self.bytes 184 197 pos = 0 … … 190 203 end 191 204 192 ## 193 # Modify +self+ by replacing the content of +self+. 194 # The portion of the string affected is determined using the same criteria as +String#[]+. 195 def []=(*args) 196 anum = args.size 197 if anum == 2 198 pos, value = args 199 case pos 200 when String 201 posnum = self.index(pos) 202 if posnum 203 b = self[0, posnum.to_i] 204 a = self[(posnum + pos.length)..-1] 205 self.replace([b, value, a].join('')) 206 else 207 raise IndexError, "string not matched" 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 217 else 218 pos += self.length if pos < 0 219 if pos < 0 || pos > self.length 220 raise IndexError, "index #{args[0]} out of string" 221 end 222 b = self[0, pos.to_i] 223 a = self[pos + 1..-1] 224 self.replace([b, value, a].join('')) 225 end 226 return value 227 elsif anum == 3 228 pos, len, value = args 229 pos += self.length if pos < 0 230 if pos < 0 || pos > self.length 231 raise IndexError, "index #{args[0]} out of string" 232 end 233 if len < 0 234 raise IndexError, "negative length #{len}" 235 end 236 b = self[0, pos.to_i] 237 a = self[pos + len..-1] 238 self.replace([b, value, a].join('')) 239 return value 240 else 241 raise ArgumentError, "wrong number of arguments (#{anum} for 2..3)" 242 end 243 end 244 205 # those two methods requires Regexp that is optional in mruby 245 206 ## 246 207 # ISO 15.2.10.5.3 247 def =~(re) 248 raise TypeError, "type mismatch: String given" if re.respond_to? :to_str 249 re =~ self 250 end 208 #def =~(re) 209 # re =~ self 210 #end 251 211 252 212 ## 253 213 # ISO 15.2.10.5.27 254 def match(re, &block) 255 if re.respond_to? :to_str 256 if Object.const_defined?(:Regexp) 257 r = Regexp.new(re) 258 r.match(self, &block) 259 else 260 raise NotImplementedError, "String#match needs Regexp class" 261 end 262 else 263 re.match(self, &block) 264 end 265 end 214 #def match(re, &block) 215 # re.match(self, &block) 216 #end 266 217 end 267 268 ##269 # String is comparable270 #271 # ISO 15.2.10.3272 module Comparable; end273 class String274 include Comparable275 end -
EcnlProtoTool/trunk/mruby-2.1.1/mruby-source.gemspec
r270 r439 11 11 spec.summary = %q{MRuby source code wrapper.} 12 12 spec.description = %q{MRuby source code wrapper for use with Ruby libs.} 13 spec.homepage = "http ://www.mruby.org/"13 spec.homepage = "https://mruby.org" 14 14 spec.license = "MIT" 15 15 -
EcnlProtoTool/trunk/mruby-2.1.1/src/array.c
r331 r439 10 10 #include <mruby/string.h> 11 11 #include <mruby/range.h> 12 #include <mruby/proc.h> 13 #include <mruby/opcode.h> 12 14 #include "value_array.h" 13 15 … … 15 17 #define ARY_SHRINK_RATIO 5 /* must be larger than 2 */ 16 18 #define ARY_C_MAX_SIZE (SIZE_MAX / sizeof(mrb_value)) 17 #define ARY_MAX_SIZE (( ARY_C_MAX_SIZE < (size_t)MRB_INT_MAX) ? (mrb_int)ARY_C_MAX_SIZE : MRB_INT_MAX-1)19 #define ARY_MAX_SIZE ((mrb_int)((ARY_C_MAX_SIZE < (size_t)MRB_INT_MAX) ? ARY_C_MAX_SIZE : MRB_INT_MAX-1)) 18 20 19 21 static struct RArray* … … 29 31 30 32 a = (struct RArray*)mrb_obj_alloc(mrb, MRB_TT_ARRAY, mrb->array_class); 31 a->ptr = (mrb_value *)mrb_malloc(mrb, blen); 32 a->aux.capa = capa; 33 a->len = 0; 33 if (capa <= MRB_ARY_EMBED_LEN_MAX) { 34 ARY_SET_EMBED_LEN(a, 0); 35 } 36 else { 37 a->as.heap.ptr = (mrb_value *)mrb_malloc(mrb, blen); 38 a->as.heap.aux.capa = capa; 39 a->as.heap.len = 0; 40 } 34 41 35 42 return a; … … 73 80 } 74 81 82 static struct RArray* 83 ary_new_from_values(mrb_state *mrb, mrb_int size, const mrb_value *vals) 84 { 85 struct RArray *a = ary_new_capa(mrb, size); 86 87 array_copy(ARY_PTR(a), vals, size); 88 ARY_SET_LEN(a, size); 89 90 return a; 91 } 92 75 93 MRB_API mrb_value 76 94 mrb_ary_new_from_values(mrb_state *mrb, mrb_int size, const mrb_value *vals) 77 95 { 78 struct RArray *a = ary_new_capa(mrb, size); 79 80 array_copy(a->ptr, vals, size); 81 a->len = size; 82 96 struct RArray *a = ary_new_from_values(mrb, size, vals); 83 97 return mrb_obj_value(a); 84 98 } … … 90 104 91 105 a = ary_new_capa(mrb, 2); 92 a->ptr[0] = car;93 a->ptr[1] = cdr;94 a->len = 2;106 ARY_PTR(a)[0] = car; 107 ARY_PTR(a)[1] = cdr; 108 ARY_SET_LEN(a, 2); 95 109 return mrb_obj_value(a); 96 110 } … … 107 121 108 122 static void 123 ary_modify_check(mrb_state *mrb, struct RArray *a) 124 { 125 mrb_check_frozen(mrb, a); 126 } 127 128 static void 109 129 ary_modify(mrb_state *mrb, struct RArray *a) 110 130 { 111 if (MRB_FROZEN_P(a)) { 112 mrb_raise(mrb, E_RUNTIME_ERROR, "can't modify frozen array"); 113 } 131 ary_modify_check(mrb, a); 114 132 115 133 if (ARY_SHARED_P(a)) { 116 mrb_shared_array *shared = a->a ux.shared;117 118 if (shared->refcnt == 1 && a-> ptr == shared->ptr) {119 a-> ptr = shared->ptr;120 a->a ux.capa = a->len;134 mrb_shared_array *shared = a->as.heap.aux.shared; 135 136 if (shared->refcnt == 1 && a->as.heap.ptr == shared->ptr) { 137 a->as.heap.ptr = shared->ptr; 138 a->as.heap.aux.capa = a->as.heap.len; 121 139 mrb_free(mrb, shared); 122 140 } … … 125 143 mrb_int len; 126 144 127 p = a-> ptr;128 len = a-> len * sizeof(mrb_value);145 p = a->as.heap.ptr; 146 len = a->as.heap.len * sizeof(mrb_value); 129 147 ptr = (mrb_value *)mrb_malloc(mrb, len); 130 148 if (p) { 131 array_copy(ptr, p, a-> len);149 array_copy(ptr, p, a->as.heap.len); 132 150 } 133 a-> ptr = ptr;134 a->a ux.capa = a->len;151 a->as.heap.ptr = ptr; 152 a->as.heap.aux.capa = a->as.heap.len; 135 153 mrb_ary_decref(mrb, shared); 136 154 } … … 149 167 ary_make_shared(mrb_state *mrb, struct RArray *a) 150 168 { 151 if (!ARY_SHARED_P(a) ) {169 if (!ARY_SHARED_P(a) && !ARY_EMBED_P(a)) { 152 170 mrb_shared_array *shared = (mrb_shared_array *)mrb_malloc(mrb, sizeof(mrb_shared_array)); 171 mrb_value *ptr = a->as.heap.ptr; 172 mrb_int len = a->as.heap.len; 153 173 154 174 shared->refcnt = 1; 155 if (a->a ux.capa > a->len) {156 a-> ptr = shared->ptr = (mrb_value *)mrb_realloc(mrb, a->ptr, sizeof(mrb_value)*a->len+1);175 if (a->as.heap.aux.capa > len) { 176 a->as.heap.ptr = shared->ptr = (mrb_value *)mrb_realloc(mrb, ptr, sizeof(mrb_value)*len+1); 157 177 } 158 178 else { 159 shared->ptr = a->ptr;160 } 161 shared->len = a->len;162 a->a ux.shared = shared;179 shared->ptr = ptr; 180 } 181 shared->len = len; 182 a->as.heap.aux.shared = shared; 163 183 ARY_SET_SHARED_FLAG(a); 164 184 } … … 168 188 ary_expand_capa(mrb_state *mrb, struct RArray *a, mrb_int len) 169 189 { 170 mrb_int capa = a->aux.capa;171 172 if (len > ARY_MAX_SIZE ) {190 mrb_int capa = ARY_CAPA(a); 191 192 if (len > ARY_MAX_SIZE || len < 0) { 173 193 size_error: 174 194 mrb_raise(mrb, E_ARGUMENT_ERROR, "array size too big"); 175 195 } 176 196 177 if (capa == 0) {197 if (capa < ARY_DEFAULT_LEN) { 178 198 capa = ARY_DEFAULT_LEN; 179 199 } … … 190 210 } 191 211 192 if (capa > a->aux.capa) { 193 mrb_value *expanded_ptr = (mrb_value *)mrb_realloc(mrb, a->ptr, sizeof(mrb_value)*capa); 194 195 a->aux.capa = capa; 196 a->ptr = expanded_ptr; 212 if (ARY_EMBED_P(a)) { 213 mrb_value *ptr = ARY_EMBED_PTR(a); 214 mrb_int len = ARY_EMBED_LEN(a); 215 mrb_value *expanded_ptr = (mrb_value *)mrb_malloc(mrb, sizeof(mrb_value)*capa); 216 217 ARY_UNSET_EMBED_FLAG(a); 218 array_copy(expanded_ptr, ptr, len); 219 a->as.heap.len = len; 220 a->as.heap.aux.capa = capa; 221 a->as.heap.ptr = expanded_ptr; 222 } 223 else if (capa > a->as.heap.aux.capa) { 224 mrb_value *expanded_ptr = (mrb_value *)mrb_realloc(mrb, a->as.heap.ptr, sizeof(mrb_value)*capa); 225 226 a->as.heap.aux.capa = capa; 227 a->as.heap.ptr = expanded_ptr; 197 228 } 198 229 } … … 201 232 ary_shrink_capa(mrb_state *mrb, struct RArray *a) 202 233 { 203 mrb_int capa = a->aux.capa; 204 234 235 mrb_int capa; 236 237 if (ARY_EMBED_P(a)) return; 238 239 capa = a->as.heap.aux.capa; 205 240 if (capa < ARY_DEFAULT_LEN * 2) return; 206 if (capa <= a-> len * ARY_SHRINK_RATIO) return;241 if (capa <= a->as.heap.len * ARY_SHRINK_RATIO) return; 207 242 208 243 do { … … 212 247 break; 213 248 } 214 } while (capa > a-> len * ARY_SHRINK_RATIO);215 216 if (capa > a-> len && capa < a->aux.capa) {217 a->a ux.capa = capa;218 a-> ptr = (mrb_value *)mrb_realloc(mrb, a->ptr, sizeof(mrb_value)*capa);249 } while (capa > a->as.heap.len * ARY_SHRINK_RATIO); 250 251 if (capa > a->as.heap.len && capa < a->as.heap.aux.capa) { 252 a->as.heap.aux.capa = capa; 253 a->as.heap.ptr = (mrb_value *)mrb_realloc(mrb, a->as.heap.ptr, sizeof(mrb_value)*capa); 219 254 } 220 255 } … … 229 264 old_len = RARRAY_LEN(ary); 230 265 if (old_len != new_len) { 231 a->len = new_len;232 266 if (new_len < old_len) { 233 267 ary_shrink_capa(mrb, a); … … 235 269 else { 236 270 ary_expand_capa(mrb, a, new_len); 237 ary_fill_with_nil(a->ptr + old_len, new_len - old_len); 238 } 271 ary_fill_with_nil(ARY_PTR(a) + old_len, new_len - old_len); 272 } 273 ARY_SET_LEN(a, new_len); 239 274 } 240 275 … … 250 285 struct RArray *a; 251 286 252 mrb_get_args(mrb, "* ", &vals, &len);287 mrb_get_args(mrb, "*!", &vals, &len); 253 288 ary = mrb_ary_new_from_values(mrb, len, vals); 254 289 a = mrb_ary_ptr(ary); … … 258 293 } 259 294 295 static void ary_replace(mrb_state*, struct RArray*, struct RArray*); 296 260 297 static void 261 298 ary_concat(mrb_state *mrb, struct RArray *a, struct RArray *a2) … … 263 300 mrb_int len; 264 301 265 if (a2->len > ARY_MAX_SIZE - a->len) { 302 if (ARY_LEN(a) == 0) { 303 ary_replace(mrb, a, a2); 304 return; 305 } 306 if (ARY_LEN(a2) > ARY_MAX_SIZE - ARY_LEN(a)) { 266 307 mrb_raise(mrb, E_ARGUMENT_ERROR, "array size too big"); 267 308 } 268 len = a->len + a2->len;309 len = ARY_LEN(a) + ARY_LEN(a2); 269 310 270 311 ary_modify(mrb, a); 271 if ( a->aux.capa< len) {312 if (ARY_CAPA(a) < len) { 272 313 ary_expand_capa(mrb, a, len); 273 314 } 274 array_copy( a->ptr+a->len, a2->ptr, a2->len);315 array_copy(ARY_PTR(a)+ARY_LEN(a), ARY_PTR(a2), ARY_LEN(a2)); 275 316 mrb_write_barrier(mrb, (struct RBasic*)a); 276 a->len = len;317 ARY_SET_LEN(a, len); 277 318 } 278 319 … … 301 342 struct RArray *a2; 302 343 mrb_value *ptr; 303 mrb_int blen ;344 mrb_int blen, len1; 304 345 305 346 mrb_get_args(mrb, "a", &ptr, &blen); 306 if (ARY_MAX_SIZE - blen < a1->len) {347 if (ARY_MAX_SIZE - blen < ARY_LEN(a1)) { 307 348 mrb_raise(mrb, E_ARGUMENT_ERROR, "array size too big"); 308 349 } 309 a2 = ary_new_capa(mrb, a1->len + blen); 310 array_copy(a2->ptr, a1->ptr, a1->len); 311 array_copy(a2->ptr + a1->len, ptr, blen); 312 a2->len = a1->len + blen; 350 len1 = ARY_LEN(a1); 351 a2 = ary_new_capa(mrb, len1 + blen); 352 array_copy(ARY_PTR(a2), ARY_PTR(a1), len1); 353 array_copy(ARY_PTR(a2) + len1, ptr, blen); 354 ARY_SET_LEN(a2, len1+blen); 313 355 314 356 return mrb_obj_value(a2); 315 357 } 316 358 359 #define ARY_REPLACE_SHARED_MIN 20 360 317 361 static void 318 ary_replace(mrb_state *mrb, struct RArray *a, mrb_value *argv, mrb_int len) 319 { 320 ary_modify(mrb, a); 321 if (a->aux.capa < len) 362 ary_replace(mrb_state *mrb, struct RArray *a, struct RArray *b) 363 { 364 mrb_int len = ARY_LEN(b); 365 366 ary_modify_check(mrb, a); 367 if (a == b) return; 368 if (ARY_SHARED_P(a)) { 369 mrb_ary_decref(mrb, a->as.heap.aux.shared); 370 a->as.heap.aux.capa = 0; 371 a->as.heap.len = 0; 372 a->as.heap.ptr = NULL; 373 ARY_UNSET_SHARED_FLAG(a); 374 } 375 if (ARY_SHARED_P(b)) { 376 shared_b: 377 if (ARY_EMBED_P(a)) { 378 ARY_UNSET_EMBED_FLAG(a); 379 } 380 else { 381 mrb_free(mrb, a->as.heap.ptr); 382 } 383 a->as.heap.ptr = b->as.heap.ptr; 384 a->as.heap.len = len; 385 a->as.heap.aux.shared = b->as.heap.aux.shared; 386 a->as.heap.aux.shared->refcnt++; 387 ARY_SET_SHARED_FLAG(a); 388 mrb_write_barrier(mrb, (struct RBasic*)a); 389 return; 390 } 391 if (!mrb_frozen_p(b) && len > ARY_REPLACE_SHARED_MIN) { 392 ary_make_shared(mrb, b); 393 goto shared_b; 394 } 395 if (ARY_CAPA(a) < len) 322 396 ary_expand_capa(mrb, a, len); 323 array_copy( a->ptr, argv, len);397 array_copy(ARY_PTR(a), ARY_PTR(b), len); 324 398 mrb_write_barrier(mrb, (struct RBasic*)a); 325 a->len = len;399 ARY_SET_LEN(a, len); 326 400 } 327 401 … … 333 407 334 408 if (a1 != a2) { 335 ary_replace(mrb, a1, a2 ->ptr, a2->len);409 ary_replace(mrb, a1, a2); 336 410 } 337 411 } … … 354 428 struct RArray *a2; 355 429 mrb_value *ptr; 356 mrb_int times ;430 mrb_int times, len1; 357 431 358 432 mrb_get_args(mrb, "i", ×); … … 361 435 } 362 436 if (times == 0) return mrb_ary_new(mrb); 363 if (ARY_MAX_SIZE / times < a1->len) {437 if (ARY_MAX_SIZE / times < ARY_LEN(a1)) { 364 438 mrb_raise(mrb, E_ARGUMENT_ERROR, "array size too big"); 365 439 } 366 a2 = ary_new_capa(mrb, a1->len * times); 367 ptr = a2->ptr; 440 len1 = ARY_LEN(a1); 441 a2 = ary_new_capa(mrb, len1 * times); 442 ARY_SET_LEN(a2, len1 * times); 443 ptr = ARY_PTR(a2); 368 444 while (times--) { 369 array_copy(ptr, a1->ptr, a1->len); 370 ptr += a1->len; 371 a2->len += a1->len; 445 array_copy(ptr, ARY_PTR(a1), len1); 446 ptr += len1; 372 447 } 373 448 … … 379 454 { 380 455 struct RArray *a = mrb_ary_ptr(self); 381 382 if (a->len > 1) { 456 mrb_int len = ARY_LEN(a); 457 458 if (len > 1) { 383 459 mrb_value *p1, *p2; 384 460 385 461 ary_modify(mrb, a); 386 p1 = a->ptr;387 p2 = a->ptr + a->len - 1;462 p1 = ARY_PTR(a); 463 p2 = p1 + len - 1; 388 464 389 465 while (p1 < p2) { … … 399 475 mrb_ary_reverse(mrb_state *mrb, mrb_value self) 400 476 { 401 struct RArray *a = mrb_ary_ptr(self), *b = ary_new_capa(mrb, a->len); 402 403 if (a->len > 0) { 477 struct RArray *a = mrb_ary_ptr(self), *b = ary_new_capa(mrb, ARY_LEN(a)); 478 mrb_int len = ARY_LEN(a); 479 480 if (len > 0) { 404 481 mrb_value *p1, *p2, *e; 405 482 406 p1 = a->ptr;407 e = p1 + a->len;408 p2 = b->ptr + a->len - 1;483 p1 = ARY_PTR(a); 484 e = p1 + len; 485 p2 = ARY_PTR(b) + len - 1; 409 486 while (p1 < e) { 410 487 *p2-- = *p1++; 411 488 } 412 b->len = a->len;489 ARY_SET_LEN(b, len); 413 490 } 414 491 return mrb_obj_value(b); … … 419 496 { 420 497 struct RArray *a = mrb_ary_ptr(ary); 498 mrb_int len = ARY_LEN(a); 421 499 422 500 ary_modify(mrb, a); 423 if (a->len == a->aux.capa) 424 ary_expand_capa(mrb, a, a->len + 1); 425 a->ptr[a->len++] = elem; 501 if (len == ARY_CAPA(a)) 502 ary_expand_capa(mrb, a, len + 1); 503 ARY_PTR(a)[len] = elem; 504 ARY_SET_LEN(a, len+1); 426 505 mrb_field_write_barrier_value(mrb, (struct RBasic*)a, elem); 427 506 } … … 431 510 { 432 511 mrb_value *argv; 433 mrb_int len; 434 435 mrb_get_args(mrb, "*", &argv, &len); 436 while (len--) { 437 mrb_ary_push(mrb, self, *argv++); 438 } 512 mrb_int len, len2, alen; 513 struct RArray *a; 514 515 mrb_get_args(mrb, "*!", &argv, &alen); 516 a = mrb_ary_ptr(self); 517 ary_modify(mrb, a); 518 len = ARY_LEN(a); 519 len2 = len + alen; 520 if (ARY_CAPA(a) < len2) { 521 ary_expand_capa(mrb, a, len2); 522 } 523 array_copy(ARY_PTR(a)+len, argv, alen); 524 ARY_SET_LEN(a, len2); 525 mrb_write_barrier(mrb, (struct RBasic*)a); 439 526 440 527 return self; … … 445 532 { 446 533 struct RArray *a = mrb_ary_ptr(ary); 447 448 ary_modify(mrb, a); 449 if (a->len == 0) return mrb_nil_value(); 450 return a->ptr[--a->len]; 534 mrb_int len = ARY_LEN(a); 535 536 ary_modify_check(mrb, a); 537 if (len == 0) return mrb_nil_value(); 538 ARY_SET_LEN(a, len-1); 539 return ARY_PTR(a)[len-1]; 451 540 } 452 541 … … 457 546 { 458 547 struct RArray *a = mrb_ary_ptr(self); 548 mrb_int len = ARY_LEN(a); 459 549 mrb_value val; 460 550 461 ary_modify (mrb, a);462 if ( a->len == 0) return mrb_nil_value();551 ary_modify_check(mrb, a); 552 if (len == 0) return mrb_nil_value(); 463 553 if (ARY_SHARED_P(a)) { 464 554 L_SHIFT: 465 val = a-> ptr[0];466 a-> ptr++;467 a-> len--;555 val = a->as.heap.ptr[0]; 556 a->as.heap.ptr++; 557 a->as.heap.len--; 468 558 return val; 469 559 } 470 if ( a->len > ARY_SHIFT_SHARED_MIN) {560 if (len > ARY_SHIFT_SHARED_MIN) { 471 561 ary_make_shared(mrb, a); 472 562 goto L_SHIFT; 473 563 } 474 564 else { 475 mrb_value *ptr = a->ptr;476 mrb_int size = a->len;565 mrb_value *ptr = ARY_PTR(a); 566 mrb_int size = len; 477 567 478 568 val = *ptr; … … 481 571 ++ptr; 482 572 } 483 --a->len;573 ARY_SET_LEN(a, len-1); 484 574 } 485 575 return val; … … 494 584 { 495 585 struct RArray *a = mrb_ary_ptr(self); 586 mrb_int len = ARY_LEN(a); 496 587 497 588 if (ARY_SHARED_P(a) 498 && a->a ux.shared->refcnt == 1 /* shared only referenced from this array */499 && a-> ptr - a->aux.shared->ptr >= 1) /* there's room for unshifted item */ {500 a-> ptr--;501 a-> ptr[0] = item;589 && a->as.heap.aux.shared->refcnt == 1 /* shared only referenced from this array */ 590 && a->as.heap.ptr - a->as.heap.aux.shared->ptr >= 1) /* there's room for unshifted item */ { 591 a->as.heap.ptr--; 592 a->as.heap.ptr[0] = item; 502 593 } 503 594 else { 595 mrb_value *ptr; 596 504 597 ary_modify(mrb, a); 505 if (a->aux.capa < a->len + 1) 506 ary_expand_capa(mrb, a, a->len + 1); 507 value_move(a->ptr + 1, a->ptr, a->len); 508 a->ptr[0] = item; 509 } 510 a->len++; 598 if (ARY_CAPA(a) < len + 1) 599 ary_expand_capa(mrb, a, len + 1); 600 ptr = ARY_PTR(a); 601 value_move(ptr + 1, ptr, len); 602 ptr[0] = item; 603 } 604 ARY_SET_LEN(a, len+1); 511 605 mrb_field_write_barrier_value(mrb, (struct RBasic*)a, item); 512 606 … … 518 612 { 519 613 struct RArray *a = mrb_ary_ptr(self); 520 mrb_value *vals; 521 mrb_int len; 522 523 mrb_get_args(mrb, "*", &vals, &len); 524 if (len > ARY_MAX_SIZE - a->len) { 614 mrb_value *vals, *ptr; 615 mrb_int alen, len; 616 617 mrb_get_args(mrb, "*!", &vals, &alen); 618 if (alen == 0) { 619 ary_modify_check(mrb, a); 620 return self; 621 } 622 len = ARY_LEN(a); 623 if (alen > ARY_MAX_SIZE - len) { 525 624 mrb_raise(mrb, E_ARGUMENT_ERROR, "array size too big"); 526 625 } 527 626 if (ARY_SHARED_P(a) 528 && a->aux.shared->refcnt == 1 /* shared only referenced from this array */ 529 && a->ptr - a->aux.shared->ptr >= len) /* there's room for unshifted item */ { 530 a->ptr -= len; 627 && a->as.heap.aux.shared->refcnt == 1 /* shared only referenced from this array */ 628 && a->as.heap.ptr - a->as.heap.aux.shared->ptr >= alen) /* there's room for unshifted item */ { 629 ary_modify_check(mrb, a); 630 a->as.heap.ptr -= alen; 631 ptr = a->as.heap.ptr; 531 632 } 532 633 else { 634 mrb_bool same = vals == ARY_PTR(a); 533 635 ary_modify(mrb, a); 534 if (len == 0) return self; 535 if (a->aux.capa < a->len + len) 536 ary_expand_capa(mrb, a, a->len + len); 537 value_move(a->ptr + len, a->ptr, a->len); 538 } 539 array_copy(a->ptr, vals, len); 540 a->len += len; 541 while (len--) { 542 mrb_field_write_barrier_value(mrb, (struct RBasic*)a, vals[len]); 636 if (ARY_CAPA(a) < len + alen) 637 ary_expand_capa(mrb, a, len + alen); 638 ptr = ARY_PTR(a); 639 value_move(ptr + alen, ptr, len); 640 if (same) vals = ptr; 641 } 642 array_copy(ptr, vals, alen); 643 ARY_SET_LEN(a, len+alen); 644 while (alen--) { 645 mrb_field_write_barrier_value(mrb, (struct RBasic*)a, vals[alen]); 543 646 } 544 647 … … 550 653 { 551 654 struct RArray *a = mrb_ary_ptr(ary); 655 mrb_int len = ARY_LEN(a); 552 656 553 657 /* range check */ 554 if (n < 0) n += a->len;555 if (n < 0 || a->len <= n) return mrb_nil_value();556 557 return a->ptr[n];658 if (n < 0) n += len; 659 if (n < 0 || len <= n) return mrb_nil_value(); 660 661 return ARY_PTR(a)[n]; 558 662 } 559 663 … … 562 666 { 563 667 struct RArray *a = mrb_ary_ptr(ary); 668 mrb_int len = ARY_LEN(a); 564 669 565 670 ary_modify(mrb, a); 566 671 /* range check */ 567 672 if (n < 0) { 568 n += a->len;673 n += len; 569 674 if (n < 0) { 570 mrb_raisef(mrb, E_INDEX_ERROR, "index % S out of array", mrb_fixnum_value(n - a->len));571 } 572 } 573 if ( a->len <= n) {574 if ( a->aux.capa<= n)675 mrb_raisef(mrb, E_INDEX_ERROR, "index %i out of array", n - len); 676 } 677 } 678 if (len <= n) { 679 if (ARY_CAPA(a) <= n) 575 680 ary_expand_capa(mrb, a, n + 1); 576 ary_fill_with_nil( a->ptr + a->len, n + 1 - a->len);577 a->len = n + 1;578 } 579 580 a->ptr[n] = val;681 ary_fill_with_nil(ARY_PTR(a) + len, n + 1 - len); 682 ARY_SET_LEN(a, n+1); 683 } 684 685 ARY_PTR(a)[n] = val; 581 686 mrb_field_write_barrier_value(mrb, (struct RBasic*)a, val); 582 687 } … … 585 690 ary_dup(mrb_state *mrb, struct RArray *a) 586 691 { 587 struct RArray *d = ary_new_capa(mrb, a->len); 588 589 ary_replace(mrb, d, a->ptr, a->len); 590 return d; 692 return ary_new_from_values(mrb, ARY_LEN(a), ARY_PTR(a)); 591 693 } 592 694 … … 595 697 { 596 698 struct RArray *a = mrb_ary_ptr(ary); 699 mrb_int alen = ARY_LEN(a); 597 700 const mrb_value *argv; 598 701 mrb_int argc; … … 602 705 603 706 /* len check */ 604 if (len < 0) mrb_raisef(mrb, E_INDEX_ERROR, "negative length (% S)", mrb_fixnum_value(len));707 if (len < 0) mrb_raisef(mrb, E_INDEX_ERROR, "negative length (%i)", len); 605 708 606 709 /* range check */ 607 710 if (head < 0) { 608 head += a ->len;711 head += alen; 609 712 if (head < 0) { 610 713 mrb_raise(mrb, E_INDEX_ERROR, "index is out of array"); … … 612 715 } 613 716 tail = head + len; 614 if (a ->len < len || a->len < tail) {615 len = a ->len - head;717 if (alen < len || alen < tail) { 718 len = alen - head; 616 719 } 617 720 … … 620 723 argc = RARRAY_LEN(rpl); 621 724 argv = RARRAY_PTR(rpl); 622 if (argv == a->ptr) {725 if (argv == ARY_PTR(a)) { 623 726 struct RArray *r; 624 727 … … 627 730 } 628 731 r = ary_dup(mrb, a); 629 argv = r->ptr;732 argv = ARY_PTR(r); 630 733 } 631 734 } … … 634 737 argv = &rpl; 635 738 } 636 if (head >= a ->len) {739 if (head >= alen) { 637 740 if (head > ARY_MAX_SIZE - argc) { 638 mrb_raisef(mrb, E_INDEX_ERROR, "index % S too big", mrb_fixnum_value(head));741 mrb_raisef(mrb, E_INDEX_ERROR, "index %i too big", head); 639 742 } 640 743 len = head + argc; 641 if (len > a->aux.capa) {744 if (len > ARY_CAPA(a)) { 642 745 ary_expand_capa(mrb, a, head + argc); 643 746 } 644 ary_fill_with_nil( a->ptr + a->len, head - a->len);747 ary_fill_with_nil(ARY_PTR(a) + alen, head - alen); 645 748 if (argc > 0) { 646 array_copy( a->ptr+ head, argv, argc);647 } 648 a->len = len;749 array_copy(ARY_PTR(a) + head, argv, argc); 750 } 751 ARY_SET_LEN(a, len); 649 752 } 650 753 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);754 mrb_int newlen; 755 756 if (alen - len > ARY_MAX_SIZE - argc) { 757 mrb_raisef(mrb, E_INDEX_ERROR, "index %i too big", alen + argc - len); 758 } 759 newlen = alen + argc - len; 760 if (newlen > ARY_CAPA(a)) { 761 ary_expand_capa(mrb, a, newlen); 659 762 } 660 763 661 764 if (len != argc) { 765 mrb_value *ptr = ARY_PTR(a); 662 766 tail = head + len; 663 value_move( a->ptr + head + argc, a->ptr + tail, a->len - tail);664 a->len = alen;767 value_move(ptr + head + argc, ptr + tail, alen - tail); 768 ARY_SET_LEN(a, newlen); 665 769 } 666 770 if (argc > 0) { 667 value_move( a->ptr+ head, argv, argc);771 value_move(ARY_PTR(a) + head, argv, argc); 668 772 } 669 773 } … … 687 791 struct RArray *b; 688 792 793 if (!ARY_SHARED_P(a) && len <= ARY_SHIFT_SHARED_MIN) { 794 return mrb_ary_new_from_values(mrb, len, ARY_PTR(a)+beg); 795 } 689 796 ary_make_shared(mrb, a); 690 797 b = (struct RArray*)mrb_obj_alloc(mrb, MRB_TT_ARRAY, mrb->array_class); 691 b-> ptr = a->ptr + beg;692 b-> len = len;693 b->a ux.shared = a->aux.shared;694 b->a ux.shared->refcnt++;798 b->as.heap.ptr = a->as.heap.ptr + beg; 799 b->as.heap.len = len; 800 b->as.heap.aux.shared = a->as.heap.aux.shared; 801 b->as.heap.aux.shared->refcnt++; 695 802 ARY_SET_SHARED_FLAG(b); 696 803 … … 704 811 return mrb_fixnum(index); 705 812 } 813 #ifndef MRB_WITHOUT_FLOAT 706 814 else if (mrb_float_p(index)) { 707 815 return (mrb_int)mrb_float(index); 708 816 } 817 #endif 709 818 else { 710 819 mrb_int i, argc; 711 820 mrb_value *argv; 712 821 713 mrb_get_args(mrb, "i* ", &i, &argv, &argc);822 mrb_get_args(mrb, "i*!", &i, &argv, &argc); 714 823 return i; 715 824 } … … 747 856 { 748 857 struct RArray *a = mrb_ary_ptr(self); 749 mrb_int i, len ;858 mrb_int i, len, alen; 750 859 mrb_value index; 751 860 … … 754 863 /* a[n..m] */ 755 864 case MRB_TT_RANGE: 756 if (mrb_range_beg_len(mrb, index, &i, &len, a->len, TRUE) == 1) {865 if (mrb_range_beg_len(mrb, index, &i, &len, ARY_LEN(a), TRUE) == MRB_RANGE_OK) { 757 866 return ary_subseq(mrb, a, i, len); 758 867 } … … 768 877 769 878 i = aget_index(mrb, index); 770 if (i < 0) i += a->len; 771 if (i < 0 || a->len < i) return mrb_nil_value(); 879 alen = ARY_LEN(a); 880 if (i < 0) i += alen; 881 if (i < 0 || alen < i) return mrb_nil_value(); 772 882 if (len < 0) return mrb_nil_value(); 773 if (a ->len == i) return mrb_ary_new(mrb);774 if (len > a ->len - i) len = a->len - i;883 if (alen == i) return mrb_ary_new(mrb); 884 if (len > alen - i) len = alen - i; 775 885 776 886 return ary_subseq(mrb, a, i, len); … … 822 932 /* a[n..m] = v */ 823 933 switch (mrb_range_beg_len(mrb, v1, &i, &len, RARRAY_LEN(self), FALSE)) { 824 case 0: /* not range */934 case MRB_RANGE_TYPE_MISMATCH: 825 935 mrb_ary_set(mrb, self, aget_index(mrb, v1), v2); 826 936 break; 827 case 1: /* range */937 case MRB_RANGE_OK: 828 938 mrb_ary_splice(mrb, self, i, len, v2); 829 939 break; 830 case 2: /* out of range */831 mrb_raisef(mrb, E_RANGE_ERROR, "% Sout of range", v1);940 case MRB_RANGE_OUT: 941 mrb_raisef(mrb, E_RANGE_ERROR, "%v out of range", v1); 832 942 break; 833 943 } … … 847 957 mrb_value val; 848 958 mrb_value *ptr; 849 mrb_int len ;959 mrb_int len, alen; 850 960 851 961 mrb_get_args(mrb, "i", &index); 852 if (index < 0) index += a->len; 853 if (index < 0 || a->len <= index) return mrb_nil_value(); 962 alen = ARY_LEN(a); 963 if (index < 0) index += alen; 964 if (index < 0 || alen <= index) return mrb_nil_value(); 854 965 855 966 ary_modify(mrb, a); 856 val = a->ptr[index]; 857 858 ptr = a->ptr + index; 859 len = a->len - index; 967 ptr = ARY_PTR(a); 968 val = ptr[index]; 969 970 ptr += index; 971 len = alen - index; 860 972 while (--len) { 861 973 *ptr = *(ptr+1); 862 974 ++ptr; 863 975 } 864 --a->len;976 ARY_SET_LEN(a, alen-1); 865 977 866 978 ary_shrink_capa(mrb, a); … … 873 985 { 874 986 struct RArray *a = mrb_ary_ptr(self); 875 mrb_int size; 876 877 if (mrb_get_args(mrb, "|i", &size) == 0) { 878 return (a->len > 0)? a->ptr[0]: mrb_nil_value(); 879 } 987 mrb_int size, alen; 988 989 if (mrb_get_argc(mrb) == 0) { 990 return (ARY_LEN(a) > 0)? ARY_PTR(a)[0]: mrb_nil_value(); 991 } 992 mrb_get_args(mrb, "|i", &size); 880 993 if (size < 0) { 881 994 mrb_raise(mrb, E_ARGUMENT_ERROR, "negative array size"); 882 995 } 883 996 884 if (size > a->len) size = a->len; 997 alen = ARY_LEN(a); 998 if (size > alen) size = alen; 885 999 if (ARY_SHARED_P(a)) { 886 1000 return ary_subseq(mrb, a, 0, size); 887 1001 } 888 return mrb_ary_new_from_values(mrb, size, a->ptr);1002 return mrb_ary_new_from_values(mrb, size, ARY_PTR(a)); 889 1003 } 890 1004 … … 893 1007 { 894 1008 struct RArray *a = mrb_ary_ptr(self); 895 mrb_int size; 896 897 if (mrb_get_args(mrb, "|i", &size) == 0) 898 return (a->len > 0)? a->ptr[a->len - 1]: mrb_nil_value(); 1009 mrb_int n, size, alen; 1010 1011 n = mrb_get_args(mrb, "|i", &size); 1012 alen = ARY_LEN(a); 1013 if (n == 0) { 1014 return (alen > 0) ? ARY_PTR(a)[alen - 1]: mrb_nil_value(); 1015 } 899 1016 900 1017 if (size < 0) { 901 1018 mrb_raise(mrb, E_ARGUMENT_ERROR, "negative array size"); 902 1019 } 903 if (size > a ->len) size = a->len;1020 if (size > alen) size = alen; 904 1021 if (ARY_SHARED_P(a) || size > ARY_DEFAULT_LEN) { 905 return ary_subseq(mrb, a, a ->len - size, size);906 } 907 return mrb_ary_new_from_values(mrb, size, a->ptr + a->len - size);1022 return ary_subseq(mrb, a, alen - size, size); 1023 } 1024 return mrb_ary_new_from_values(mrb, size, ARY_PTR(a) + alen - size); 908 1025 } 909 1026 … … 944 1061 mrb_ary_splat(mrb_state *mrb, mrb_value v) 945 1062 { 946 mrb_value a , recv_class;1063 mrb_value a; 947 1064 948 1065 if (mrb_array_p(v)) { … … 955 1072 956 1073 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)) { 1074 if (mrb_nil_p(a)) { 961 1075 return mrb_ary_new_from_values(mrb, 1, &v); 962 1076 } 963 else { 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(); 972 } 1077 mrb_ensure_array_type(mrb, a); 1078 return a; 973 1079 } 974 1080 … … 978 1084 struct RArray *a = mrb_ary_ptr(self); 979 1085 980 return mrb_fixnum_value( a->len);1086 return mrb_fixnum_value(ARY_LEN(a)); 981 1087 } 982 1088 … … 988 1094 ary_modify(mrb, a); 989 1095 if (ARY_SHARED_P(a)) { 990 mrb_ary_decref(mrb, a->a ux.shared);1096 mrb_ary_decref(mrb, a->as.heap.aux.shared); 991 1097 ARY_UNSET_SHARED_FLAG(a); 992 1098 } 993 else { 994 mrb_free(mrb, a->ptr); 995 } 996 a->len = 0; 997 a->aux.capa = 0; 998 a->ptr = 0; 1099 else if (!ARY_EMBED_P(a)){ 1100 mrb_free(mrb, a->as.heap.ptr); 1101 } 1102 ARY_SET_EMBED_LEN(a, 0); 999 1103 1000 1104 return self; … … 1002 1106 1003 1107 static mrb_value 1108 mrb_ary_clear_m(mrb_state *mrb, mrb_value self) 1109 { 1110 return mrb_ary_clear(mrb, self); 1111 } 1112 1113 static mrb_value 1004 1114 mrb_ary_empty_p(mrb_state *mrb, mrb_value self) 1005 1115 { 1006 1116 struct RArray *a = mrb_ary_ptr(self); 1007 1117 1008 return mrb_bool_value(a->len == 0); 1009 } 1010 1011 MRB_API mrb_value 1012 mrb_check_array_type(mrb_state *mrb, mrb_value ary) 1013 { 1014 return mrb_check_convert_type(mrb, ary, MRB_TT_ARRAY, "Array", "to_ary"); 1118 return mrb_bool_value(ARY_LEN(a) == 0); 1015 1119 } 1016 1120 … … 1021 1125 offset += RARRAY_LEN(ary); 1022 1126 } 1023 return ary_elt(ary, offset); 1127 if (offset < 0 || RARRAY_LEN(ary) <= offset) { 1128 return mrb_nil_value(); 1129 } 1130 return RARRAY_PTR(ary)[offset]; 1024 1131 } 1025 1132 … … 1039 1146 mrb_ary_push(mrb, list, ary); 1040 1147 1041 result = mrb_str_ buf_new(mrb, 64);1148 result = mrb_str_new_capa(mrb, 64); 1042 1149 1043 1150 for (i=0; i<RARRAY_LEN(ary); i++) { … … 1065 1172 goto str_join; 1066 1173 } 1067 tmp = mrb_check_ convert_type(mrb, val, MRB_TT_ARRAY, "Array", "to_ary");1174 tmp = mrb_check_array_type(mrb, val); 1068 1175 if (!mrb_nil_p(tmp)) { 1069 1176 val = tmp; … … 1139 1246 } 1140 1247 1248 /* internal method to convert multi-value to single value */ 1249 static mrb_value 1250 mrb_ary_svalue(mrb_state *mrb, mrb_value ary) 1251 { 1252 switch (RARRAY_LEN(ary)) { 1253 case 0: 1254 return mrb_nil_value(); 1255 case 1: 1256 return RARRAY_PTR(ary)[0]; 1257 default: 1258 return ary; 1259 } 1260 } 1261 1262 static const mrb_code each_iseq[] = { 1263 OP_ENTER, 0x0, 0x00, 0x1, /* OP_ENTER 0:0:0:0:0:0:1 */ 1264 OP_JMPIF, 0x1, 0x0, 19, /* OP_JMPIF R1 19 */ 1265 OP_LOADSELF, 0x3, /* OP_LOADSELF R3 */ 1266 OP_LOADSYM, 0x4, 0x0, /* OP_LOADSYM R4 :each*/ 1267 OP_SEND, 0x3, 0x1, 0x1, /* OP_SEND R3 :to_enum 1 */ 1268 OP_RETURN, 0x3, /* OP_RETURN R3 */ 1269 OP_LOADI_0, 0x2, /* OP_LOADI_0 R2 */ 1270 OP_JMP, 0x0, 43, /* OP_JMP 49 */ 1271 OP_MOVE, 0x3, 0x1, /* OP_MOVE R3 R1 */ 1272 OP_LOADSELF, 0x4, /* OP_LOADSELF R4 */ 1273 OP_MOVE, 0x5, 0x2, /* OP_MOVE R5 R2 */ 1274 OP_SEND, 0x4, 0x2, 0x1, /* OP_SEND R4 :[] 1 */ 1275 OP_SEND, 0x3, 0x3, 0x1, /* OP_SEND R3 :call 1 */ 1276 OP_ADDI, 0x2, 1, /* OP_ADDI R3 1 */ 1277 OP_MOVE, 0x3, 0x2, /* OP_MOVE R3 R2 */ 1278 OP_LOADSELF, 0x4, /* OP_LOADSELF R4 */ 1279 OP_SEND, 0x4, 0x4, 0x0, /* OP_SEND R4 :length 0 */ 1280 OP_LT, 0x3, /* OP_LT R3 */ 1281 OP_JMPIF, 0x3, 0x0, 24, /* OP_JMPIF R3 24 */ 1282 OP_RETURN, 0x0 /* OP_RETURN R3 */ 1283 }; 1284 1285 static void 1286 init_ary_each(mrb_state *mrb, struct RClass *ary) 1287 { 1288 struct RProc *p; 1289 mrb_method_t m; 1290 mrb_irep *each_irep = (mrb_irep*)mrb_malloc(mrb, sizeof(mrb_irep)); 1291 static const mrb_irep mrb_irep_zero = { 0 }; 1292 1293 *each_irep = mrb_irep_zero; 1294 each_irep->syms = (mrb_sym*)mrb_malloc(mrb, sizeof(mrb_sym)*5); 1295 each_irep->syms[0] = mrb_intern_lit(mrb, "each"); 1296 each_irep->syms[1] = mrb_intern_lit(mrb, "to_enum"); 1297 each_irep->syms[2] = mrb_intern_lit(mrb, "[]"); 1298 each_irep->syms[3] = mrb_intern_lit(mrb, "call"); 1299 each_irep->syms[4] = mrb_intern_lit(mrb, "length"); 1300 each_irep->slen = 5; 1301 each_irep->flags = MRB_ISEQ_NO_FREE; 1302 each_irep->iseq = each_iseq; 1303 each_irep->ilen = sizeof(each_iseq); 1304 each_irep->nregs = 7; 1305 each_irep->nlocals = 3; 1306 p = mrb_proc_new(mrb, each_irep); 1307 p->flags |= MRB_PROC_SCOPE | MRB_PROC_STRICT; 1308 MRB_METHOD_FROM_PROC(m, p); 1309 mrb_define_method_raw(mrb, ary, mrb_intern_lit(mrb, "each"), m); 1310 } 1311 1141 1312 void 1142 1313 mrb_init_array(mrb_state *mrb) … … 1144 1315 struct RClass *a; 1145 1316 1146 mrb->array_class = a = mrb_define_class(mrb, "Array", mrb->object_class); /* 15.2.12 */1317 mrb->array_class = a = mrb_define_class(mrb, "Array", mrb->object_class); /* 15.2.12 */ 1147 1318 MRB_SET_INSTANCE_TT(a, MRB_TT_ARRAY); 1148 1319 1149 mrb_define_class_method(mrb, a, "[]", mrb_ary_s_create, MRB_ARGS_ANY()); /* 15.2.12.4.1 */ 1150 1151 mrb_define_method(mrb, a, "+", mrb_ary_plus, MRB_ARGS_REQ(1)); /* 15.2.12.5.1 */ 1152 mrb_define_method(mrb, a, "*", mrb_ary_times, MRB_ARGS_REQ(1)); /* 15.2.12.5.2 */ 1153 mrb_define_method(mrb, a, "<<", mrb_ary_push_m, MRB_ARGS_REQ(1)); /* 15.2.12.5.3 */ 1154 mrb_define_method(mrb, a, "[]", mrb_ary_aget, MRB_ARGS_ANY()); /* 15.2.12.5.4 */ 1155 mrb_define_method(mrb, a, "[]=", mrb_ary_aset, MRB_ARGS_ANY()); /* 15.2.12.5.5 */ 1156 mrb_define_method(mrb, a, "clear", mrb_ary_clear, MRB_ARGS_NONE()); /* 15.2.12.5.6 */ 1157 mrb_define_method(mrb, a, "concat", mrb_ary_concat_m, MRB_ARGS_REQ(1)); /* 15.2.12.5.8 */ 1158 mrb_define_method(mrb, a, "delete_at", mrb_ary_delete_at, MRB_ARGS_REQ(1)); /* 15.2.12.5.9 */ 1159 mrb_define_method(mrb, a, "empty?", mrb_ary_empty_p, MRB_ARGS_NONE()); /* 15.2.12.5.12 */ 1160 mrb_define_method(mrb, a, "first", mrb_ary_first, MRB_ARGS_OPT(1)); /* 15.2.12.5.13 */ 1161 mrb_define_method(mrb, a, "index", mrb_ary_index_m, MRB_ARGS_REQ(1)); /* 15.2.12.5.14 */ 1162 mrb_define_method(mrb, a, "initialize_copy", mrb_ary_replace_m, MRB_ARGS_REQ(1)); /* 15.2.12.5.16 */ 1163 mrb_define_method(mrb, a, "join", mrb_ary_join_m, MRB_ARGS_ANY()); /* 15.2.12.5.17 */ 1164 mrb_define_method(mrb, a, "last", mrb_ary_last, MRB_ARGS_ANY()); /* 15.2.12.5.18 */ 1165 mrb_define_method(mrb, a, "length", mrb_ary_size, MRB_ARGS_NONE()); /* 15.2.12.5.19 */ 1166 mrb_define_method(mrb, a, "pop", mrb_ary_pop, MRB_ARGS_NONE()); /* 15.2.12.5.21 */ 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()); 1169 mrb_define_method(mrb, a, "replace", mrb_ary_replace_m, MRB_ARGS_REQ(1)); /* 15.2.12.5.23 */ 1170 mrb_define_method(mrb, a, "reverse", mrb_ary_reverse, MRB_ARGS_NONE()); /* 15.2.12.5.24 */ 1171 mrb_define_method(mrb, a, "reverse!", mrb_ary_reverse_bang, MRB_ARGS_NONE()); /* 15.2.12.5.25 */ 1172 mrb_define_method(mrb, a, "rindex", mrb_ary_rindex_m, MRB_ARGS_REQ(1)); /* 15.2.12.5.26 */ 1173 mrb_define_method(mrb, a, "shift", mrb_ary_shift, MRB_ARGS_NONE()); /* 15.2.12.5.27 */ 1174 mrb_define_method(mrb, a, "size", mrb_ary_size, MRB_ARGS_NONE()); /* 15.2.12.5.28 */ 1175 mrb_define_method(mrb, a, "slice", mrb_ary_aget, MRB_ARGS_ANY()); /* 15.2.12.5.29 */ 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()); 1320 mrb_define_class_method(mrb, a, "[]", mrb_ary_s_create, MRB_ARGS_ANY()); /* 15.2.12.4.1 */ 1321 1322 mrb_define_method(mrb, a, "+", mrb_ary_plus, MRB_ARGS_REQ(1)); /* 15.2.12.5.1 */ 1323 mrb_define_method(mrb, a, "*", mrb_ary_times, MRB_ARGS_REQ(1)); /* 15.2.12.5.2 */ 1324 mrb_define_method(mrb, a, "<<", mrb_ary_push_m, MRB_ARGS_REQ(1)); /* 15.2.12.5.3 */ 1325 mrb_define_method(mrb, a, "[]", mrb_ary_aget, MRB_ARGS_ARG(1,1)); /* 15.2.12.5.4 */ 1326 mrb_define_method(mrb, a, "[]=", mrb_ary_aset, MRB_ARGS_ARG(2,1)); /* 15.2.12.5.5 */ 1327 mrb_define_method(mrb, a, "clear", mrb_ary_clear_m, MRB_ARGS_NONE()); /* 15.2.12.5.6 */ 1328 mrb_define_method(mrb, a, "concat", mrb_ary_concat_m, MRB_ARGS_REQ(1)); /* 15.2.12.5.8 */ 1329 mrb_define_method(mrb, a, "delete_at", mrb_ary_delete_at, MRB_ARGS_REQ(1)); /* 15.2.12.5.9 */ 1330 mrb_define_method(mrb, a, "empty?", mrb_ary_empty_p, MRB_ARGS_NONE()); /* 15.2.12.5.12 */ 1331 mrb_define_method(mrb, a, "first", mrb_ary_first, MRB_ARGS_OPT(1)); /* 15.2.12.5.13 */ 1332 mrb_define_method(mrb, a, "index", mrb_ary_index_m, MRB_ARGS_REQ(1)); /* 15.2.12.5.14 */ 1333 mrb_define_method(mrb, a, "initialize_copy", mrb_ary_replace_m, MRB_ARGS_REQ(1)); /* 15.2.12.5.16 */ 1334 mrb_define_method(mrb, a, "join", mrb_ary_join_m, MRB_ARGS_OPT(1)); /* 15.2.12.5.17 */ 1335 mrb_define_method(mrb, a, "last", mrb_ary_last, MRB_ARGS_OPT(1)); /* 15.2.12.5.18 */ 1336 mrb_define_method(mrb, a, "length", mrb_ary_size, MRB_ARGS_NONE()); /* 15.2.12.5.19 */ 1337 mrb_define_method(mrb, a, "pop", mrb_ary_pop, MRB_ARGS_NONE()); /* 15.2.12.5.21 */ 1338 mrb_define_method(mrb, a, "push", mrb_ary_push_m, MRB_ARGS_ANY()); /* 15.2.12.5.22 */ 1339 mrb_define_method(mrb, a, "replace", mrb_ary_replace_m, MRB_ARGS_REQ(1)); /* 15.2.12.5.23 */ 1340 mrb_define_method(mrb, a, "reverse", mrb_ary_reverse, MRB_ARGS_NONE()); /* 15.2.12.5.24 */ 1341 mrb_define_method(mrb, a, "reverse!", mrb_ary_reverse_bang, MRB_ARGS_NONE()); /* 15.2.12.5.25 */ 1342 mrb_define_method(mrb, a, "rindex", mrb_ary_rindex_m, MRB_ARGS_REQ(1)); /* 15.2.12.5.26 */ 1343 mrb_define_method(mrb, a, "shift", mrb_ary_shift, MRB_ARGS_NONE()); /* 15.2.12.5.27 */ 1344 mrb_define_method(mrb, a, "size", mrb_ary_size, MRB_ARGS_NONE()); /* 15.2.12.5.28 */ 1345 mrb_define_method(mrb, a, "slice", mrb_ary_aget, MRB_ARGS_ARG(1,1)); /* 15.2.12.5.29 */ 1346 mrb_define_method(mrb, a, "unshift", mrb_ary_unshift_m, MRB_ARGS_ANY()); /* 15.2.12.5.30 */ 1178 1347 1179 1348 mrb_define_method(mrb, a, "__ary_eq", mrb_ary_eq, MRB_ARGS_REQ(1)); 1180 1349 mrb_define_method(mrb, a, "__ary_cmp", mrb_ary_cmp, MRB_ARGS_REQ(1)); 1181 mrb_define_method(mrb, a, "__ary_index", mrb_ary_index_m, MRB_ARGS_REQ(1)); /* kept for mruby-array-ext */ 1182 } 1350 mrb_define_method(mrb, a, "__ary_index", mrb_ary_index_m, MRB_ARGS_REQ(1)); /* kept for mruby-array-ext */ 1351 mrb_define_method(mrb, a, "__svalue", mrb_ary_svalue, MRB_ARGS_NONE()); 1352 1353 init_ary_each(mrb, a); 1354 } -
EcnlProtoTool/trunk/mruby-2.1.1/src/backtrace.c
r331 r439 17 17 18 18 struct backtrace_location { 19 int lineno; 19 int32_t lineno; 20 mrb_sym method_id; 20 21 const char *filename; 21 mrb_sym method_id;22 22 }; 23 23 24 typedef void (*each_backtrace_func)(mrb_state*, int i,struct backtrace_location*, void*);24 typedef void (*each_backtrace_func)(mrb_state*, const struct backtrace_location*, void*); 25 25 26 26 static const mrb_data_type bt_type = { "Backtrace", mrb_free }; 27 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; 28 mrb_value mrb_exc_inspect(mrb_state *mrb, mrb_value exc); 29 mrb_value mrb_unpack_backtrace(mrb_state *mrb, mrb_value backtrace); 30 31 static void 32 each_backtrace(mrb_state *mrb, ptrdiff_t ciidx, const mrb_code *pc0, each_backtrace_func func, void *data) 33 { 34 ptrdiff_t i; 32 35 33 36 if (ciidx >= mrb->c->ciend - mrb->c->cibase) 34 37 ciidx = 10; /* ciidx is broken... */ 35 38 36 for (i=ciidx , j=0; i >= 0; i--,j++) {39 for (i=ciidx; i >= 0; i--) { 37 40 struct backtrace_location loc; 38 41 mrb_callinfo *ci; 39 42 mrb_irep *irep; 40 mrb_code *pc;43 const mrb_code *pc; 41 44 42 45 ci = &mrb->c->cibase[i]; … … 52 55 } 53 56 else if (i+1 <= ciidx) { 54 pc = mrb->c->cibase[i+1].pc - 1; 57 if (!mrb->c->cibase[i + 1].pc) continue; 58 pc = &mrb->c->cibase[i+1].pc[-1]; 55 59 } 56 60 else { 57 61 pc = pc0; 58 62 } 59 loc.filename = mrb_debug_get_filename(irep, (uint32_t)(pc - irep->iseq)); 60 loc.lineno = mrb_debug_get_line(irep, (uint32_t)(pc - irep->iseq)); 61 63 64 loc.lineno = mrb_debug_get_line(mrb, irep, pc - irep->iseq); 62 65 if (loc.lineno == -1) continue; 63 66 67 loc.filename = mrb_debug_get_filename(mrb, irep, pc - irep->iseq); 64 68 if (!loc.filename) { 65 69 loc.filename = "(unknown)"; … … 67 71 68 72 loc.method_id = ci->mid; 69 func(mrb, j,&loc, data);73 func(mrb, &loc, data); 70 74 } 71 75 } … … 74 78 75 79 static void 76 print_backtrace(mrb_state *mrb, mrb_value backtrace) 77 { 78 int i, n; 80 print_backtrace(mrb_state *mrb, struct RObject *exc, mrb_value backtrace) 81 { 82 mrb_int i; 83 mrb_int n = RARRAY_LEN(backtrace); 84 mrb_value *loc, mesg; 79 85 FILE *stream = stderr; 80 86 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 } 87 if (n != 0) { 88 fprintf(stream, "trace (most recent call last):\n"); 89 for (i=n-1,loc=&RARRAY_PTR(backtrace)[i]; i>0; i--,loc--) { 90 if (mrb_string_p(*loc)) { 91 fprintf(stream, "\t[%d] %.*s\n", 92 (int)i, (int)RSTRING_LEN(*loc), RSTRING_PTR(*loc)); 93 } 94 } 95 if (mrb_string_p(*loc)) { 96 fprintf(stream, "%.*s: ", (int)RSTRING_LEN(*loc), RSTRING_PTR(*loc)); 97 } 98 } 99 mesg = mrb_exc_inspect(mrb, mrb_obj_value(exc)); 100 fprintf(stream, "%.*s\n", (int)RSTRING_LEN(mesg), RSTRING_PTR(mesg)); 122 101 } 123 102 … … 138 117 backtrace = mrb_obj_iv_get(mrb, mrb->exc, mrb_intern_lit(mrb, "backtrace")); 139 118 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 } 119 if (!mrb_array_p(backtrace)) backtrace = mrb_unpack_backtrace(mrb, backtrace); 120 print_backtrace(mrb, mrb->exc, backtrace); 146 121 } 147 122 #else … … 155 130 156 131 static void 132 count_backtrace_i(mrb_state *mrb, 133 const struct backtrace_location *loc, 134 void *data) 135 { 136 int *lenp = (int*)data; 137 138 (*lenp)++; 139 } 140 141 static void 157 142 pack_backtrace_i(mrb_state *mrb, 158 int i, 159 struct backtrace_location *loc, 143 const struct backtrace_location *loc, 160 144 void *data) 161 145 { 162 struct backtrace_location *entry = (struct backtrace_location*)data; 163 164 entry[i] = *loc; 146 struct backtrace_location **pptr = (struct backtrace_location**)data; 147 struct backtrace_location *ptr = *pptr; 148 149 *ptr = *loc; 150 *pptr = ptr+1; 165 151 } 166 152 … … 170 156 struct RData *backtrace; 171 157 ptrdiff_t ciidx = mrb->c->ci - mrb->c->cibase; 172 mrb_int len = (ciidx+1)*sizeof(struct backtrace_location); 158 int len = 0; 159 int size; 173 160 void *ptr; 174 161 175 ptr = mrb_malloc(mrb, len); 176 memset(ptr, 0, len); 162 each_backtrace(mrb, ciidx, mrb->c->ci->pc, count_backtrace_i, &len); 163 size = len * sizeof(struct backtrace_location); 164 ptr = mrb_malloc(mrb, size); 177 165 backtrace = mrb_data_object_alloc(mrb, NULL, ptr, &bt_type); 178 backtrace->flags = (u nsigned int)ciidx+1;179 each_backtrace(mrb, ciidx, mrb->c->ci->pc, pack_backtrace_i, ptr);166 backtrace->flags = (uint32_t)len; 167 each_backtrace(mrb, ciidx, mrb->c->ci->pc, pack_backtrace_i, &ptr); 180 168 return mrb_obj_value(backtrace); 181 169 } … … 184 172 mrb_keep_backtrace(mrb_state *mrb, mrb_value exc) 185 173 { 174 mrb_sym sym = mrb_intern_lit(mrb, "backtrace"); 186 175 mrb_value backtrace; 187 int ai = mrb_gc_arena_save(mrb); 188 176 int ai; 177 178 if (mrb_iv_defined(mrb, exc, sym)) return; 179 ai = mrb_gc_arena_save(mrb); 189 180 backtrace = packed_backtrace(mrb); 190 mrb_iv_set(mrb, exc, mrb_intern_lit(mrb, "backtrace"), backtrace);181 mrb_iv_set(mrb, exc, sym, backtrace); 191 182 mrb_gc_arena_restore(mrb, ai); 192 183 } … … 195 186 mrb_unpack_backtrace(mrb_state *mrb, mrb_value backtrace) 196 187 { 197 struct backtrace_location *bt;188 const struct backtrace_location *bt; 198 189 mrb_int n, i; 199 200 if (mrb_nil_p(backtrace)) return mrb_ary_new_capa(mrb, 0); 190 int ai; 191 192 if (mrb_nil_p(backtrace)) { 193 empty_backtrace: 194 return mrb_ary_new_capa(mrb, 0); 195 } 201 196 if (mrb_array_p(backtrace)) return backtrace; 202 197 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 } 198 if (bt == NULL) goto empty_backtrace; 206 199 n = (mrb_int)RDATA(backtrace)->flags; 207 200 backtrace = mrb_ary_new_capa(mrb, n); 201 ai = mrb_gc_arena_save(mrb); 208 202 for (i = 0; i < n; i++) { 209 int ai = mrb_gc_arena_save(mrb); 210 struct backtrace_location *entry = &bt[i]; 203 const struct backtrace_location *entry = &bt[i]; 211 204 mrb_value btline; 212 205 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)); 206 btline = mrb_format(mrb, "%s:%d", entry->filename, (int)entry->lineno); 217 207 if (entry->method_id != 0) { 218 208 mrb_str_cat_lit(mrb, btline, ":in "); 219 mrb_str_cat_cstr(mrb, btline, mrb_sym 2name(mrb, entry->method_id));209 mrb_str_cat_cstr(mrb, btline, mrb_sym_name(mrb, entry->method_id)); 220 210 } 221 211 mrb_ary_push(mrb, backtrace, btline); -
EcnlProtoTool/trunk/mruby-2.1.1/src/class.c
r331 r439 8 8 #include <mruby.h> 9 9 #include <mruby/array.h> 10 #include <mruby/hash.h> 10 11 #include <mruby/class.h> 11 12 #include <mruby/numeric.h> … … 16 17 #include <mruby/data.h> 17 18 #include <mruby/istruct.h> 18 19 KHASH_DEFINE(mt, mrb_sym, struct RProc*, TRUE, kh_int_hash_func, kh_int_hash_equal) 19 #include <mruby/opcode.h> 20 21 KHASH_DEFINE(mt, mrb_sym, mrb_method_t, TRUE, kh_int_hash_func, kh_int_hash_equal) 20 22 21 23 void … … 28 30 for (k = kh_begin(h); k != kh_end(h); k++) { 29 31 if (kh_exist(h, k)) { 30 struct RProc *m = kh_value(h, k); 31 if (m) { 32 mrb_gc_mark(mrb, (struct RBasic*)m); 32 mrb_method_t m = kh_value(h, k); 33 34 if (MRB_METHOD_PROC_P(m)) { 35 struct RProc *p = MRB_METHOD_PROC(m); 36 mrb_gc_mark(mrb, (struct RBasic*)p); 33 37 } 34 38 } … … 51 55 } 52 56 53 static void 54 name_class(mrb_state *mrb, struct RClass *c, mrb_sym name) 55 { 56 mrb_obj_iv_set(mrb, (struct RObject*)c, 57 mrb_intern_lit(mrb, "__classid__"), mrb_symbol_value(name)); 57 void 58 mrb_class_name_class(mrb_state *mrb, struct RClass *outer, struct RClass *c, mrb_sym id) 59 { 60 mrb_value name; 61 mrb_sym nsym = mrb_intern_lit(mrb, "__classname__"); 62 63 if (mrb_obj_iv_defined(mrb, (struct RObject*)c, nsym)) return; 64 if (outer == NULL || outer == mrb->object_class) { 65 name = mrb_symbol_value(id); 66 } 67 else { 68 name = mrb_class_path(mrb, outer); 69 if (mrb_nil_p(name)) { /* unnamed outer class */ 70 if (outer != mrb->object_class && outer != c) { 71 mrb_obj_iv_set_force(mrb, (struct RObject*)c, mrb_intern_lit(mrb, "__outer__"), 72 mrb_obj_value(outer)); 73 } 74 return; 75 } 76 else { 77 mrb_int len; 78 const char *n = mrb_sym_name_len(mrb, id, &len); 79 80 mrb_str_cat_lit(mrb, name, "::"); 81 mrb_str_cat(mrb, name, n, len); 82 } 83 } 84 mrb_obj_iv_set_force(mrb, (struct RObject*)c, nsym, name); 85 } 86 87 mrb_bool 88 mrb_const_name_p(mrb_state *mrb, const char *name, mrb_int len) 89 { 90 return len > 0 && ISUPPER(name[0]) && mrb_ident_p(name+1, len-1); 58 91 } 59 92 … … 61 94 setup_class(mrb_state *mrb, struct RClass *outer, struct RClass *c, mrb_sym id) 62 95 { 63 name_class(mrb, c, id);96 mrb_class_name_class(mrb, outer, c, id); 64 97 mrb_obj_iv_set(mrb, (struct RObject*)outer, id, mrb_obj_value(c)); 65 if (outer != mrb->object_class) {66 mrb_obj_iv_set(mrb, (struct RObject*)c, mrb_intern_lit(mrb, "__outer__"),67 mrb_obj_value(outer));68 }69 98 } 70 99 … … 78 107 if (o->c->tt == MRB_TT_SCLASS) return; 79 108 sc = (struct RClass*)mrb_obj_alloc(mrb, MRB_TT_SCLASS, mrb->class_class); 109 sc->flags |= MRB_FL_CLASS_IS_INHERITED; 80 110 sc->mt = kh_init(mt, mrb); 81 111 sc->iv = 0; … … 104 134 mrb_field_write_barrier(mrb, (struct RBasic*)sc, (struct RBasic*)o); 105 135 mrb_obj_iv_set(mrb, (struct RObject*)sc, mrb_intern_lit(mrb, "__attached__"), mrb_obj_value(o)); 106 } 107 108 static struct RClass * 136 sc->flags |= o->flags & MRB_FL_OBJ_IS_FROZEN; 137 } 138 139 static mrb_value 140 class_name_str(mrb_state *mrb, struct RClass* c) 141 { 142 mrb_value path = mrb_class_path(mrb, c); 143 if (mrb_nil_p(path)) { 144 path = c->tt == MRB_TT_MODULE ? mrb_str_new_lit(mrb, "#<Module:") : 145 mrb_str_new_lit(mrb, "#<Class:"); 146 mrb_str_cat_str(mrb, path, mrb_ptr_to_str(mrb, c)); 147 mrb_str_cat_lit(mrb, path, ">"); 148 } 149 return path; 150 } 151 152 static struct RClass* 109 153 class_from_sym(mrb_state *mrb, struct RClass *klass, mrb_sym id) 110 154 { … … 115 159 } 116 160 117 static struct RClass 161 static struct RClass* 118 162 module_from_sym(mrb_state *mrb, struct RClass *klass, mrb_sym id) 119 163 { … … 137 181 } 138 182 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 183 static void 161 184 check_if_class_or_module(mrb_state *mrb, mrb_value obj) 162 185 { 163 186 if (!class_ptr_p(obj)) { 164 mrb_raisef(mrb, E_TYPE_ERROR, "% S is not a class/module", mrb_inspect(mrb, obj));187 mrb_raisef(mrb, E_TYPE_ERROR, "%!v is not a class/module", obj); 165 188 } 166 189 } … … 192 215 } 193 216 194 MRB_APIstruct RClass*217 struct RClass* 195 218 mrb_vm_define_module(mrb_state *mrb, mrb_value outer, mrb_sym id) 196 219 { … … 199 222 mrb_value old = mrb_const_get(mrb, outer, id); 200 223 201 if ( mrb_type(old) != MRB_TT_MODULE) {202 mrb_raisef(mrb, E_TYPE_ERROR, "% S is not a module", mrb_inspect(mrb, old));224 if (!mrb_module_p(old)) { 225 mrb_raisef(mrb, E_TYPE_ERROR, "%!v is not a module", old); 203 226 } 204 227 return mrb_class_ptr(old); … … 233 256 MRB_CLASS_ORIGIN(c); 234 257 if (super && mrb_class_real(c->super) != super) { 235 mrb_raisef(mrb, E_TYPE_ERROR, "superclass mismatch for Class %S (%S not %S)", 236 mrb_sym2str(mrb, name), 237 mrb_obj_value(c->super), mrb_obj_value(super)); 258 mrb_raisef(mrb, E_TYPE_ERROR, "superclass mismatch for Class %n (%C not %C)", 259 name, c->super, super); 238 260 } 239 261 return c; … … 250 272 { 251 273 if (!super) { 252 mrb_warn(mrb, "no super class for '% S', Object assumed", mrb_sym2str(mrb, name));274 mrb_warn(mrb, "no super class for '%n', Object assumed", name); 253 275 } 254 276 return define_class(mrb, name, super, mrb->object_class); … … 261 283 } 262 284 263 static mrb_value mrb_bob_init(mrb_state *mrb, mrb_value cv); 285 static mrb_value mrb_bob_init(mrb_state *mrb, mrb_value); 286 #ifdef MRB_METHOD_CACHE 287 static void mc_clear_all(mrb_state *mrb); 288 static void mc_clear_by_id(mrb_state *mrb, struct RClass*, mrb_sym); 289 #else 290 #define mc_clear_all(mrb) 291 #define mc_clear_by_id(mrb,c,s) 292 #endif 264 293 265 294 static void … … 271 300 if (!super) 272 301 super = mrb->object_class; 302 super->flags |= MRB_FL_CLASS_IS_INHERITED; 273 303 s = mrb_obj_value(super); 304 mrb_mc_clear_by_class(mrb, klass); 274 305 mid = mrb_intern_lit(mrb, "inherited"); 275 306 if (!mrb_func_basic_p(mrb, s, mid, mrb_bob_init)) { 276 307 mrb_value c = mrb_obj_value(klass); 277 mrb_funcall_argv(mrb, mrb_obj_value(super), mid, 1, &c);278 } 279 } 280 281 MRB_APIstruct RClass*308 mrb_funcall_argv(mrb, s, mid, 1, &c); 309 } 310 } 311 312 struct RClass* 282 313 mrb_vm_define_class(mrb_state *mrb, mrb_value outer, mrb_value super, mrb_sym id) 283 314 { … … 286 317 287 318 if (!mrb_nil_p(super)) { 288 if (mrb_type(super) != MRB_TT_CLASS) { 289 mrb_raisef(mrb, E_TYPE_ERROR, "superclass must be a Class (%S given)", 290 mrb_inspect(mrb, super)); 319 if (!mrb_class_p(super)) { 320 mrb_raisef(mrb, E_TYPE_ERROR, "superclass must be a Class (%!v given)", super); 291 321 } 292 322 s = mrb_class_ptr(super); … … 299 329 mrb_value old = mrb_const_get(mrb, outer, id); 300 330 301 if ( mrb_type(old) != MRB_TT_CLASS) {302 mrb_raisef(mrb, E_TYPE_ERROR, "% S is not a class", mrb_inspect(mrb, old));331 if (!mrb_class_p(old)) { 332 mrb_raisef(mrb, E_TYPE_ERROR, "%!v is not a class", old); 303 333 } 304 334 c = mrb_class_ptr(old); … … 306 336 /* check super class */ 307 337 if (mrb_class_real(c->super) != s) { 308 mrb_raisef(mrb, E_TYPE_ERROR, "superclass mismatch for class % S", old);338 mrb_raisef(mrb, E_TYPE_ERROR, "superclass mismatch for class %v", old); 309 339 } 310 340 } … … 337 367 } 338 368 339 MRB_API struct RClass 369 MRB_API struct RClass* 340 370 mrb_class_get_under(mrb_state *mrb, struct RClass *outer, const char *name) 341 371 { … … 343 373 } 344 374 345 MRB_API struct RClass 375 MRB_API struct RClass* 346 376 mrb_class_get(mrb_state *mrb, const char *name) 347 377 { … … 349 379 } 350 380 351 MRB_API struct RClass 381 MRB_API struct RClass* 352 382 mrb_exc_get(mrb_state *mrb, const char *name) 353 383 { … … 356 386 mrb_intern_cstr(mrb, name)); 357 387 358 if ( mrb_type(c) != MRB_TT_CLASS) {388 if (!mrb_class_p(c)) { 359 389 mrb_raise(mrb, mrb->eException_class, "exception corrupted"); 360 390 } … … 369 399 } 370 400 371 MRB_API struct RClass 401 MRB_API struct RClass* 372 402 mrb_module_get_under(mrb_state *mrb, struct RClass *outer, const char *name) 373 403 { … … 375 405 } 376 406 377 MRB_API struct RClass 407 MRB_API struct RClass* 378 408 mrb_module_get(mrb_state *mrb, const char *name) 379 409 { … … 384 414 * Defines a class under the namespace of \a outer. 385 415 * \param outer a class which contains the new class. 386 * \param idname of the new class416 * \param name name of the new class 387 417 * \param super a class from which the new class will derive. 388 418 * NULL means \c Object class. … … 397 427 * \a super, the function just returns the defined class. 398 428 */ 399 MRB_API struct RClass 429 MRB_API struct RClass* 400 430 mrb_define_class_under(mrb_state *mrb, struct RClass *outer, const char *name, struct RClass *super) 401 431 { … … 405 435 #if 0 406 436 if (!super) { 407 mrb_warn(mrb, "no super class for '%S::%S', Object assumed", 408 mrb_obj_value(outer), mrb_sym2str(mrb, id)); 437 mrb_warn(mrb, "no super class for '%C::%n', Object assumed", outer, id); 409 438 } 410 439 #endif … … 415 444 416 445 MRB_API void 417 mrb_define_method_raw(mrb_state *mrb, struct RClass *c, mrb_sym mid, struct RProc *p)446 mrb_define_method_raw(mrb_state *mrb, struct RClass *c, mrb_sym mid, mrb_method_t m) 418 447 { 419 448 khash_t(mt) *h; … … 422 451 h = c->mt; 423 452 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 } 453 mrb_check_frozen(mrb, c); 430 454 if (!h) h = c->mt = kh_init(mt, mrb); 431 455 k = kh_put(mt, mrb, h, mid); 432 kh_value(h, k) = p; 433 if (p) { 456 kh_value(h, k) = m; 457 if (MRB_METHOD_PROC_P(m) && !MRB_METHOD_UNDEF_P(m)) { 458 struct RProc *p = MRB_METHOD_PROC(m); 459 460 p->flags |= MRB_PROC_SCOPE; 434 461 p->c = NULL; 435 mrb_field_write_barrier(mrb, (struct RBasic *)c, (struct RBasic *)p); 436 } 462 mrb_field_write_barrier(mrb, (struct RBasic*)c, (struct RBasic*)p); 463 if (!MRB_PROC_ENV_P(p)) { 464 MRB_PROC_SET_TARGET_CLASS(p, c); 465 } 466 } 467 mc_clear_by_id(mrb, c, mid); 437 468 } 438 469 … … 440 471 mrb_define_method_id(mrb_state *mrb, struct RClass *c, mrb_sym mid, mrb_func_t func, mrb_aspec aspec) 441 472 { 442 struct RProc *p;473 mrb_method_t m; 443 474 int ai = mrb_gc_arena_save(mrb); 444 475 445 p = mrb_proc_new_cfunc(mrb, func); 446 p->target_class = c; 447 mrb_define_method_raw(mrb, c, mid, p); 476 MRB_METHOD_FROM_FUNC(m, func); 477 if (aspec == MRB_ARGS_NONE()) { 478 MRB_METHOD_NOARG_SET(m); 479 } 480 mrb_define_method_raw(mrb, c, mid, m); 448 481 mrb_gc_arena_restore(mrb, ai); 449 482 } … … 459 492 mrb_notimplement(mrb_state *mrb) 460 493 { 461 const char *str;462 mrb_int len;463 494 mrb_callinfo *ci = mrb->c->ci; 464 495 465 496 if (ci->mid) { 466 str = mrb_sym2name_len(mrb, ci->mid, &len); 467 mrb_raisef(mrb, E_NOTIMP_ERROR, 468 "%S() function is unimplemented on this machine", 469 mrb_str_new_static(mrb, str, (size_t)len)); 497 mrb_raisef(mrb, E_NOTIMP_ERROR, "%n() function is unimplemented on this machine", ci->mid); 470 498 } 471 499 } … … 481 509 482 510 static mrb_value 483 check_type(mrb_state *mrb, mrb_value val, enum mrb_vtype t, const char *c, const char *m)484 {485 mrb_value tmp;486 487 tmp = mrb_check_convert_type(mrb, val, t, c, m);488 if (mrb_nil_p(tmp)) {489 mrb_raisef(mrb, E_TYPE_ERROR, "expected %S", mrb_str_new_cstr(mrb, c));490 }491 return tmp;492 }493 494 static mrb_value495 to_str(mrb_state *mrb, mrb_value val)496 {497 return check_type(mrb, val, MRB_TT_STRING, "String", "to_str");498 }499 500 static mrb_value501 511 to_ary(mrb_state *mrb, mrb_value val) 502 512 { 503 return check_type(mrb, val, MRB_TT_ARRAY, "Array", "to_ary"); 513 mrb_check_type(mrb, val, MRB_TT_ARRAY); 514 return val; 504 515 } 505 516 … … 507 518 to_hash(mrb_state *mrb, mrb_value val) 508 519 { 509 return check_type(mrb, val, MRB_TT_HASH, "Hash", "to_hash"); 510 } 511 512 static mrb_sym 513 to_sym(mrb_state *mrb, mrb_value ss) 514 { 515 if (mrb_type(ss) == MRB_TT_SYMBOL) { 516 return mrb_symbol(ss); 517 } 518 else if (mrb_string_p(ss)) { 519 return mrb_intern_str(mrb, to_str(mrb, ss)); 520 } 521 else { 522 mrb_value obj = mrb_funcall(mrb, ss, "inspect", 0); 523 mrb_raisef(mrb, E_TYPE_ERROR, "%S is not a symbol", obj); 524 /* not reached */ 525 return 0; 526 } 527 } 520 mrb_check_type(mrb, val, MRB_TT_HASH); 521 return val; 522 } 523 524 #define to_sym(mrb, ss) mrb_obj_to_sym(mrb, ss) 525 526 MRB_API mrb_int 527 mrb_get_argc(mrb_state *mrb) 528 { 529 mrb_int argc = mrb->c->ci->argc; 530 531 if (argc < 0) { 532 struct RArray *a = mrb_ary_ptr(mrb->c->stack[1]); 533 534 argc = ARY_LEN(a); 535 } 536 return argc; 537 } 538 539 MRB_API mrb_value* 540 mrb_get_argv(mrb_state *mrb) 541 { 542 mrb_int argc = mrb->c->ci->argc; 543 mrb_value *array_argv = mrb->c->stack + 1; 544 if (argc < 0) { 545 struct RArray *a = mrb_ary_ptr(*array_argv); 546 547 array_argv = ARY_PTR(a); 548 } 549 return array_argv; 550 } 551 552 void mrb_hash_check_kdict(mrb_state *mrb, mrb_value self); 528 553 529 554 /* … … 539 564 ---------------------------------------------------------------------------------------------- 540 565 o: Object [mrb_value] 541 C: class/module [mrb_value]566 C: Class/Module [mrb_value] 542 567 S: String [mrb_value] when ! follows, the value may be nil 543 568 A: Array [mrb_value] when ! follows, the value may be nil … … 546 571 z: String [char*] NUL terminated string; z! gives NULL for nil 547 572 a: Array [mrb_value*,mrb_int] Receive two arguments; a! gives (NULL,0) for nil 548 f: Float [mrb_float] 549 i: Integer [mrb_int] 550 b: Boolean [mrb_bool] 551 n: Symbol [mrb_sym] 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*] 554 &: Block [mrb_value] 555 *: rest argument [mrb_value*,mrb_int] Receive the rest of the arguments as an array. 556 |: optional Next argument of '|' and later are optional. 557 ?: optional given [mrb_bool] true if preceding argument (optional) is given. 573 f: Fixnum/Float [mrb_float] 574 i: Fixnum/Float [mrb_int] 575 b: boolean [mrb_bool] 576 n: String/Symbol [mrb_sym] 577 d: data [void*,mrb_data_type const] 2nd argument will be used to check data type so it won't be modified; when ! follows, the value may be nil 578 I: inline struct [void*] 579 &: block [mrb_value] &! raises exception if no block given 580 *: rest argument [mrb_value*,mrb_int] The rest of the arguments as an array; *! avoid copy of the stack 581 |: optional Following arguments are optional 582 ?: optional given [mrb_bool] true if preceding argument (optional) is given 583 ':': keyword args [mrb_kwargs const] Get keyword arguments 558 584 */ 559 585 MRB_API mrb_int 560 586 mrb_get_args(mrb_state *mrb, const char *format, ...) 561 587 { 588 const char *fmt = format; 562 589 char c; 563 int i = 0;590 mrb_int i = 0; 564 591 va_list ap; 565 int argc = mrb->c->ci->argc;566 int arg_i = 0;567 mrb_bool ar ray_argv;592 mrb_int argc = mrb->c->ci->argc; 593 mrb_value *array_argv = mrb->c->stack+1; 594 mrb_bool argv_on_stack = argc >= 0; 568 595 mrb_bool opt = FALSE; 596 mrb_bool opt_skip = TRUE; 569 597 mrb_bool given = TRUE; 570 598 mrb_value kdict; 599 mrb_bool reqkarg = FALSE; 600 mrb_int needargc = 0; 601 602 if (!argv_on_stack) { 603 struct RArray *a = mrb_ary_ptr(*array_argv); 604 array_argv = ARY_PTR(a); 605 argc = ARY_LEN(a); 606 } 571 607 va_start(ap, format); 572 if (argc < 0) { 573 struct RArray *a = mrb_ary_ptr(mrb->c->stack[1]); 574 575 argc = a->len; 576 array_argv = TRUE; 608 609 #define ARGV array_argv 610 611 while ((c = *fmt++)) { 612 switch (c) { 613 case '|': 614 opt = TRUE; 615 break; 616 case '*': 617 opt_skip = FALSE; 618 if (!reqkarg) reqkarg = strchr(fmt, ':') ? TRUE : FALSE; 619 goto check_exit; 620 case '!': 621 break; 622 case ':': 623 reqkarg = TRUE; 624 /* fall through */ 625 case '&': case '?': 626 if (opt) opt_skip = FALSE; 627 break; 628 default: 629 if (!opt) needargc ++; 630 break; 631 } 632 } 633 634 check_exit: 635 if (reqkarg && argc > needargc && mrb_hash_p(kdict = ARGV[argc - 1])) { 636 mrb_hash_check_kdict(mrb, kdict); 637 argc --; 577 638 } 578 639 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 640 kdict = mrb_nil_value(); 641 } 642 643 opt = FALSE; 644 i = 0; 585 645 while ((c = *format++)) { 646 mrb_value *argv = ARGV; 647 mrb_bool altmode; 648 586 649 switch (c) { 587 case '|': case '*': case '&': case '?': 650 case '|': case '*': case '&': case '?': case ':': 588 651 break; 589 652 default: … … 599 662 } 600 663 664 if (*format == '!') { 665 format ++; 666 altmode = TRUE; 667 } 668 else { 669 altmode = FALSE; 670 } 671 601 672 switch (c) { 602 673 case 'o': … … 606 677 p = va_arg(ap, mrb_value*); 607 678 if (i < argc) { 608 *p = ARGV[arg_i++]; 609 i++; 679 *p = argv[i++]; 610 680 } 611 681 } … … 619 689 mrb_value ss; 620 690 621 ss = ARGV[arg_i++];691 ss = argv[i++]; 622 692 if (!class_ptr_p(ss)) { 623 mrb_raisef(mrb, E_TYPE_ERROR, "% Sis not class/module", ss);693 mrb_raisef(mrb, E_TYPE_ERROR, "%v is not class/module", ss); 624 694 } 625 695 *p = ss; 626 i++;627 696 } 628 697 } … … 633 702 634 703 p = va_arg(ap, mrb_value*); 635 if (*format == '!') { 636 format++; 637 if (i < argc && mrb_nil_p(ARGV[arg_i])) { 638 *p = ARGV[arg_i++]; 639 i++; 640 break; 704 if (i < argc) { 705 *p = argv[i++]; 706 if (!(altmode && mrb_nil_p(*p))) { 707 mrb_to_str(mrb, *p); 641 708 } 642 }643 if (i < argc) {644 *p = to_str(mrb, ARGV[arg_i++]);645 i++;646 709 } 647 710 } … … 652 715 653 716 p = va_arg(ap, mrb_value*); 654 if (*format == '!') { 655 format++; 656 if (i < argc && mrb_nil_p(ARGV[arg_i])) { 657 *p = ARGV[arg_i++]; 658 i++; 659 break; 717 if (i < argc) { 718 *p = argv[i++]; 719 if (!(altmode && mrb_nil_p(*p))) { 720 *p = to_ary(mrb, *p); 660 721 } 661 }662 if (i < argc) {663 *p = to_ary(mrb, ARGV[arg_i++]);664 i++;665 722 } 666 723 } … … 671 728 672 729 p = va_arg(ap, mrb_value*); 673 if (*format == '!') { 674 format++; 675 if (i < argc && mrb_nil_p(ARGV[arg_i])) { 676 *p = ARGV[arg_i++]; 677 i++; 678 break; 730 if (i < argc) { 731 *p = argv[i++]; 732 if (!(altmode && mrb_nil_p(*p))) { 733 *p = to_hash(mrb, *p); 679 734 } 680 }681 if (i < argc) {682 *p = to_hash(mrb, ARGV[arg_i++]);683 i++;684 735 } 685 736 } … … 693 744 ps = va_arg(ap, char**); 694 745 pl = va_arg(ap, mrb_int*); 695 if ( *format == '!') {696 format++;697 if ( i < argc && mrb_nil_p(ARGV[arg_i])) {746 if (i < argc) { 747 ss = argv[i++]; 748 if (altmode && mrb_nil_p(ss)) { 698 749 *ps = NULL; 699 750 *pl = 0; 700 i++; arg_i++;701 break;702 751 } 703 } 704 if (i < argc) { 705 ss = to_str(mrb, ARGV[arg_i++]); 706 *ps = RSTRING_PTR(ss); 707 *pl = RSTRING_LEN(ss); 708 i++; 752 else { 753 mrb_to_str(mrb, ss); 754 *ps = RSTRING_PTR(ss); 755 *pl = RSTRING_LEN(ss); 756 } 709 757 } 710 758 } … … 716 764 717 765 ps = va_arg(ap, const char**); 718 if ( *format == '!') {719 format++;720 if ( i < argc && mrb_nil_p(ARGV[arg_i])) {766 if (i < argc) { 767 ss = argv[i++]; 768 if (altmode && mrb_nil_p(ss)) { 721 769 *ps = NULL; 722 i++; arg_i++;723 break;724 770 } 725 } 726 if (i < argc) { 727 ss = to_str(mrb, ARGV[arg_i++]); 728 *ps = mrb_string_value_cstr(mrb, &ss); 729 i++; 771 else { 772 mrb_to_str(mrb, ss); 773 *ps = RSTRING_CSTR(mrb, ss); 774 } 730 775 } 731 776 } … … 740 785 pb = va_arg(ap, mrb_value**); 741 786 pl = va_arg(ap, mrb_int*); 742 if ( *format == '!') {743 format++;744 if ( i < argc && mrb_nil_p(ARGV[arg_i])) {787 if (i < argc) { 788 aa = argv[i++]; 789 if (altmode && mrb_nil_p(aa)) { 745 790 *pb = 0; 746 791 *pl = 0; 747 i++; arg_i++;748 break;749 792 } 750 } 751 if (i < argc) { 752 aa = to_ary(mrb, ARGV[arg_i++]); 753 a = mrb_ary_ptr(aa); 754 *pb = a->ptr; 755 *pl = a->len; 756 i++; 793 else { 794 aa = to_ary(mrb, aa); 795 a = mrb_ary_ptr(aa); 796 *pb = ARY_PTR(a); 797 *pl = ARY_LEN(a); 798 } 757 799 } 758 800 } … … 765 807 p = va_arg(ap, void**); 766 808 if (i < argc) { 767 ss = ARGV[arg_i];768 if ( mrb_type(ss) != MRB_TT_ISTRUCT)809 ss = argv[i++]; 810 if (!mrb_istruct_p(ss)) 769 811 { 770 mrb_raisef(mrb, E_TYPE_ERROR, "% Sis not inline struct", ss);812 mrb_raisef(mrb, E_TYPE_ERROR, "%v is not inline struct", ss); 771 813 } 772 814 *p = mrb_istruct_ptr(ss); 773 arg_i++; 774 i++; 775 } 776 } 777 break; 815 } 816 } 817 break; 818 #ifndef MRB_WITHOUT_FLOAT 778 819 case 'f': 779 820 { … … 782 823 p = va_arg(ap, mrb_float*); 783 824 if (i < argc) { 784 *p = mrb_to_flo(mrb, ARGV[arg_i]); 785 arg_i++; 786 i++; 787 } 788 } 789 break; 825 *p = mrb_to_flo(mrb, argv[i++]); 826 } 827 } 828 break; 829 #endif 790 830 case 'i': 791 831 { … … 794 834 p = va_arg(ap, mrb_int*); 795 835 if (i < argc) { 796 switch (mrb_type(ARGV[arg_i])) { 797 case MRB_TT_FIXNUM: 798 *p = mrb_fixnum(ARGV[arg_i]); 799 break; 800 case MRB_TT_FLOAT: 801 { 802 mrb_float f = mrb_float(ARGV[arg_i]); 803 804 if (!FIXABLE_FLOAT(f)) { 805 mrb_raise(mrb, E_RANGE_ERROR, "float too big for int"); 806 } 807 *p = (mrb_int)f; 808 } 809 break; 810 case MRB_TT_STRING: 811 mrb_raise(mrb, E_TYPE_ERROR, "no implicit conversion of String into Integer"); 812 break; 813 default: 814 *p = mrb_fixnum(mrb_Integer(mrb, ARGV[arg_i])); 815 break; 816 } 817 arg_i++; 818 i++; 836 *p = mrb_fixnum(mrb_to_int(mrb, argv[i++])); 819 837 } 820 838 } … … 825 843 826 844 if (i < argc) { 827 mrb_value b = ARGV[arg_i++];845 mrb_value b = argv[i++]; 828 846 *boolp = mrb_test(b); 829 i++;830 847 } 831 848 } … … 839 856 mrb_value ss; 840 857 841 ss = ARGV[arg_i++];858 ss = argv[i++]; 842 859 *symp = to_sym(mrb, ss); 843 i++;844 860 } 845 861 } … … 852 868 datap = va_arg(ap, void**); 853 869 type = va_arg(ap, struct mrb_data_type const*); 854 if ( *format == '!') {855 format++;856 if ( i < argc && mrb_nil_p(ARGV[arg_i])) {870 if (i < argc) { 871 mrb_value dd = argv[i++]; 872 if (altmode && mrb_nil_p(dd)) { 857 873 *datap = 0; 858 i++; arg_i++;859 break;860 874 } 861 } 862 if (i < argc) { 863 *datap = mrb_data_get_ptr(mrb, ARGV[arg_i++], type); 864 ++i; 875 else { 876 *datap = mrb_data_get_ptr(mrb, dd, type); 877 } 865 878 } 866 879 } … … 878 891 bp = mrb->c->stack + mrb->c->ci->argc + 1; 879 892 } 893 if (altmode && mrb_nil_p(*bp)) { 894 mrb_raise(mrb, E_ARGUMENT_ERROR, "no block given"); 895 } 880 896 *p = *bp; 881 897 } 882 898 break; 883 899 case '|': 900 if (opt_skip && i == argc) goto finish; 884 901 opt = TRUE; 885 902 break; … … 897 914 mrb_value **var; 898 915 mrb_int *pl; 916 mrb_bool nocopy = (altmode || !argv_on_stack) ? TRUE : FALSE; 899 917 900 918 var = va_arg(ap, mrb_value**); … … 903 921 *pl = argc-i; 904 922 if (*pl > 0) { 905 *var = ARGV + arg_i; 923 if (nocopy) { 924 *var = argv+i; 925 } 926 else { 927 mrb_value args = mrb_ary_new_from_values(mrb, *pl, argv+i); 928 RARRAY(args)->c = NULL; 929 *var = RARRAY_PTR(args); 930 } 906 931 } 907 932 i = argc; 908 arg_i += *pl;909 933 } 910 934 else { … … 914 938 } 915 939 break; 940 941 case ':': 942 { 943 mrb_value ksrc = mrb_hash_p(kdict) ? mrb_hash_dup(mrb, kdict) : mrb_hash_new(mrb); 944 const mrb_kwargs *kwargs = va_arg(ap, const mrb_kwargs*); 945 mrb_value *rest; 946 947 if (kwargs == NULL) { 948 rest = NULL; 949 } 950 else { 951 uint32_t kwnum = kwargs->num; 952 uint32_t required = kwargs->required; 953 const char *const *kname = kwargs->table; 954 mrb_value *values = kwargs->values; 955 uint32_t j; 956 const uint32_t keyword_max = 40; 957 958 if (kwnum > keyword_max || required > kwnum) { 959 mrb_raise(mrb, E_ARGUMENT_ERROR, "keyword number is too large"); 960 } 961 962 for (j = required; j > 0; j --, kname ++, values ++) { 963 mrb_value k = mrb_symbol_value(mrb_intern_cstr(mrb, *kname)); 964 if (!mrb_hash_key_p(mrb, ksrc, k)) { 965 mrb_raisef(mrb, E_ARGUMENT_ERROR, "missing keyword: %s", *kname); 966 } 967 *values = mrb_hash_delete_key(mrb, ksrc, k); 968 mrb_gc_protect(mrb, *values); 969 } 970 971 for (j = kwnum - required; j > 0; j --, kname ++, values ++) { 972 mrb_value k = mrb_symbol_value(mrb_intern_cstr(mrb, *kname)); 973 if (mrb_hash_key_p(mrb, ksrc, k)) { 974 *values = mrb_hash_delete_key(mrb, ksrc, k); 975 mrb_gc_protect(mrb, *values); 976 } 977 else { 978 *values = mrb_undef_value(); 979 } 980 } 981 982 rest = kwargs->rest; 983 } 984 985 if (rest) { 986 *rest = ksrc; 987 } 988 else if (!mrb_hash_empty_p(mrb, ksrc)) { 989 ksrc = mrb_hash_keys(mrb, ksrc); 990 ksrc = RARRAY_PTR(ksrc)[0]; 991 mrb_raisef(mrb, E_ARGUMENT_ERROR, "unknown keyword: %v", ksrc); 992 } 993 } 994 break; 995 916 996 default: 917 mrb_raisef(mrb, E_ARGUMENT_ERROR, "invalid argument specifier % S", mrb_str_new(mrb, &c, 1));997 mrb_raisef(mrb, E_ARGUMENT_ERROR, "invalid argument specifier %c", c); 918 998 break; 919 999 } … … 925 1005 mrb_raise(mrb, E_ARGUMENT_ERROR, "wrong number of arguments"); 926 1006 } 1007 1008 finish: 927 1009 va_end(ap); 928 1010 return i; … … 983 1065 int superclass_seen = 0; 984 1066 985 if (m->flags & MRB_FL AG_IS_PREPENDED)1067 if (m->flags & MRB_FL_CLASS_IS_PREPENDED) 986 1068 goto skip; 987 1069 … … 990 1072 991 1073 p = c->super; 992 while (p) {1074 while (p) { 993 1075 if (p->tt == MRB_TT_ICLASS) { 994 1076 if (p->mt == m->mt) { … … 1006 1088 1007 1089 ic = include_class_new(mrb, m, ins_pos->super); 1090 m->flags |= MRB_FL_CLASS_IS_INHERITED; 1008 1091 ins_pos->super = ic; 1009 mrb_field_write_barrier(mrb, (struct RBasic*)ins_pos, (struct RBasic*)ins_pos->super); 1092 mrb_field_write_barrier(mrb, (struct RBasic*)ins_pos, (struct RBasic*)ic); 1093 mrb_mc_clear_by_class(mrb, ins_pos); 1010 1094 ins_pos = ic; 1011 1095 skip: 1012 1096 m = m->super; 1013 1097 } 1098 mc_clear_all(mrb); 1014 1099 return 0; 1015 1100 } … … 1018 1103 mrb_include_module(mrb_state *mrb, struct RClass *c, struct RClass *m) 1019 1104 { 1020 int changed = include_module_at(mrb, c, find_origin(c), m, 1);1021 if ( changed< 0) {1105 mrb_check_frozen(mrb, c); 1106 if (include_module_at(mrb, c, find_origin(c), m, 1) < 0) { 1022 1107 mrb_raise(mrb, E_ARGUMENT_ERROR, "cyclic include detected"); 1023 1108 } … … 1030 1115 int changed = 0; 1031 1116 1032 if (!(c->flags & MRB_FLAG_IS_PREPENDED)) { 1117 mrb_check_frozen(mrb, c); 1118 if (!(c->flags & MRB_FL_CLASS_IS_PREPENDED)) { 1033 1119 origin = (struct RClass*)mrb_obj_alloc(mrb, MRB_TT_ICLASS, c); 1034 origin->flags |= MRB_FL AG_IS_ORIGIN;1120 origin->flags |= MRB_FL_CLASS_IS_ORIGIN | MRB_FL_CLASS_IS_INHERITED; 1035 1121 origin->super = c->super; 1036 1122 c->super = origin; … … 1038 1124 c->mt = kh_init(mt, mrb); 1039 1125 mrb_field_write_barrier(mrb, (struct RBasic*)c, (struct RBasic*)origin); 1040 c->flags |= MRB_FL AG_IS_PREPENDED;1126 c->flags |= MRB_FL_CLASS_IS_PREPENDED; 1041 1127 } 1042 1128 changed = include_module_at(mrb, c, c, m, 0); … … 1115 1201 mrb_ary_push(mrb, result, mrb_obj_value(c->c)); 1116 1202 } 1117 else if (!(c->flags & MRB_FL AG_IS_PREPENDED)) {1203 else if (!(c->flags & MRB_FL_CLASS_IS_PREPENDED)) { 1118 1204 mrb_ary_push(mrb, result, mrb_obj_value(c)); 1119 1205 } … … 1133 1219 mrb_include_module(mrb, mrb_class_ptr(mrb_singleton_class(mrb, obj)), mrb_class_ptr(mod)); 1134 1220 return mod; 1135 }1136 1137 static mrb_value1138 mrb_mod_included_modules(mrb_state *mrb, mrb_value self)1139 {1140 mrb_value result;1141 struct RClass *c = mrb_class_ptr(self);1142 struct RClass *origin = c;1143 1144 MRB_CLASS_ORIGIN(origin);1145 result = mrb_ary_new(mrb);1146 while (c) {1147 if (c != origin && c->tt == MRB_TT_ICLASS) {1148 if (c->c->tt == MRB_TT_MODULE) {1149 mrb_ary_push(mrb, result, mrb_obj_value(c->c));1150 }1151 }1152 c = c->super;1153 }1154 1155 return result;1156 1221 } 1157 1222 … … 1167 1232 } 1168 1233 return mod; 1169 }1170 1171 mrb_value mrb_class_instance_method_list(mrb_state*, mrb_bool, struct RClass*, int);1172 1173 /* 15.2.2.4.33 */1174 /*1175 * call-seq:1176 * mod.instance_methods(include_super=true) -> array1177 *1178 * Returns an array containing the names of the public and protected instance1179 * methods in the receiver. For a module, these are the public and protected methods;1180 * for a class, they are the instance (not singleton) methods. With no1181 * argument, or with an argument that is <code>false</code>, the1182 * instance methods in <i>mod</i> are returned, otherwise the methods1183 * in <i>mod</i> and <i>mod</i>'s superclasses are returned.1184 *1185 * module A1186 * def method1() end1187 * end1188 * class B1189 * def method2() end1190 * end1191 * class C < B1192 * def method3() end1193 * end1194 *1195 * A.instance_methods #=> [:method1]1196 * B.instance_methods(false) #=> [:method2]1197 * C.instance_methods(false) #=> [:method3]1198 * C.instance_methods(true).length #=> 431199 */1200 1201 static mrb_value1202 mrb_mod_instance_methods(mrb_state *mrb, mrb_value mod)1203 {1204 struct RClass *c = mrb_class_ptr(mod);1205 mrb_bool recur = TRUE;1206 mrb_get_args(mrb, "|b", &recur);1207 return mrb_class_instance_method_list(mrb, recur, c, 0);1208 1234 } 1209 1235 … … 1233 1259 case MRB_TT_SYMBOL: 1234 1260 case MRB_TT_FIXNUM: 1261 #ifndef MRB_WITHOUT_FLOAT 1235 1262 case MRB_TT_FLOAT: 1263 #endif 1236 1264 mrb_raise(mrb, E_TYPE_ERROR, "can't define singleton"); 1237 1265 return mrb_nil_value(); /* not reached */ … … 1264 1292 } 1265 1293 1266 MRB_API struct RProc* 1294 #ifdef MRB_METHOD_CACHE 1295 static void 1296 mc_clear_all(mrb_state *mrb) 1297 { 1298 struct mrb_cache_entry *mc = mrb->cache; 1299 int i; 1300 1301 for (i=0; i<MRB_METHOD_CACHE_SIZE; i++) { 1302 mc[i].c = 0; 1303 } 1304 } 1305 1306 void 1307 mrb_mc_clear_by_class(mrb_state *mrb, struct RClass *c) 1308 { 1309 struct mrb_cache_entry *mc = mrb->cache; 1310 int i; 1311 1312 if (c->flags & MRB_FL_CLASS_IS_INHERITED) { 1313 mc_clear_all(mrb); 1314 c->flags &= ~MRB_FL_CLASS_IS_INHERITED; 1315 return; 1316 } 1317 for (i=0; i<MRB_METHOD_CACHE_SIZE; i++) { 1318 if (mc[i].c == c) mc[i].c = 0; 1319 } 1320 } 1321 1322 static void 1323 mc_clear_by_id(mrb_state *mrb, struct RClass *c, mrb_sym mid) 1324 { 1325 struct mrb_cache_entry *mc = mrb->cache; 1326 int i; 1327 1328 if (c->flags & MRB_FL_CLASS_IS_INHERITED) { 1329 mc_clear_all(mrb); 1330 c->flags &= ~MRB_FL_CLASS_IS_INHERITED; 1331 return; 1332 } 1333 for (i=0; i<MRB_METHOD_CACHE_SIZE; i++) { 1334 if (mc[i].c == c || mc[i].mid == mid) 1335 mc[i].c = 0; 1336 } 1337 } 1338 #endif 1339 1340 MRB_API mrb_method_t 1267 1341 mrb_method_search_vm(mrb_state *mrb, struct RClass **cp, mrb_sym mid) 1268 1342 { 1269 1343 khiter_t k; 1270 struct RProc *m;1344 mrb_method_t m; 1271 1345 struct RClass *c = *cp; 1346 #ifdef MRB_METHOD_CACHE 1347 struct RClass *oc = c; 1348 int h = kh_int_hash_func(mrb, ((intptr_t)oc) ^ mid) & (MRB_METHOD_CACHE_SIZE-1); 1349 struct mrb_cache_entry *mc = &mrb->cache[h]; 1350 1351 if (mc->c == c && mc->mid == mid) { 1352 *cp = mc->c0; 1353 return mc->m; 1354 } 1355 #endif 1272 1356 1273 1357 while (c) { … … 1278 1362 if (k != kh_end(h)) { 1279 1363 m = kh_value(h, k); 1280 if ( !m) break;1364 if (MRB_METHOD_UNDEF_P(m)) break; 1281 1365 *cp = c; 1366 #ifdef MRB_METHOD_CACHE 1367 mc->c = oc; 1368 mc->c0 = c; 1369 mc->mid = mid; 1370 mc->m = m; 1371 #endif 1282 1372 return m; 1283 1373 } … … 1285 1375 c = c->super; 1286 1376 } 1287 return NULL; /* no method */ 1288 } 1289 1290 MRB_API struct RProc* 1377 MRB_METHOD_FROM_PROC(m, NULL); 1378 return m; /* no method */ 1379 } 1380 1381 MRB_API mrb_method_t 1291 1382 mrb_method_search(mrb_state *mrb, struct RClass* c, mrb_sym mid) 1292 1383 { 1293 struct RProc *m;1384 mrb_method_t m; 1294 1385 1295 1386 m = mrb_method_search_vm(mrb, &c, mid); 1296 if (!m) { 1297 mrb_value inspect = mrb_funcall(mrb, mrb_obj_value(c), "inspect", 0); 1298 if (mrb_string_p(inspect) && RSTRING_LEN(inspect) > 64) { 1299 inspect = mrb_any_to_s(mrb, mrb_obj_value(c)); 1300 } 1301 mrb_name_error(mrb, mid, "undefined method '%S' for class %S", 1302 mrb_sym2str(mrb, mid), inspect); 1387 if (MRB_METHOD_UNDEF_P(m)) { 1388 mrb_name_error(mrb, mid, "undefined method '%n' for class %C", mid, c); 1303 1389 } 1304 1390 return m; 1305 1391 } 1306 1392 1307 static mrb_value 1308 attr_reader(mrb_state *mrb, mrb_value obj) 1309 { 1310 mrb_value name = mrb_proc_cfunc_env_get(mrb, 0); 1311 return mrb_iv_get(mrb, obj, to_sym(mrb, name)); 1312 } 1313 1314 static mrb_value 1315 mrb_mod_attr_reader(mrb_state *mrb, mrb_value mod) 1393 #define ONSTACK_ALLOC_MAX 32 1394 1395 static mrb_sym 1396 prepare_name_common(mrb_state *mrb, mrb_sym sym, const char *prefix, const char *suffix) 1397 { 1398 char onstack[ONSTACK_ALLOC_MAX]; 1399 mrb_int sym_len; 1400 const char *sym_str = mrb_sym_name_len(mrb, sym, &sym_len); 1401 size_t prefix_len = prefix ? strlen(prefix) : 0; 1402 size_t suffix_len = suffix ? strlen(suffix) : 0; 1403 size_t name_len = sym_len + prefix_len + suffix_len; 1404 char *buf = name_len > sizeof(onstack) ? (char *)mrb_alloca(mrb, name_len) : onstack; 1405 char *p = buf; 1406 1407 if (prefix_len > 0) { 1408 memcpy(p, prefix, prefix_len); 1409 p += prefix_len; 1410 } 1411 1412 memcpy(p, sym_str, sym_len); 1413 p += sym_len; 1414 1415 if (suffix_len > 0) { 1416 memcpy(p, suffix, suffix_len); 1417 p += suffix_len; 1418 } 1419 1420 return mrb_intern(mrb, buf, name_len); 1421 } 1422 1423 static mrb_value 1424 prepare_ivar_name(mrb_state *mrb, mrb_sym sym) 1425 { 1426 sym = prepare_name_common(mrb, sym, "@", NULL); 1427 mrb_iv_name_sym_check(mrb, sym); 1428 return mrb_symbol_value(sym); 1429 } 1430 1431 static mrb_sym 1432 prepare_writer_name(mrb_state *mrb, mrb_sym sym) 1433 { 1434 return prepare_name_common(mrb, sym, NULL, "="); 1435 } 1436 1437 static mrb_value 1438 mod_attr_define(mrb_state *mrb, mrb_value mod, mrb_value (*accessor)(mrb_state *, mrb_value), mrb_sym (*access_name)(mrb_state *, mrb_sym)) 1316 1439 { 1317 1440 struct RClass *c = mrb_class_ptr(mod); … … 1323 1446 ai = mrb_gc_arena_save(mrb); 1324 1447 for (i=0; i<argc; i++) { 1325 mrb_value name, str; 1326 mrb_sym method, sym; 1448 mrb_value name; 1449 mrb_sym method; 1450 struct RProc *p; 1451 mrb_method_t m; 1327 1452 1328 1453 method = to_sym(mrb, argv[i]); 1329 name = mrb_sym2str(mrb, method); 1330 str = mrb_str_buf_new(mrb, RSTRING_LEN(name)+1); 1331 mrb_str_cat_lit(mrb, str, "@"); 1332 mrb_str_cat_str(mrb, str, name); 1333 sym = mrb_intern_str(mrb, str); 1334 mrb_iv_check(mrb, sym); 1335 name = mrb_symbol_value(sym); 1336 mrb_define_method_raw(mrb, c, method, 1337 mrb_proc_new_cfunc_with_env(mrb, attr_reader, 1, &name)); 1454 name = prepare_ivar_name(mrb, method); 1455 if (access_name) { 1456 method = access_name(mrb, method); 1457 } 1458 1459 p = mrb_proc_new_cfunc_with_env(mrb, accessor, 1, &name); 1460 MRB_METHOD_FROM_PROC(m, p); 1461 mrb_define_method_raw(mrb, c, method, m); 1338 1462 mrb_gc_arena_restore(mrb, ai); 1339 1463 } 1340 1464 return mrb_nil_value(); 1465 } 1466 1467 static mrb_value 1468 attr_reader(mrb_state *mrb, mrb_value obj) 1469 { 1470 mrb_value name = mrb_proc_cfunc_env_get(mrb, 0); 1471 return mrb_iv_get(mrb, obj, to_sym(mrb, name)); 1472 } 1473 1474 static mrb_value 1475 mrb_mod_attr_reader(mrb_state *mrb, mrb_value mod) 1476 { 1477 return mod_attr_define(mrb, mod, attr_reader, NULL); 1341 1478 } 1342 1479 … … 1355 1492 mrb_mod_attr_writer(mrb_state *mrb, mrb_value mod) 1356 1493 { 1357 struct RClass *c = mrb_class_ptr(mod); 1358 mrb_value *argv; 1359 mrb_int argc, i; 1360 int ai; 1361 1362 mrb_get_args(mrb, "*", &argv, &argc); 1363 ai = mrb_gc_arena_save(mrb); 1364 for (i=0; i<argc; i++) { 1365 mrb_value name, str, attr; 1366 mrb_sym method, sym; 1367 1368 method = to_sym(mrb, argv[i]); 1369 1370 /* prepare iv name (@name) */ 1371 name = mrb_sym2str(mrb, method); 1372 str = mrb_str_buf_new(mrb, RSTRING_LEN(name)+1); 1373 mrb_str_cat_lit(mrb, str, "@"); 1374 mrb_str_cat_str(mrb, str, name); 1375 sym = mrb_intern_str(mrb, str); 1376 mrb_iv_check(mrb, sym); 1377 attr = mrb_symbol_value(sym); 1378 1379 /* prepare method name (name=) */ 1380 str = mrb_str_buf_new(mrb, RSTRING_LEN(str)); 1381 mrb_str_cat_str(mrb, str, name); 1382 mrb_str_cat_lit(mrb, str, "="); 1383 method = mrb_intern_str(mrb, str); 1384 1385 mrb_define_method_raw(mrb, c, method, 1386 mrb_proc_new_cfunc_with_env(mrb, attr_writer, 1, &attr)); 1387 mrb_gc_arena_restore(mrb, ai); 1388 } 1389 return mrb_nil_value(); 1494 return mod_attr_define(mrb, mod, attr_writer, prepare_writer_name); 1390 1495 } 1391 1496 … … 1402 1507 if (ttype == 0) ttype = MRB_TT_OBJECT; 1403 1508 if (ttype <= MRB_TT_CPTR) { 1404 mrb_raisef(mrb, E_TYPE_ERROR, "can't create instance of % S", cv);1509 mrb_raisef(mrb, E_TYPE_ERROR, "can't create instance of %v", cv); 1405 1510 } 1406 1511 o = (struct RObject*)mrb_obj_alloc(mrb, ttype, c); … … 1420 1525 */ 1421 1526 1422 MRB_APImrb_value1527 mrb_value 1423 1528 mrb_instance_new(mrb_state *mrb, mrb_value cv) 1424 1529 { … … 1426 1531 mrb_value *argv; 1427 1532 mrb_int argc; 1428 1429 mrb_get_args(mrb, "*&", &argv, &argc, &blk); 1533 mrb_sym init; 1534 1535 mrb_get_args(mrb, "*!&", &argv, &argc, &blk); 1430 1536 obj = mrb_instance_alloc(mrb, cv); 1431 mrb_funcall_with_block(mrb, obj, mrb_intern_lit(mrb, "initialize"), argc, argv, blk); 1432 1537 init = mrb_intern_lit(mrb, "initialize"); 1538 if (!mrb_func_basic_p(mrb, obj, init, mrb_bob_init)) { 1539 mrb_funcall_with_block(mrb, obj, init, argc, argv, blk); 1540 } 1433 1541 return obj; 1434 1542 } … … 1474 1582 new_class = mrb_obj_value(mrb_class_new(mrb, mrb_class_ptr(super))); 1475 1583 mid = mrb_intern_lit(mrb, "initialize"); 1476 if (!mrb_func_basic_p(mrb, new_class, mid, mrb_bob_init)) { 1584 if (mrb_func_basic_p(mrb, new_class, mid, mrb_class_initialize)) { 1585 mrb_class_initialize(mrb, new_class); 1586 } 1587 else { 1477 1588 mrb_funcall_with_block(mrb, new_class, mid, n, &super, blk); 1478 1589 } … … 1559 1670 mrb_obj_respond_to(mrb_state *mrb, struct RClass* c, mrb_sym mid) 1560 1671 { 1561 khiter_t k; 1562 1563 while (c) { 1564 khash_t(mt) *h = c->mt; 1565 1566 if (h) { 1567 k = kh_get(mt, mrb, h, mid); 1568 if (k != kh_end(h)) { 1569 if (kh_value(h, k)) { 1570 return TRUE; /* method exists */ 1571 } 1572 else { 1573 return FALSE; /* undefined method */ 1574 } 1575 } 1576 } 1577 c = c->super; 1578 } 1579 return FALSE; /* no method */ 1672 mrb_method_t m; 1673 1674 m = mrb_method_search_vm(mrb, &c, mid); 1675 if (MRB_METHOD_UNDEF_P(m)) { 1676 return FALSE; 1677 } 1678 return TRUE; 1580 1679 } 1581 1680 … … 1590 1689 { 1591 1690 mrb_value path; 1592 const char *name; 1593 mrb_sym classpath = mrb_intern_lit(mrb, "__classpath__"); 1594 1595 path = mrb_obj_iv_get(mrb, (struct RObject*)c, classpath); 1691 mrb_sym nsym = mrb_intern_lit(mrb, "__classname__"); 1692 1693 path = mrb_obj_iv_get(mrb, (struct RObject*)c, nsym); 1596 1694 if (mrb_nil_p(path)) { 1597 struct RClass *outer = mrb_class_outer_module(mrb, c); 1598 mrb_sym sym = mrb_class_sym(mrb, c, outer); 1599 mrb_int len; 1600 1601 if (sym == 0) { 1602 return mrb_nil_value(); 1603 } 1604 else if (outer && outer != c && outer != mrb->object_class) { 1605 mrb_value base = mrb_class_path(mrb, outer); 1606 path = mrb_str_buf_new(mrb, 0); 1607 if (mrb_nil_p(base)) { 1608 mrb_str_cat_lit(mrb, path, "#<Class:"); 1609 mrb_str_concat(mrb, path, mrb_ptr_to_str(mrb, outer)); 1610 mrb_str_cat_lit(mrb, path, ">"); 1611 } 1612 else { 1613 mrb_str_concat(mrb, path, base); 1614 } 1615 mrb_str_cat_lit(mrb, path, "::"); 1616 name = mrb_sym2name_len(mrb, sym, &len); 1617 mrb_str_cat(mrb, path, name, len); 1618 } 1619 else { 1620 name = mrb_sym2name_len(mrb, sym, &len); 1621 path = mrb_str_new(mrb, name, len); 1622 } 1623 if (!MRB_FROZEN_P(c)) { 1624 mrb_obj_iv_set(mrb, (struct RObject*)c, classpath, path); 1625 } 1695 /* no name (yet) */ 1696 return mrb_class_find_path(mrb, c); 1697 } 1698 else if (mrb_symbol_p(path)) { 1699 /* toplevel class/module */ 1700 return mrb_sym_str(mrb, mrb_symbol(path)); 1626 1701 } 1627 1702 return mrb_str_dup(mrb, path); 1628 1703 } 1629 1704 1630 MRB_API struct RClass 1705 MRB_API struct RClass* 1631 1706 mrb_class_real(struct RClass* cl) 1632 1707 { 1633 if (cl == 0) 1634 return NULL; 1708 if (cl == 0) return NULL; 1635 1709 while ((cl->tt == MRB_TT_SCLASS) || (cl->tt == MRB_TT_ICLASS)) { 1636 1710 cl = cl->super; 1711 if (cl == 0) return NULL; 1637 1712 } 1638 1713 return cl; … … 1642 1717 mrb_class_name(mrb_state *mrb, struct RClass* c) 1643 1718 { 1644 mrb_value path = mrb_class_path(mrb, c); 1645 if (mrb_nil_p(path)) { 1646 path = mrb_str_new_lit(mrb, "#<Class:"); 1647 mrb_str_concat(mrb, path, mrb_ptr_to_str(mrb, c)); 1648 mrb_str_cat_lit(mrb, path, ">"); 1649 } 1650 return RSTRING_PTR(path); 1719 mrb_value name = class_name_str(mrb, c); 1720 return RSTRING_PTR(name); 1651 1721 } 1652 1722 … … 1667 1737 { 1668 1738 if (super->tt != MRB_TT_CLASS) { 1669 mrb_raisef(mrb, E_TYPE_ERROR, "superclass must be a Class (% S given)", mrb_obj_value(super));1739 mrb_raisef(mrb, E_TYPE_ERROR, "superclass must be a Class (%C given)", super); 1670 1740 } 1671 1741 if (super->tt == MRB_TT_SCLASS) { … … 1734 1804 mrb_alias_method(mrb_state *mrb, struct RClass *c, mrb_sym a, mrb_sym b) 1735 1805 { 1736 struct RProc *m = mrb_method_search(mrb, c, b); 1737 1806 mrb_method_t m = mrb_method_search(mrb, c, b); 1807 1808 if (!MRB_METHOD_CFUNC_P(m)) { 1809 struct RProc *p = MRB_METHOD_PROC(m); 1810 1811 if (MRB_PROC_ENV_P(p)) { 1812 MRB_PROC_ENV(p)->mid = b; 1813 } 1814 else { 1815 struct RClass *tc = MRB_PROC_TARGET_CLASS(p); 1816 struct REnv *e = (struct REnv*)mrb_obj_alloc(mrb, MRB_TT_ENV, NULL); 1817 1818 e->mid = b; 1819 if (tc) { 1820 e->c = tc; 1821 mrb_field_write_barrier(mrb, (struct RBasic*)e, (struct RBasic*)tc); 1822 } 1823 p->e.env = e; 1824 p->flags |= MRB_PROC_ENVSET; 1825 } 1826 } 1738 1827 mrb_define_method_raw(mrb, c, a, m); 1739 1828 } … … 1741 1830 /*! 1742 1831 * Defines an alias of a method. 1832 * \param mrb the mruby state 1743 1833 * \param klass the class which the original method belongs to 1744 1834 * \param name1 a new name for the method … … 1760 1850 */ 1761 1851 1762 staticmrb_value1852 mrb_value 1763 1853 mrb_mod_to_s(mrb_state *mrb, mrb_value klass) 1764 1854 { 1765 mrb_value str; 1766 1767 if (mrb_type(klass) == MRB_TT_SCLASS) { 1855 1856 if (mrb_sclass_p(klass)) { 1768 1857 mrb_value v = mrb_iv_get(mrb, klass, mrb_intern_lit(mrb, "__attached__")); 1769 1770 str = mrb_str_new_lit(mrb, "#<Class:"); 1858 mrb_value str = mrb_str_new_lit(mrb, "#<Class:"); 1771 1859 1772 1860 if (class_ptr_p(v)) { … … 1779 1867 } 1780 1868 else { 1781 struct RClass *c; 1782 mrb_value path; 1783 1784 str = mrb_str_buf_new(mrb, 32); 1785 c = mrb_class_ptr(klass); 1786 path = mrb_class_path(mrb, c); 1787 1788 if (mrb_nil_p(path)) { 1789 switch (mrb_type(klass)) { 1790 case MRB_TT_CLASS: 1791 mrb_str_cat_lit(mrb, str, "#<Class:"); 1792 break; 1793 1794 case MRB_TT_MODULE: 1795 mrb_str_cat_lit(mrb, str, "#<Module:"); 1796 break; 1797 1798 default: 1799 /* Shouldn't be happened? */ 1800 mrb_str_cat_lit(mrb, str, "#<??????:"); 1801 break; 1802 } 1803 mrb_str_concat(mrb, str, mrb_ptr_to_str(mrb, c)); 1804 return mrb_str_cat_lit(mrb, str, ">"); 1805 } 1806 else { 1807 return path; 1808 } 1869 return class_name_str(mrb, mrb_class_ptr(klass)); 1809 1870 } 1810 1871 } … … 1818 1879 mrb_get_args(mrb, "nn", &new_name, &old_name); 1819 1880 mrb_alias_method(mrb, c, new_name, old_name); 1820 return m rb_nil_value();1881 return mod; 1821 1882 } 1822 1883 … … 1824 1885 undef_method(mrb_state *mrb, struct RClass *c, mrb_sym a) 1825 1886 { 1887 mrb_method_t m; 1888 1889 MRB_METHOD_FROM_PROC(m, NULL); 1890 mrb_define_method_raw(mrb, c, a, m); 1891 } 1892 1893 void 1894 mrb_undef_method_id(mrb_state *mrb, struct RClass *c, mrb_sym a) 1895 { 1826 1896 if (!mrb_obj_respond_to(mrb, c, a)) { 1827 mrb_name_error(mrb, a, "undefined method '%S' for class '%S'", mrb_sym2str(mrb, a), mrb_obj_value(c)); 1828 } 1829 else { 1830 mrb_define_method_raw(mrb, c, a, NULL); 1831 } 1897 mrb_name_error(mrb, a, "undefined method '%n' for class '%C'", a, c); 1898 } 1899 undef_method(mrb, c, a); 1832 1900 } 1833 1901 … … 1853 1921 mrb_get_args(mrb, "*", &argv, &argc); 1854 1922 while (argc--) { 1855 undef_method(mrb, c, to_sym(mrb, *argv));1923 mrb_undef_method_id(mrb, c, to_sym(mrb, *argv)); 1856 1924 argv++; 1857 1925 } … … 1859 1927 } 1860 1928 1861 static mrb_value1862 mod_define_method(mrb_state *mrb, mrb_value self)1863 {1864 struct RClass *c = mrb_class_ptr(self);1865 struct RProc *p;1866 mrb_sym mid;1867 mrb_value proc = mrb_undef_value();1868 mrb_value blk;1869 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 }1882 if (mrb_nil_p(blk)) {1883 mrb_raise(mrb, E_ARGUMENT_ERROR, "no block given");1884 }1885 p = (struct RProc*)mrb_obj_alloc(mrb, MRB_TT_PROC, mrb->proc_class);1886 mrb_proc_copy(p, mrb_proc_ptr(blk));1887 p->flags |= MRB_PROC_STRICT;1888 mrb_define_method_raw(mrb, c, mid, p);1889 return mrb_symbol_value(mid);1890 }1891 1892 1929 static void 1893 check_cv_name_str(mrb_state *mrb, mrb_value str) 1894 { 1895 const char *s = RSTRING_PTR(str); 1896 mrb_int len = RSTRING_LEN(str); 1897 1898 if (len < 3 || !(s[0] == '@' && s[1] == '@')) { 1899 mrb_name_error(mrb, mrb_intern_str(mrb, str), "'%S' is not allowed as a class variable name", str); 1900 } 1901 } 1902 1903 static void 1904 check_cv_name_sym(mrb_state *mrb, mrb_sym id) 1905 { 1906 check_cv_name_str(mrb, mrb_sym2str(mrb, id)); 1907 } 1908 1909 /* 15.2.2.4.16 */ 1910 /* 1911 * call-seq: 1912 * obj.class_variable_defined?(symbol) -> true or false 1913 * 1914 * Returns <code>true</code> if the given class variable is defined 1915 * in <i>obj</i>. 1916 * 1917 * class Fred 1918 * @@foo = 99 1919 * end 1920 * Fred.class_variable_defined?(:@@foo) #=> true 1921 * Fred.class_variable_defined?(:@@bar) #=> false 1922 */ 1923 1924 static mrb_value 1925 mrb_mod_cvar_defined(mrb_state *mrb, mrb_value mod) 1930 check_const_name_sym(mrb_state *mrb, mrb_sym id) 1931 { 1932 mrb_int len; 1933 const char *name = mrb_sym_name_len(mrb, id, &len); 1934 if (!mrb_const_name_p(mrb, name, len)) { 1935 mrb_name_error(mrb, id, "wrong constant name %n", id); 1936 } 1937 } 1938 1939 static mrb_value 1940 mrb_mod_const_defined(mrb_state *mrb, mrb_value mod) 1926 1941 { 1927 1942 mrb_sym id; 1943 mrb_bool inherit = TRUE; 1944 1945 mrb_get_args(mrb, "n|b", &id, &inherit); 1946 check_const_name_sym(mrb, id); 1947 if (inherit) { 1948 return mrb_bool_value(mrb_const_defined(mrb, mod, id)); 1949 } 1950 return mrb_bool_value(mrb_const_defined_at(mrb, mod, id)); 1951 } 1952 1953 static mrb_value 1954 mrb_const_get_sym(mrb_state *mrb, mrb_value mod, mrb_sym id) 1955 { 1956 check_const_name_sym(mrb, id); 1957 return mrb_const_get(mrb, mod, id); 1958 } 1959 1960 static mrb_value 1961 mrb_mod_const_get(mrb_state *mrb, mrb_value mod) 1962 { 1963 mrb_value path; 1964 mrb_sym id; 1965 char *ptr; 1966 mrb_int off, end, len; 1967 1968 mrb_get_args(mrb, "o", &path); 1969 1970 if (mrb_symbol_p(path)) { 1971 /* const get with symbol */ 1972 id = mrb_symbol(path); 1973 return mrb_const_get_sym(mrb, mod, id); 1974 } 1975 1976 /* const get with class path string */ 1977 path = mrb_ensure_string_type(mrb, path); 1978 ptr = RSTRING_PTR(path); 1979 len = RSTRING_LEN(path); 1980 off = 0; 1981 1982 while (off < len) { 1983 end = mrb_str_index_lit(mrb, path, "::", off); 1984 end = (end == -1) ? len : end; 1985 id = mrb_intern(mrb, ptr+off, end-off); 1986 mod = mrb_const_get_sym(mrb, mod, id); 1987 if (end == len) 1988 off = end; 1989 else { 1990 off = end + 2; 1991 if (off == len) { /* trailing "::" */ 1992 mrb_name_error(mrb, id, "wrong constant name '%v'", path); 1993 } 1994 } 1995 } 1996 1997 return mod; 1998 } 1999 2000 static mrb_value 2001 mrb_mod_const_set(mrb_state *mrb, mrb_value mod) 2002 { 2003 mrb_sym id; 2004 mrb_value value; 2005 2006 mrb_get_args(mrb, "no", &id, &value); 2007 check_const_name_sym(mrb, id); 2008 mrb_const_set(mrb, mod, id, value); 2009 return value; 2010 } 2011 2012 static mrb_value 2013 mrb_mod_remove_const(mrb_state *mrb, mrb_value mod) 2014 { 2015 mrb_sym id; 2016 mrb_value val; 1928 2017 1929 2018 mrb_get_args(mrb, "n", &id); 1930 check_cv_name_sym(mrb, id); 1931 return mrb_bool_value(mrb_cv_defined(mrb, mod, id)); 1932 } 1933 1934 /* 15.2.2.4.17 */ 1935 /* 1936 * call-seq: 1937 * mod.class_variable_get(symbol) -> obj 1938 * 1939 * Returns the value of the given class variable (or throws a 1940 * <code>NameError</code> exception). The <code>@@</code> part of the 1941 * variable name should be included for regular class variables 1942 * 1943 * class Fred 1944 * @@foo = 99 1945 * end 1946 * Fred.class_variable_get(:@@foo) #=> 99 1947 */ 1948 1949 static mrb_value 1950 mrb_mod_cvar_get(mrb_state *mrb, mrb_value mod) 1951 { 1952 mrb_sym id; 1953 1954 mrb_get_args(mrb, "n", &id); 1955 check_cv_name_sym(mrb, id); 1956 return mrb_cv_get(mrb, mod, id); 1957 } 1958 1959 /* 15.2.2.4.18 */ 1960 /* 1961 * call-seq: 1962 * obj.class_variable_set(symbol, obj) -> obj 1963 * 1964 * Sets the class variable names by <i>symbol</i> to 1965 * <i>object</i>. 1966 * 1967 * class Fred 1968 * @@foo = 99 1969 * def foo 1970 * @@foo 1971 * end 1972 * end 1973 * Fred.class_variable_set(:@@foo, 101) #=> 101 1974 * Fred.new.foo #=> 101 1975 */ 1976 1977 static mrb_value 1978 mrb_mod_cvar_set(mrb_state *mrb, mrb_value mod) 1979 { 1980 mrb_value value; 1981 mrb_sym id; 1982 1983 mrb_get_args(mrb, "no", &id, &value); 1984 check_cv_name_sym(mrb, id); 1985 mrb_cv_set(mrb, mod, id, value); 1986 return value; 1987 } 1988 1989 /* 15.2.2.4.39 */ 1990 /* 1991 * call-seq: 1992 * remove_class_variable(sym) -> obj 1993 * 1994 * Removes the definition of the <i>sym</i>, returning that 1995 * constant's value. 1996 * 1997 * class Dummy 1998 * @@var = 99 1999 * puts @@var 2000 * p class_variables 2001 * remove_class_variable(:@@var) 2002 * p class_variables 2003 * end 2004 * 2005 * <em>produces:</em> 2006 * 2007 * 99 2008 * [:@@var] 2009 * [] 2010 */ 2011 2012 static mrb_value 2013 mrb_mod_remove_cvar(mrb_state *mrb, mrb_value mod) 2014 { 2015 mrb_value val; 2016 mrb_sym id; 2017 2018 mrb_get_args(mrb, "n", &id); 2019 check_cv_name_sym(mrb, id); 2020 2019 check_const_name_sym(mrb, id); 2021 2020 val = mrb_iv_remove(mrb, mod, id); 2022 if (!mrb_undef_p(val)) return val; 2023 2024 if (mrb_cv_defined(mrb, mod, id)) { 2025 mrb_name_error(mrb, id, "cannot remove %S for %S", 2026 mrb_sym2str(mrb, id), mod); 2027 } 2028 2029 mrb_name_error(mrb, id, "class variable %S not defined for %S", 2030 mrb_sym2str(mrb, id), mod); 2031 2032 /* not reached */ 2033 return mrb_nil_value(); 2021 if (mrb_undef_p(val)) { 2022 mrb_name_error(mrb, id, "constant %n not defined", id); 2023 } 2024 return val; 2025 } 2026 2027 static mrb_value 2028 mrb_mod_const_missing(mrb_state *mrb, mrb_value mod) 2029 { 2030 mrb_sym sym; 2031 2032 mrb_get_args(mrb, "n", &sym); 2033 2034 if (mrb_class_real(mrb_class_ptr(mod)) != mrb->object_class) { 2035 mrb_name_error(mrb, sym, "uninitialized constant %v::%n", mod, sym); 2036 } 2037 else { 2038 mrb_name_error(mrb, sym, "uninitialized constant %n", sym); 2039 } 2040 /* not reached */ 2041 return mrb_nil_value(); 2034 2042 } 2035 2043 … … 2070 2078 } 2071 2079 2072 static void 2073 remove_method(mrb_state *mrb, mrb_value mod, mrb_sym mid) 2074 { 2075 struct RClass *c = mrb_class_ptr(mod); 2076 khash_t(mt) *h = find_origin(c)->mt; 2077 khiter_t k; 2078 2079 if (h) { 2080 k = kh_get(mt, mrb, h, mid); 2081 if (k != kh_end(h)) { 2082 kh_del(mt, mrb, h, k); 2083 mrb_funcall(mrb, mod, "method_removed", 1, mrb_symbol_value(mid)); 2084 return; 2085 } 2086 } 2087 2088 mrb_name_error(mrb, mid, "method '%S' not defined in %S", 2089 mrb_sym2str(mrb, mid), mod); 2090 } 2091 2092 /* 15.2.2.4.41 */ 2093 /* 2094 * call-seq: 2095 * remove_method(symbol) -> self 2096 * 2097 * Removes the method identified by _symbol_ from the current 2098 * class. For an example, see <code>Module.undef_method</code>. 2099 */ 2100 2101 static mrb_value 2102 mrb_mod_remove_method(mrb_state *mrb, mrb_value mod) 2103 { 2104 mrb_int argc; 2105 mrb_value *argv; 2106 2107 mrb_get_args(mrb, "*", &argv, &argc); 2108 while (argc--) { 2109 remove_method(mrb, mod, to_sym(mrb, *argv)); 2110 argv++; 2111 } 2112 return mod; 2113 } 2114 2115 2116 2117 static void 2118 check_const_name_str(mrb_state *mrb, mrb_value str) 2119 { 2120 if (RSTRING_LEN(str) < 1 || !ISUPPER(*RSTRING_PTR(str))) { 2121 mrb_name_error(mrb, mrb_intern_str(mrb, str), "wrong constant name %S", str); 2122 } 2123 } 2124 2125 static void 2126 check_const_name_sym(mrb_state *mrb, mrb_sym id) 2127 { 2128 check_const_name_str(mrb, mrb_sym2str(mrb, id)); 2129 } 2130 2131 static mrb_value 2132 const_defined(mrb_state *mrb, mrb_value mod, mrb_sym id, mrb_bool inherit) 2133 { 2134 if (inherit) { 2135 return mrb_bool_value(mrb_const_defined(mrb, mod, id)); 2136 } 2137 return mrb_bool_value(mrb_const_defined_at(mrb, mod, id)); 2138 } 2139 2140 static mrb_value 2141 mrb_mod_const_defined(mrb_state *mrb, mrb_value mod) 2142 { 2143 mrb_sym id; 2144 mrb_bool inherit = TRUE; 2145 2146 mrb_get_args(mrb, "n|b", &id, &inherit); 2147 check_const_name_sym(mrb, id); 2148 return const_defined(mrb, mod, id, inherit); 2149 } 2150 2151 static mrb_value 2152 mrb_mod_const_get(mrb_state *mrb, mrb_value mod) 2153 { 2154 mrb_sym id; 2155 2156 mrb_get_args(mrb, "n", &id); 2157 check_const_name_sym(mrb, id); 2158 return mrb_const_get(mrb, mod, id); 2159 } 2160 2161 static mrb_value 2162 mrb_mod_const_set(mrb_state *mrb, mrb_value mod) 2163 { 2164 mrb_sym id; 2165 mrb_value value; 2166 2167 mrb_get_args(mrb, "no", &id, &value); 2168 check_const_name_sym(mrb, id); 2169 mrb_const_set(mrb, mod, id, value); 2170 return value; 2171 } 2172 2173 static mrb_value 2174 mrb_mod_remove_const(mrb_state *mrb, mrb_value mod) 2175 { 2176 mrb_sym id; 2177 mrb_value val; 2178 2179 mrb_get_args(mrb, "n", &id); 2180 check_const_name_sym(mrb, id); 2181 val = mrb_iv_remove(mrb, mod, id); 2182 if (mrb_undef_p(val)) { 2183 mrb_name_error(mrb, id, "constant %S not defined", mrb_sym2str(mrb, id)); 2184 } 2185 return val; 2186 } 2187 2188 static mrb_value 2189 mrb_mod_const_missing(mrb_state *mrb, mrb_value mod) 2190 { 2191 mrb_sym sym; 2192 2193 mrb_get_args(mrb, "n", &sym); 2194 2195 if (mrb_class_real(mrb_class_ptr(mod)) != mrb->object_class) { 2196 mrb_name_error(mrb, sym, "uninitialized constant %S::%S", 2197 mod, 2198 mrb_sym2str(mrb, sym)); 2199 } 2200 else { 2201 mrb_name_error(mrb, sym, "uninitialized constant %S", 2202 mrb_sym2str(mrb, sym)); 2203 } 2204 /* not reached */ 2205 return mrb_nil_value(); 2206 } 2207 2208 static mrb_value 2209 mrb_mod_s_constants(mrb_state *mrb, mrb_value mod) 2210 { 2211 mrb_raise(mrb, E_NOTIMP_ERROR, "Module.constants not implemented"); 2212 return mrb_nil_value(); /* not reached */ 2080 static mrb_value 2081 mod_define_method(mrb_state *mrb, mrb_value self) 2082 { 2083 struct RClass *c = mrb_class_ptr(self); 2084 struct RProc *p; 2085 mrb_method_t m; 2086 mrb_sym mid; 2087 mrb_value proc = mrb_undef_value(); 2088 mrb_value blk; 2089 2090 mrb_get_args(mrb, "n|o&", &mid, &proc, &blk); 2091 switch (mrb_type(proc)) { 2092 case MRB_TT_PROC: 2093 blk = proc; 2094 break; 2095 case MRB_TT_UNDEF: 2096 /* ignored */ 2097 break; 2098 default: 2099 mrb_raisef(mrb, E_TYPE_ERROR, "wrong argument type %T (expected Proc)", proc); 2100 break; 2101 } 2102 if (mrb_nil_p(blk)) { 2103 mrb_raise(mrb, E_ARGUMENT_ERROR, "no block given"); 2104 } 2105 p = (struct RProc*)mrb_obj_alloc(mrb, MRB_TT_PROC, mrb->proc_class); 2106 mrb_proc_copy(p, mrb_proc_ptr(blk)); 2107 p->flags |= MRB_PROC_STRICT; 2108 MRB_METHOD_FROM_PROC(m, p); 2109 mrb_define_method_raw(mrb, c, mid, m); 2110 return mrb_symbol_value(mid); 2111 } 2112 2113 static mrb_value 2114 top_define_method(mrb_state *mrb, mrb_value self) 2115 { 2116 return mod_define_method(mrb, mrb_obj_value(mrb->object_class)); 2213 2117 } 2214 2118 … … 2225 2129 } 2226 2130 2227 MRB_API mrb_value 2131 static mrb_value 2132 mrb_mod_dup(mrb_state *mrb, mrb_value self) 2133 { 2134 mrb_value mod = mrb_obj_clone(mrb, self); 2135 MRB_UNSET_FROZEN_FLAG(mrb_obj_ptr(mod)); 2136 return mod; 2137 } 2138 2139 static mrb_value 2228 2140 mrb_mod_module_function(mrb_state *mrb, mrb_value mod) 2229 2141 { … … 2231 2143 mrb_int argc, i; 2232 2144 mrb_sym mid; 2233 struct RProc *method_rproc;2145 mrb_method_t m; 2234 2146 struct RClass *rclass; 2235 2147 int ai; … … 2251 2163 mid = mrb_symbol(argv[i]); 2252 2164 rclass = mrb_class_ptr(mod); 2253 m ethod_rproc= mrb_method_search(mrb, rclass, mid);2165 m = mrb_method_search(mrb, rclass, mid); 2254 2166 2255 2167 prepare_singleton_class(mrb, (struct RBasic*)rclass); 2256 2168 ai = mrb_gc_arena_save(mrb); 2257 mrb_define_method_raw(mrb, rclass->c, mid, m ethod_rproc);2169 mrb_define_method_raw(mrb, rclass->c, mid, m); 2258 2170 mrb_gc_arena_restore(mrb, ai); 2259 2171 } … … 2266 2178 /* implementation of instance_eval */ 2267 2179 mrb_value mrb_obj_instance_eval(mrb_state*, mrb_value); 2180 2181 static mrb_value 2182 inspect_main(mrb_state *mrb, mrb_value mod) 2183 { 2184 return mrb_str_new_lit(mrb, "main"); 2185 } 2186 2187 static const mrb_code new_iseq[] = { 2188 OP_ENTER, 0x0, 0x10, 0x1, /* OP_ENTER 0:0:1:0:0:0:1 */ 2189 OP_LOADSELF, 0x3, /* OP_LOADSELF R3 */ 2190 OP_SEND, 0x3, 0x0, 0x0, /* OP_SEND R3 :allocate 0 */ 2191 OP_MOVE, 0x0, 0x3, /* OP_MOVE R0 R3 */ 2192 OP_MOVE, 0x4, 0x1, /* OP_MOVE R4 R1 */ 2193 OP_MOVE, 0x5, 0x2, /* OP_MOVE R5 R2 */ 2194 OP_SENDVB, 0x3, 0x1, /* OP_SENDVB R4 :initialize */ 2195 OP_RETURN, 0x0 /* OP_RETURN R0 */ 2196 }; 2197 2198 static void 2199 init_class_new(mrb_state *mrb, struct RClass *cls) 2200 { 2201 struct RProc *p; 2202 mrb_method_t m; 2203 mrb_irep *new_irep = (mrb_irep*)mrb_malloc(mrb, sizeof(mrb_irep)); 2204 static const mrb_irep mrb_irep_zero = { 0 }; 2205 2206 *new_irep = mrb_irep_zero; 2207 new_irep->syms = (mrb_sym*)mrb_malloc(mrb, sizeof(mrb_sym)*2); 2208 new_irep->syms[0] = mrb_intern_lit(mrb, "allocate"); 2209 new_irep->syms[1] = mrb_intern_lit(mrb, "initialize"); 2210 new_irep->slen = 2; 2211 new_irep->flags = MRB_ISEQ_NO_FREE; 2212 new_irep->iseq = new_iseq; 2213 new_irep->ilen = sizeof(new_iseq); 2214 new_irep->nregs = 6; 2215 new_irep->nlocals = 3; 2216 p = mrb_proc_new(mrb, new_irep); 2217 MRB_METHOD_FROM_PROC(m, p); 2218 mrb_define_method_raw(mrb, cls, mrb_intern_lit(mrb, "new"), m); 2219 } 2268 2220 2269 2221 void … … 2289 2241 /* name basic classes */ 2290 2242 mrb_define_const(mrb, bob, "BasicObject", mrb_obj_value(bob)); 2291 mrb_define_const(mrb, obj, "BasicObject", mrb_obj_value(bob));2292 2243 mrb_define_const(mrb, obj, "Object", mrb_obj_value(obj)); 2293 2244 mrb_define_const(mrb, obj, "Module", mrb_obj_value(mod)); … … 2295 2246 2296 2247 /* name each classes */ 2297 name_class(mrb, bob, mrb_intern_lit(mrb, "BasicObject"));2298 name_class(mrb, obj, mrb_intern_lit(mrb, "Object"));/* 15.2.1 */2299 name_class(mrb, mod, mrb_intern_lit(mrb, "Module"));/* 15.2.2 */2300 name_class(mrb, cls, mrb_intern_lit(mrb, "Class"));/* 15.2.3 */2248 mrb_class_name_class(mrb, NULL, bob, mrb_intern_lit(mrb, "BasicObject")); 2249 mrb_class_name_class(mrb, NULL, obj, mrb_intern_lit(mrb, "Object")); /* 15.2.1 */ 2250 mrb_class_name_class(mrb, NULL, mod, mrb_intern_lit(mrb, "Module")); /* 15.2.2 */ 2251 mrb_class_name_class(mrb, NULL, cls, mrb_intern_lit(mrb, "Class")); /* 15.2.3 */ 2301 2252 2302 2253 mrb->proc_class = mrb_define_class(mrb, "Proc", mrb->object_class); /* 15.2.17 */ … … 2308 2259 mrb_define_method(mrb, bob, "==", mrb_obj_equal_m, MRB_ARGS_REQ(1)); /* 15.3.1.3.1 */ 2309 2260 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 */ 2313 2314 mrb_define_class_method(mrb, cls, "new", mrb_class_new_class, MRB_ARGS_OPT(1)); 2261 mrb_define_method(mrb, bob, "__id__", mrb_obj_id_m, MRB_ARGS_NONE()); /* 15.3.1.3.4 */ 2262 mrb_define_method(mrb, bob, "__send__", mrb_f_send, MRB_ARGS_REQ(1)|MRB_ARGS_REST()|MRB_ARGS_BLOCK()); /* 15.3.1.3.5 */ 2263 mrb_define_method(mrb, bob, "equal?", mrb_obj_equal_m, MRB_ARGS_REQ(1)); /* 15.3.1.3.11 */ 2264 mrb_define_method(mrb, bob, "instance_eval", mrb_obj_instance_eval, MRB_ARGS_OPT(1)|MRB_ARGS_BLOCK()); /* 15.3.1.3.18 */ 2265 2266 mrb_define_class_method(mrb, cls, "new", mrb_class_new_class, MRB_ARGS_OPT(1)|MRB_ARGS_BLOCK()); 2267 mrb_define_method(mrb, cls, "allocate", mrb_instance_alloc, MRB_ARGS_NONE()); 2315 2268 mrb_define_method(mrb, cls, "superclass", mrb_class_superclass, MRB_ARGS_NONE()); /* 15.2.3.3.4 */ 2316 mrb_define_method(mrb, cls, "new", mrb_instance_new, MRB_ARGS_ANY()); /* 15.2.3.3.3 */2317 2269 mrb_define_method(mrb, cls, "initialize", mrb_class_initialize, MRB_ARGS_OPT(1)); /* 15.2.3.3.1 */ 2318 2270 mrb_define_method(mrb, cls, "inherited", mrb_bob_init, MRB_ARGS_REQ(1)); 2319 2271 2272 init_class_new(mrb, cls); 2273 2320 2274 MRB_SET_INSTANCE_TT(mod, MRB_TT_MODULE); 2321 mrb_define_method(mrb, mod, "class_variable_defined?", mrb_mod_cvar_defined, MRB_ARGS_REQ(1)); /* 15.2.2.4.16 */2322 mrb_define_method(mrb, mod, "class_variable_get", mrb_mod_cvar_get, MRB_ARGS_REQ(1)); /* 15.2.2.4.17 */2323 mrb_define_method(mrb, mod, "class_variable_set", mrb_mod_cvar_set, MRB_ARGS_REQ(2)); /* 15.2.2.4.18 */2324 2275 mrb_define_method(mrb, mod, "extend_object", mrb_mod_extend_object, MRB_ARGS_REQ(1)); /* 15.2.2.4.25 */ 2325 2276 mrb_define_method(mrb, mod, "extended", mrb_bob_init, MRB_ARGS_REQ(1)); /* 15.2.2.4.26 */ … … 2330 2281 mrb_define_method(mrb, mod, "class_eval", mrb_mod_module_eval, MRB_ARGS_ANY()); /* 15.2.2.4.15 */ 2331 2282 mrb_define_method(mrb, mod, "included", mrb_bob_init, MRB_ARGS_REQ(1)); /* 15.2.2.4.29 */ 2332 mrb_define_method(mrb, mod, "included_modules", mrb_mod_included_modules, MRB_ARGS_NONE()); /* 15.2.2.4.30 */2333 2283 mrb_define_method(mrb, mod, "initialize", mrb_mod_initialize, MRB_ARGS_NONE()); /* 15.2.2.4.31 */ 2334 mrb_define_method(mrb, mod, "instance_methods", mrb_mod_instance_methods, MRB_ARGS_ANY()); /* 15.2.2.4.33 */2335 mrb_define_method(mrb, mod, "method_defined?", mrb_mod_method_defined, MRB_ARGS_REQ(1)); /* 15.2.2.4.34 */2336 2284 mrb_define_method(mrb, mod, "module_eval", mrb_mod_module_eval, MRB_ARGS_ANY()); /* 15.2.2.4.35 */ 2337 2285 mrb_define_method(mrb, mod, "module_function", mrb_mod_module_function, MRB_ARGS_ANY()); … … 2339 2287 mrb_define_method(mrb, mod, "protected", mrb_mod_dummy_visibility, MRB_ARGS_ANY()); /* 15.2.2.4.37 */ 2340 2288 mrb_define_method(mrb, mod, "public", mrb_mod_dummy_visibility, MRB_ARGS_ANY()); /* 15.2.2.4.38 */ 2341 mrb_define_method(mrb, mod, "remove_class_variable", mrb_mod_remove_cvar, MRB_ARGS_REQ(1)); /* 15.2.2.4.39 */2342 mrb_define_method(mrb, mod, "remove_method", mrb_mod_remove_method, MRB_ARGS_ANY()); /* 15.2.2.4.41 */2343 mrb_define_method(mrb, mod, "method_removed", mrb_bob_init, MRB_ARGS_REQ(1));2344 2289 mrb_define_method(mrb, mod, "attr_reader", mrb_mod_attr_reader, MRB_ARGS_ANY()); /* 15.2.2.4.13 */ 2345 2290 mrb_define_method(mrb, mod, "attr_writer", mrb_mod_attr_writer, MRB_ARGS_ANY()); /* 15.2.2.4.14 */ … … 2352 2297 mrb_define_method(mrb, mod, "const_get", mrb_mod_const_get, MRB_ARGS_REQ(1)); /* 15.2.2.4.21 */ 2353 2298 mrb_define_method(mrb, mod, "const_set", mrb_mod_const_set, MRB_ARGS_REQ(2)); /* 15.2.2.4.23 */ 2354 mrb_define_method(mrb, mod, "constants", mrb_mod_constants, MRB_ARGS_OPT(1)); /* 15.2.2.4.24 */2355 2299 mrb_define_method(mrb, mod, "remove_const", mrb_mod_remove_const, MRB_ARGS_REQ(1)); /* 15.2.2.4.40 */ 2356 2300 mrb_define_method(mrb, mod, "const_missing", mrb_mod_const_missing, MRB_ARGS_REQ(1)); 2301 mrb_define_method(mrb, mod, "method_defined?", mrb_mod_method_defined, MRB_ARGS_REQ(1)); /* 15.2.2.4.34 */ 2357 2302 mrb_define_method(mrb, mod, "define_method", mod_define_method, MRB_ARGS_ARG(1,1)); 2358 mrb_define_method(mrb, mod, "class_variables", mrb_mod_class_variables, MRB_ARGS_NONE()); /* 15.2.2.4.19 */ 2359 mrb_define_method(mrb, mod, "===", mrb_mod_eqq, MRB_ARGS_REQ(1)); 2360 mrb_define_class_method(mrb, mod, "constants", mrb_mod_s_constants, MRB_ARGS_ANY()); /* 15.2.2.3.1 */ 2303 mrb_define_method(mrb, mod, "===", mrb_mod_eqq, MRB_ARGS_REQ(1)); /* 15.2.2.4.7 */ 2304 mrb_define_method(mrb, mod, "dup", mrb_mod_dup, MRB_ARGS_NONE()); 2361 2305 2362 2306 mrb_undef_method(mrb, cls, "append_features"); 2307 mrb_undef_method(mrb, cls, "prepend_features"); 2363 2308 mrb_undef_method(mrb, cls, "extend_object"); 2364 } 2309 mrb_undef_method(mrb, cls, "module_function"); 2310 2311 mrb->top_self = (struct RObject*)mrb_obj_alloc(mrb, MRB_TT_OBJECT, mrb->object_class); 2312 mrb_define_singleton_method(mrb, mrb->top_self, "inspect", inspect_main, MRB_ARGS_NONE()); 2313 mrb_define_singleton_method(mrb, mrb->top_self, "to_s", inspect_main, MRB_ARGS_NONE()); 2314 mrb_define_singleton_method(mrb, mrb->top_self, "define_method", top_define_method, MRB_ARGS_ARG(1,1)); 2315 } -
EcnlProtoTool/trunk/mruby-2.1.1/src/codedump.c
r331 r439 7 7 8 8 #ifndef MRB_DISABLE_STDIO 9 static int10 print_r(mrb_state *mrb, mrb_irep *irep, size_t n , int pre)9 static void 10 print_r(mrb_state *mrb, mrb_irep *irep, size_t n) 11 11 { 12 12 size_t i; 13 13 14 if (n == 0) return 0;14 if (n == 0) return; 15 15 16 16 for (i=0; i+1<irep->nlocals; i++) { 17 17 if (irep->lv[i].r == n) { 18 18 mrb_sym sym = irep->lv[i].name; 19 if (pre) printf(" "); 20 printf("R%d:%s", (int)n, mrb_sym2name(mrb, sym)); 21 return 1; 19 printf(" R%d:%s", (int)n, mrb_sym_dump(mrb, sym)); 20 break; 22 21 } 23 22 } 24 return 0; 25 } 26 27 #define RA 1 28 #define RB 2 29 #define RAB 3 23 } 30 24 31 25 static void 32 print_lv(mrb_state *mrb, mrb_irep *irep, mrb_code c, int r) 33 { 34 int pre = 0; 35 36 if (!irep->lv 37 || ((!(r & RA) || GETARG_A(c) >= irep->nlocals) 38 && (!(r & RB) || GETARG_B(c) >= irep->nlocals))) { 26 print_lv_a(mrb_state *mrb, mrb_irep *irep, uint16_t a) 27 { 28 if (!irep->lv || a >= irep->nlocals || a == 0) { 39 29 printf("\n"); 40 30 return; 41 31 } 42 printf("\t; "); 43 if (r & RA) { 44 pre = print_r(mrb, irep, GETARG_A(c), 0); 45 } 46 if (r & RB) { 47 print_r(mrb, irep, GETARG_B(c), pre); 48 } 32 printf("\t;"); 33 print_r(mrb, irep, a); 49 34 printf("\n"); 50 35 } 51 #endif 36 37 static void 38 print_lv_ab(mrb_state *mrb, mrb_irep *irep, uint16_t a, uint16_t b) 39 { 40 if (!irep->lv || (a >= irep->nlocals && b >= irep->nlocals) || a+b == 0) { 41 printf("\n"); 42 return; 43 } 44 printf("\t;"); 45 if (a > 0) print_r(mrb, irep, a); 46 if (b > 0) print_r(mrb, irep, b); 47 printf("\n"); 48 } 49 50 static void 51 print_header(mrb_state *mrb, mrb_irep *irep, ptrdiff_t i) 52 { 53 int32_t line; 54 55 line = mrb_debug_get_line(mrb, irep, i); 56 if (line < 0) { 57 printf(" "); 58 } 59 else { 60 printf("%5d ", line); 61 } 62 63 printf("%03d ", (int)i); 64 } 65 66 #define CASE(insn,ops) case insn: FETCH_ ## ops (); L_ ## insn 52 67 53 68 static void 54 69 codedump(mrb_state *mrb, mrb_irep *irep) 55 70 { 56 #ifndef MRB_DISABLE_STDIO57 int i;58 71 int ai; 59 mrb_code c; 72 const mrb_code *pc, *pcend; 73 mrb_code ins; 60 74 const char *file = NULL, *next_file; 61 int32_t line;62 75 63 76 if (!irep) return; 64 printf("irep %p nregs=%d nlocals=%d pools=%d syms=%d reps=%d\n", (void*)irep, 65 irep->nregs, irep->nlocals, (int)irep->plen, (int)irep->slen, (int)irep->rlen); 66 67 for (i = 0; i < (int)irep->ilen; i++) { 77 printf("irep %p nregs=%d nlocals=%d pools=%d syms=%d reps=%d iseq=%d\n", (void*)irep, 78 irep->nregs, irep->nlocals, (int)irep->plen, (int)irep->slen, (int)irep->rlen, (int)irep->ilen); 79 80 if (irep->lv) { 81 int i; 82 83 printf("local variable names:\n"); 84 for (i = 1; i < irep->nlocals; ++i) { 85 char const *s = mrb_sym_dump(mrb, irep->lv[i - 1].name); 86 int n = irep->lv[i - 1].r ? irep->lv[i - 1].r : i; 87 printf(" R%d:%s\n", n, s ? s : ""); 88 } 89 } 90 91 pc = irep->iseq; 92 pcend = pc + irep->ilen; 93 while (pc < pcend) { 94 ptrdiff_t i; 95 uint32_t a; 96 uint16_t b; 97 uint8_t c; 98 68 99 ai = mrb_gc_arena_save(mrb); 69 100 70 next_file = mrb_debug_get_filename(irep, i); 101 i = pc - irep->iseq; 102 next_file = mrb_debug_get_filename(mrb, irep, i); 71 103 if (next_file && file != next_file) { 72 104 printf("file: %s\n", next_file); 73 105 file = next_file; 74 106 } 75 line = mrb_debug_get_line(irep, i); 76 if (line < 0) { 77 printf(" "); 78 } 79 else { 80 printf("%5d ", line); 81 } 82 83 printf("%03d ", i); 84 c = irep->iseq[i]; 85 switch (GET_OPCODE(c)) { 86 case OP_NOP: 107 print_header(mrb, irep, i); 108 ins = READ_B(); 109 switch (ins) { 110 CASE(OP_NOP, Z): 87 111 printf("OP_NOP\n"); 88 112 break; 89 case OP_MOVE:90 printf("OP_MOVE\tR%d\tR%d\t", GETARG_A(c), GETARG_B(c));91 print_lv (mrb, irep, c, RAB);92 break; 93 case OP_LOADL:113 CASE(OP_MOVE, BB): 114 printf("OP_MOVE\tR%d\tR%d\t", a, b); 115 print_lv_ab(mrb, irep, a, b); 116 break; 117 CASE(OP_LOADL, BB): 94 118 { 95 mrb_value v = irep->pool[ GETARG_Bx(c)];119 mrb_value v = irep->pool[b]; 96 120 mrb_value s = mrb_inspect(mrb, v); 97 printf("OP_LOADL\tR%d\tL(%d)\t; %s", GETARG_A(c), GETARG_Bx(c), RSTRING_PTR(s));121 printf("OP_LOADL\tR%d\tL(%d)\t; %s", a, b, RSTRING_PTR(s)); 98 122 } 99 print_lv(mrb, irep, c, RA); 100 break; 101 case OP_LOADI: 102 printf("OP_LOADI\tR%d\t%d\t", GETARG_A(c), GETARG_sBx(c)); 103 print_lv(mrb, irep, c, RA); 104 break; 105 case OP_LOADSYM: 106 printf("OP_LOADSYM\tR%d\t:%s", GETARG_A(c), 107 mrb_sym2name(mrb, irep->syms[GETARG_Bx(c)])); 108 print_lv(mrb, irep, c, RA); 109 break; 110 case OP_LOADNIL: 111 printf("OP_LOADNIL\tR%d\t\t", GETARG_A(c)); 112 print_lv(mrb, irep, c, RA); 113 break; 114 case OP_LOADSELF: 115 printf("OP_LOADSELF\tR%d\t\t", GETARG_A(c)); 116 print_lv(mrb, irep, c, RA); 117 break; 118 case OP_LOADT: 119 printf("OP_LOADT\tR%d\t\t", GETARG_A(c)); 120 print_lv(mrb, irep, c, RA); 121 break; 122 case OP_LOADF: 123 printf("OP_LOADF\tR%d\t\t", GETARG_A(c)); 124 print_lv(mrb, irep, c, RA); 125 break; 126 case OP_GETGLOBAL: 127 printf("OP_GETGLOBAL\tR%d\t:%s", GETARG_A(c), 128 mrb_sym2name(mrb, irep->syms[GETARG_Bx(c)])); 129 print_lv(mrb, irep, c, RA); 130 break; 131 case OP_SETGLOBAL: 132 printf("OP_SETGLOBAL\t:%s\tR%d\t", 133 mrb_sym2name(mrb, irep->syms[GETARG_Bx(c)]), 134 GETARG_A(c)); 135 print_lv(mrb, irep, c, RA); 136 break; 137 case OP_GETCONST: 138 printf("OP_GETCONST\tR%d\t:%s", GETARG_A(c), 139 mrb_sym2name(mrb, irep->syms[GETARG_Bx(c)])); 140 print_lv(mrb, irep, c, RA); 141 break; 142 case OP_SETCONST: 143 printf("OP_SETCONST\t:%s\tR%d\t", 144 mrb_sym2name(mrb, irep->syms[GETARG_Bx(c)]), 145 GETARG_A(c)); 146 print_lv(mrb, irep, c, RA); 147 break; 148 case OP_GETMCNST: 149 printf("OP_GETMCNST\tR%d\tR%d::%s", GETARG_A(c), GETARG_A(c), 150 mrb_sym2name(mrb, irep->syms[GETARG_Bx(c)])); 151 print_lv(mrb, irep, c, RAB); 152 break; 153 case OP_SETMCNST: 154 printf("OP_SETMCNST\tR%d::%s\tR%d", GETARG_A(c)+1, 155 mrb_sym2name(mrb, irep->syms[GETARG_Bx(c)]), 156 GETARG_A(c)); 157 print_lv(mrb, irep, c, RA); 158 break; 159 case OP_GETIV: 160 printf("OP_GETIV\tR%d\t%s", GETARG_A(c), 161 mrb_sym2name(mrb, irep->syms[GETARG_Bx(c)])); 162 print_lv(mrb, irep, c, RA); 163 break; 164 case OP_SETIV: 165 printf("OP_SETIV\t%s\tR%d", 166 mrb_sym2name(mrb, irep->syms[GETARG_Bx(c)]), 167 GETARG_A(c)); 168 print_lv(mrb, irep, c, RA); 169 break; 170 case OP_GETUPVAR: 171 printf("OP_GETUPVAR\tR%d\t%d\t%d", 172 GETARG_A(c), GETARG_B(c), GETARG_C(c)); 173 print_lv(mrb, irep, c, RA); 174 break; 175 case OP_SETUPVAR: 176 printf("OP_SETUPVAR\tR%d\t%d\t%d", 177 GETARG_A(c), GETARG_B(c), GETARG_C(c)); 178 print_lv(mrb, irep, c, RA); 179 break; 180 case OP_GETCV: 181 printf("OP_GETCV\tR%d\t%s", GETARG_A(c), 182 mrb_sym2name(mrb, irep->syms[GETARG_Bx(c)])); 183 print_lv(mrb, irep, c, RA); 184 break; 185 case OP_SETCV: 186 printf("OP_SETCV\t%s\tR%d", 187 mrb_sym2name(mrb, irep->syms[GETARG_Bx(c)]), 188 GETARG_A(c)); 189 print_lv(mrb, irep, c, RA); 190 break; 191 case OP_JMP: 192 printf("OP_JMP\t%03d\n", i+GETARG_sBx(c)); 193 break; 194 case OP_JMPIF: 195 printf("OP_JMPIF\tR%d\t%03d\n", GETARG_A(c), i+GETARG_sBx(c)); 196 break; 197 case OP_JMPNOT: 198 printf("OP_JMPNOT\tR%d\t%03d\n", GETARG_A(c), i+GETARG_sBx(c)); 199 break; 200 case OP_SEND: 201 printf("OP_SEND\tR%d\t:%s\t%d\n", GETARG_A(c), 202 mrb_sym2name(mrb, irep->syms[GETARG_B(c)]), 203 GETARG_C(c)); 204 break; 205 case OP_SENDB: 206 printf("OP_SENDB\tR%d\t:%s\t%d\n", GETARG_A(c), 207 mrb_sym2name(mrb, irep->syms[GETARG_B(c)]), 208 GETARG_C(c)); 209 break; 210 case OP_TAILCALL: 211 printf("OP_TAILCALL\tR%d\t:%s\t%d\n", GETARG_A(c), 212 mrb_sym2name(mrb, irep->syms[GETARG_B(c)]), 213 GETARG_C(c)); 214 break; 215 case OP_SUPER: 216 printf("OP_SUPER\tR%d\t%d\n", GETARG_A(c), 217 GETARG_C(c)); 218 break; 219 case OP_ARGARY: 220 printf("OP_ARGARY\tR%d\t%d:%d:%d:%d", GETARG_A(c), 221 (GETARG_Bx(c)>>10)&0x3f, 222 (GETARG_Bx(c)>>9)&0x1, 223 (GETARG_Bx(c)>>4)&0x1f, 224 (GETARG_Bx(c)>>0)&0xf); 225 print_lv(mrb, irep, c, RA); 226 break; 227 228 case OP_ENTER: 123 print_lv_a(mrb, irep, a); 124 break; 125 CASE(OP_LOADI, BB): 126 printf("OP_LOADI\tR%d\t%d\t", a, b); 127 print_lv_a(mrb, irep, a); 128 break; 129 CASE(OP_LOADINEG, BB): 130 printf("OP_LOADI\tR%d\t-%d\t", a, b); 131 print_lv_a(mrb, irep, a); 132 break; 133 CASE(OP_LOADI__1, B): 134 printf("OP_LOADI__1\tR%d\t\t", a); 135 print_lv_a(mrb, irep, a); 136 break; 137 CASE(OP_LOADI_0, B): goto L_LOADI; 138 CASE(OP_LOADI_1, B): goto L_LOADI; 139 CASE(OP_LOADI_2, B): goto L_LOADI; 140 CASE(OP_LOADI_3, B): goto L_LOADI; 141 CASE(OP_LOADI_4, B): goto L_LOADI; 142 CASE(OP_LOADI_5, B): goto L_LOADI; 143 CASE(OP_LOADI_6, B): goto L_LOADI; 144 CASE(OP_LOADI_7, B): 145 L_LOADI: 146 printf("OP_LOADI_%d\tR%d\t\t", ins-(int)OP_LOADI_0, a); 147 print_lv_a(mrb, irep, a); 148 break; 149 CASE(OP_LOADSYM, BB): 150 printf("OP_LOADSYM\tR%d\t:%s\t", a, mrb_sym_dump(mrb, irep->syms[b])); 151 print_lv_a(mrb, irep, a); 152 break; 153 CASE(OP_LOADNIL, B): 154 printf("OP_LOADNIL\tR%d\t\t", a); 155 print_lv_a(mrb, irep, a); 156 break; 157 CASE(OP_LOADSELF, B): 158 printf("OP_LOADSELF\tR%d\t\t", a); 159 print_lv_a(mrb, irep, a); 160 break; 161 CASE(OP_LOADT, B): 162 printf("OP_LOADT\tR%d\t\t", a); 163 print_lv_a(mrb, irep, a); 164 break; 165 CASE(OP_LOADF, B): 166 printf("OP_LOADF\tR%d\t\t", a); 167 print_lv_a(mrb, irep, a); 168 break; 169 CASE(OP_GETGV, BB): 170 printf("OP_GETGV\tR%d\t:%s", a, mrb_sym_dump(mrb, irep->syms[b])); 171 print_lv_a(mrb, irep, a); 172 break; 173 CASE(OP_SETGV, BB): 174 printf("OP_SETGV\t:%s\tR%d", mrb_sym_dump(mrb, irep->syms[b]), a); 175 print_lv_a(mrb, irep, a); 176 break; 177 CASE(OP_GETSV, BB): 178 printf("OP_GETSV\tR%d\t:%s", a, mrb_sym_dump(mrb, irep->syms[b])); 179 print_lv_a(mrb, irep, a); 180 break; 181 CASE(OP_SETSV, BB): 182 printf("OP_SETSV\t:%s\tR%d", mrb_sym_dump(mrb, irep->syms[b]), a); 183 print_lv_a(mrb, irep, a); 184 break; 185 CASE(OP_GETCONST, BB): 186 printf("OP_GETCONST\tR%d\t:%s", a, mrb_sym_dump(mrb, irep->syms[b])); 187 print_lv_a(mrb, irep, a); 188 break; 189 CASE(OP_SETCONST, BB): 190 printf("OP_SETCONST\t:%s\tR%d", mrb_sym_dump(mrb, irep->syms[b]), a); 191 print_lv_a(mrb, irep, a); 192 break; 193 CASE(OP_GETMCNST, BB): 194 printf("OP_GETMCNST\tR%d\tR%d::%s", a, a, mrb_sym_dump(mrb, irep->syms[b])); 195 print_lv_a(mrb, irep, a); 196 break; 197 CASE(OP_SETMCNST, BB): 198 printf("OP_SETMCNST\tR%d::%s\tR%d", a+1, mrb_sym_dump(mrb, irep->syms[b]), a); 199 print_lv_a(mrb, irep, a); 200 break; 201 CASE(OP_GETIV, BB): 202 printf("OP_GETIV\tR%d\t%s", a, mrb_sym_dump(mrb, irep->syms[b])); 203 print_lv_a(mrb, irep, a); 204 break; 205 CASE(OP_SETIV, BB): 206 printf("OP_SETIV\t%s\tR%d", mrb_sym_dump(mrb, irep->syms[b]), a); 207 print_lv_a(mrb, irep, a); 208 break; 209 CASE(OP_GETUPVAR, BBB): 210 printf("OP_GETUPVAR\tR%d\t%d\t%d", a, b, c); 211 print_lv_a(mrb, irep, a); 212 break; 213 CASE(OP_SETUPVAR, BBB): 214 printf("OP_SETUPVAR\tR%d\t%d\t%d", a, b, c); 215 print_lv_a(mrb, irep, a); 216 break; 217 CASE(OP_GETCV, BB): 218 printf("OP_GETCV\tR%d\t%s", a, mrb_sym_dump(mrb, irep->syms[b])); 219 print_lv_a(mrb, irep, a); 220 break; 221 CASE(OP_SETCV, BB): 222 printf("OP_SETCV\t%s\tR%d", mrb_sym_dump(mrb, irep->syms[b]), a); 223 print_lv_a(mrb, irep, a); 224 break; 225 CASE(OP_JMP, S): 226 printf("OP_JMP\t\t%03d\n", a); 227 break; 228 CASE(OP_JMPIF, BS): 229 printf("OP_JMPIF\tR%d\t%03d\t", a, b); 230 print_lv_a(mrb, irep, a); 231 break; 232 CASE(OP_JMPNOT, BS): 233 printf("OP_JMPNOT\tR%d\t%03d\t", a, b); 234 print_lv_a(mrb, irep, a); 235 break; 236 CASE(OP_JMPNIL, BS): 237 printf("OP_JMPNIL\tR%d\t%03d\t", a, b); 238 print_lv_a(mrb, irep, a); 239 break; 240 CASE(OP_SENDV, BB): 241 printf("OP_SENDV\tR%d\t:%s\n", a, mrb_sym_dump(mrb, irep->syms[b])); 242 break; 243 CASE(OP_SENDVB, BB): 244 printf("OP_SENDVB\tR%d\t:%s\n", a, mrb_sym_dump(mrb, irep->syms[b])); 245 break; 246 CASE(OP_SEND, BBB): 247 printf("OP_SEND\tR%d\t:%s\t%d\n", a, mrb_sym_dump(mrb, irep->syms[b]), c); 248 break; 249 CASE(OP_SENDB, BBB): 250 printf("OP_SENDB\tR%d\t:%s\t%d\n", a, mrb_sym_dump(mrb, irep->syms[b]), c); 251 break; 252 CASE(OP_CALL, Z): 253 printf("OP_CALL\n"); 254 break; 255 CASE(OP_SUPER, BB): 256 printf("OP_SUPER\tR%d\t%d\n", a, b); 257 break; 258 CASE(OP_ARGARY, BS): 259 printf("OP_ARGARY\tR%d\t%d:%d:%d:%d (%d)", a, 260 (b>>11)&0x3f, 261 (b>>10)&0x1, 262 (b>>5)&0x1f, 263 (b>>4)&0x1, 264 (b>>0)&0xf); 265 print_lv_a(mrb, irep, a); 266 break; 267 CASE(OP_ENTER, W): 229 268 printf("OP_ENTER\t%d:%d:%d:%d:%d:%d:%d\n", 230 (GETARG_Ax(c)>>18)&0x1f, 231 (GETARG_Ax(c)>>13)&0x1f, 232 (GETARG_Ax(c)>>12)&0x1, 233 (GETARG_Ax(c)>>7)&0x1f, 234 (GETARG_Ax(c)>>2)&0x1f, 235 (GETARG_Ax(c)>>1)&0x1, 236 GETARG_Ax(c) & 0x1); 237 break; 238 case OP_RETURN: 239 printf("OP_RETURN\tR%d", GETARG_A(c)); 240 switch (GETARG_B(c)) { 241 case OP_R_NORMAL: 242 printf("\tnormal\t"); break; 243 case OP_R_RETURN: 244 printf("\treturn\t"); break; 245 case OP_R_BREAK: 246 printf("\tbreak\t"); break; 247 default: 248 printf("\tbroken\t"); break; 269 MRB_ASPEC_REQ(a), 270 MRB_ASPEC_OPT(a), 271 MRB_ASPEC_REST(a), 272 MRB_ASPEC_POST(a), 273 MRB_ASPEC_KEY(a), 274 MRB_ASPEC_KDICT(a), 275 MRB_ASPEC_BLOCK(a)); 276 break; 277 CASE(OP_KEY_P, BB): 278 printf("OP_KEY_P\tR%d\t:%s\t", a, mrb_sym_dump(mrb, irep->syms[b])); 279 print_lv_a(mrb, irep, a); 280 break; 281 CASE(OP_KEYEND, Z): 282 printf("OP_KEYEND\n"); 283 break; 284 CASE(OP_KARG, BB): 285 printf("OP_KARG\tR%d\t:%s\t", a, mrb_sym_dump(mrb, irep->syms[b])); 286 print_lv_a(mrb, irep, a); 287 break; 288 CASE(OP_RETURN, B): 289 printf("OP_RETURN\tR%d\t\t", a); 290 print_lv_a(mrb, irep, a); 291 break; 292 CASE(OP_RETURN_BLK, B): 293 printf("OP_RETURN_BLK\tR%d\t\t", a); 294 print_lv_a(mrb, irep, a); 295 break; 296 CASE(OP_BREAK, B): 297 printf("OP_BREAK\tR%d\t\t", a); 298 print_lv_a(mrb, irep, a); 299 break; 300 CASE(OP_BLKPUSH, BS): 301 printf("OP_BLKPUSH\tR%d\t%d:%d:%d:%d (%d)", a, 302 (b>>11)&0x3f, 303 (b>>10)&0x1, 304 (b>>5)&0x1f, 305 (b>>4)&0x1, 306 (b>>0)&0xf); 307 print_lv_a(mrb, irep, a); 308 break; 309 CASE(OP_LAMBDA, BB): 310 printf("OP_LAMBDA\tR%d\tI(%d:%p)\n", a, b, irep->reps[b]); 311 break; 312 CASE(OP_BLOCK, BB): 313 printf("OP_BLOCK\tR%d\tI(%d:%p)\n", a, b, irep->reps[b]); 314 break; 315 CASE(OP_METHOD, BB): 316 printf("OP_METHOD\tR%d\tI(%d:%p)\n", a, b, irep->reps[b]); 317 break; 318 CASE(OP_RANGE_INC, B): 319 printf("OP_RANGE_INC\tR%d\n", a); 320 break; 321 CASE(OP_RANGE_EXC, B): 322 printf("OP_RANGE_EXC\tR%d\n", a); 323 break; 324 CASE(OP_DEF, BB): 325 printf("OP_DEF\tR%d\t:%s\n", a, mrb_sym_dump(mrb, irep->syms[b])); 326 break; 327 CASE(OP_UNDEF, B): 328 printf("OP_UNDEF\t:%s\n", mrb_sym_dump(mrb, irep->syms[a])); 329 break; 330 CASE(OP_ALIAS, BB): 331 printf("OP_ALIAS\t:%s\t%s\n", mrb_sym_dump(mrb, irep->syms[a]), mrb_sym_dump(mrb, irep->syms[b])); 332 break; 333 CASE(OP_ADD, B): 334 printf("OP_ADD\tR%d\t\n", a); 335 break; 336 CASE(OP_ADDI, BB): 337 printf("OP_ADDI\tR%d\t%d\n", a, b); 338 break; 339 CASE(OP_SUB, B): 340 printf("OP_SUB\tR%d\t\n", a); 341 break; 342 CASE(OP_SUBI, BB): 343 printf("OP_SUBI\tR%d\t%d\n", a, b); 344 break; 345 CASE(OP_MUL, B): 346 printf("OP_MUL\tR%d\t\n", a); 347 break; 348 CASE(OP_DIV, B): 349 printf("OP_DIV\tR%d\t\n", a); 350 break; 351 CASE(OP_LT, B): 352 printf("OP_LT\t\tR%d\t\n", a); 353 break; 354 CASE(OP_LE, B): 355 printf("OP_LE\t\tR%d\t\n", a); 356 break; 357 CASE(OP_GT, B): 358 printf("OP_GT\t\tR%d\t\n", a); 359 break; 360 CASE(OP_GE, B): 361 printf("OP_GE\t\tR%d\t\n", a); 362 break; 363 CASE(OP_EQ, B): 364 printf("OP_EQ\t\tR%d\t\n", a); 365 break; 366 CASE(OP_ARRAY, BB): 367 printf("OP_ARRAY\tR%d\t%d\t", a, b); 368 print_lv_a(mrb, irep, a); 369 break; 370 CASE(OP_ARRAY2, BBB): 371 printf("OP_ARRAY\tR%d\tR%d\t%d\t", a, b, c); 372 print_lv_ab(mrb, irep, a, b); 373 break; 374 CASE(OP_ARYCAT, B): 375 printf("OP_ARYCAT\tR%d\t", a); 376 print_lv_a(mrb, irep, a); 377 break; 378 CASE(OP_ARYPUSH, B): 379 printf("OP_ARYPUSH\tR%d\t", a); 380 print_lv_a(mrb, irep, a); 381 break; 382 CASE(OP_ARYDUP, B): 383 printf("OP_ARYDUP\tR%d\t", a); 384 print_lv_a(mrb, irep, a); 385 break; 386 CASE(OP_AREF, BBB): 387 printf("OP_AREF\tR%d\tR%d\t%d", a, b, c); 388 print_lv_ab(mrb, irep, a, b); 389 break; 390 CASE(OP_ASET, BBB): 391 printf("OP_ASET\tR%d\tR%d\t%d", a, b, c); 392 print_lv_ab(mrb, irep, a, b); 393 break; 394 CASE(OP_APOST, BBB): 395 printf("OP_APOST\tR%d\t%d\t%d", a, b, c); 396 print_lv_a(mrb, irep, a); 397 break; 398 CASE(OP_INTERN, B): 399 printf("OP_INTERN\tR%d", a); 400 print_lv_a(mrb, irep, a); 401 break; 402 CASE(OP_STRING, BB): 403 { 404 mrb_value v = irep->pool[b]; 405 mrb_value s = mrb_str_dump(mrb, mrb_str_new(mrb, RSTRING_PTR(v), RSTRING_LEN(v))); 406 printf("OP_STRING\tR%d\tL(%d)\t; %s", a, b, RSTRING_PTR(s)); 249 407 } 250 print_lv(mrb, irep, c, RA); 251 break; 252 case OP_BLKPUSH: 253 printf("OP_BLKPUSH\tR%d\t%d:%d:%d:%d", GETARG_A(c), 254 (GETARG_Bx(c)>>10)&0x3f, 255 (GETARG_Bx(c)>>9)&0x1, 256 (GETARG_Bx(c)>>4)&0x1f, 257 (GETARG_Bx(c)>>0)&0xf); 258 print_lv(mrb, irep, c, RA); 259 break; 260 261 case OP_LAMBDA: 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 } 271 print_lv(mrb, irep, c, RA); 272 break; 273 case OP_RANGE: 274 printf("OP_RANGE\tR%d\tR%d\t%d", GETARG_A(c), GETARG_B(c), GETARG_C(c)); 275 print_lv(mrb, irep, c, RAB); 276 break; 277 case OP_METHOD: 278 printf("OP_METHOD\tR%d\t:%s", GETARG_A(c), 279 mrb_sym2name(mrb, irep->syms[GETARG_B(c)])); 280 print_lv(mrb, irep, c, RA); 281 break; 282 283 case OP_ADD: 284 printf("OP_ADD\tR%d\t:%s\t%d\n", GETARG_A(c), 285 mrb_sym2name(mrb, irep->syms[GETARG_B(c)]), 286 GETARG_C(c)); 287 break; 288 case OP_ADDI: 289 printf("OP_ADDI\tR%d\t:%s\t%d\n", GETARG_A(c), 290 mrb_sym2name(mrb, irep->syms[GETARG_B(c)]), 291 GETARG_C(c)); 292 break; 293 case OP_SUB: 294 printf("OP_SUB\tR%d\t:%s\t%d\n", GETARG_A(c), 295 mrb_sym2name(mrb, irep->syms[GETARG_B(c)]), 296 GETARG_C(c)); 297 break; 298 case OP_SUBI: 299 printf("OP_SUBI\tR%d\t:%s\t%d\n", GETARG_A(c), 300 mrb_sym2name(mrb, irep->syms[GETARG_B(c)]), 301 GETARG_C(c)); 302 break; 303 case OP_MUL: 304 printf("OP_MUL\tR%d\t:%s\t%d\n", GETARG_A(c), 305 mrb_sym2name(mrb, irep->syms[GETARG_B(c)]), 306 GETARG_C(c)); 307 break; 308 case OP_DIV: 309 printf("OP_DIV\tR%d\t:%s\t%d\n", GETARG_A(c), 310 mrb_sym2name(mrb, irep->syms[GETARG_B(c)]), 311 GETARG_C(c)); 312 break; 313 case OP_LT: 314 printf("OP_LT\tR%d\t:%s\t%d\n", GETARG_A(c), 315 mrb_sym2name(mrb, irep->syms[GETARG_B(c)]), 316 GETARG_C(c)); 317 break; 318 case OP_LE: 319 printf("OP_LE\tR%d\t:%s\t%d\n", GETARG_A(c), 320 mrb_sym2name(mrb, irep->syms[GETARG_B(c)]), 321 GETARG_C(c)); 322 break; 323 case OP_GT: 324 printf("OP_GT\tR%d\t:%s\t%d\n", GETARG_A(c), 325 mrb_sym2name(mrb, irep->syms[GETARG_B(c)]), 326 GETARG_C(c)); 327 break; 328 case OP_GE: 329 printf("OP_GE\tR%d\t:%s\t%d\n", GETARG_A(c), 330 mrb_sym2name(mrb, irep->syms[GETARG_B(c)]), 331 GETARG_C(c)); 332 break; 333 case OP_EQ: 334 printf("OP_EQ\t\tR%d\t:%s\t%d\n", GETARG_A(c), 335 mrb_sym2name(mrb, irep->syms[GETARG_B(c)]), 336 GETARG_C(c)); 337 break; 338 339 case OP_STOP: 340 printf("OP_STOP\n"); 341 break; 342 343 case OP_ARRAY: 344 printf("OP_ARRAY\tR%d\tR%d\t%d", GETARG_A(c), GETARG_B(c), GETARG_C(c)); 345 print_lv(mrb, irep, c, RAB); 346 break; 347 case OP_ARYCAT: 348 printf("OP_ARYCAT\tR%d\tR%d\t", GETARG_A(c), GETARG_B(c)); 349 print_lv(mrb, irep, c, RAB); 350 break; 351 case OP_ARYPUSH: 352 printf("OP_ARYPUSH\tR%d\tR%d\t", GETARG_A(c), GETARG_B(c)); 353 print_lv(mrb, irep, c, RAB); 354 break; 355 case OP_AREF: 356 printf("OP_AREF\tR%d\tR%d\t%d", GETARG_A(c), GETARG_B(c), GETARG_C(c)); 357 print_lv(mrb, irep, c, RAB); 358 break; 359 case OP_APOST: 360 printf("OP_APOST\tR%d\t%d\t%d", GETARG_A(c), GETARG_B(c), GETARG_C(c)); 361 print_lv(mrb, irep, c, RA); 362 break; 363 case OP_STRING: 408 print_lv_a(mrb, irep, a); 409 break; 410 CASE(OP_STRCAT, B): 411 printf("OP_STRCAT\tR%d\t", a); 412 print_lv_a(mrb, irep, a); 413 break; 414 CASE(OP_HASH, BB): 415 printf("OP_HASH\tR%d\t%d\t", a, b); 416 print_lv_a(mrb, irep, a); 417 break; 418 CASE(OP_HASHADD, BB): 419 printf("OP_HASHADD\tR%d\t%d\t", a, b); 420 print_lv_a(mrb, irep, a); 421 break; 422 CASE(OP_HASHCAT, B): 423 printf("OP_HASHCAT\tR%d\t", a); 424 print_lv_a(mrb, irep, a); 425 break; 426 427 CASE(OP_OCLASS, B): 428 printf("OP_OCLASS\tR%d\t\t", a); 429 print_lv_a(mrb, irep, a); 430 break; 431 CASE(OP_CLASS, BB): 432 printf("OP_CLASS\tR%d\t:%s", a, mrb_sym_dump(mrb, irep->syms[b])); 433 print_lv_a(mrb, irep, a); 434 break; 435 CASE(OP_MODULE, BB): 436 printf("OP_MODULE\tR%d\t:%s", a, mrb_sym_dump(mrb, irep->syms[b])); 437 print_lv_a(mrb, irep, a); 438 break; 439 CASE(OP_EXEC, BB): 440 printf("OP_EXEC\tR%d\tI(%d:%p)", a, b, irep->reps[b]); 441 print_lv_a(mrb, irep, a); 442 break; 443 CASE(OP_SCLASS, B): 444 printf("OP_SCLASS\tR%d\t", a); 445 print_lv_a(mrb, irep, a); 446 break; 447 CASE(OP_TCLASS, B): 448 printf("OP_TCLASS\tR%d\t\t", a); 449 print_lv_a(mrb, irep, a); 450 break; 451 CASE(OP_ERR, B): 364 452 { 365 mrb_value v = irep->pool[GETARG_Bx(c)]; 366 mrb_value s = mrb_str_dump(mrb, mrb_str_new(mrb, RSTRING_PTR(v), RSTRING_LEN(v))); 367 printf("OP_STRING\tR%d\tL(%d)\t; %s", GETARG_A(c), GETARG_Bx(c), RSTRING_PTR(s)); 368 } 369 print_lv(mrb, irep, c, RA); 370 break; 371 case OP_STRCAT: 372 printf("OP_STRCAT\tR%d\tR%d\t", GETARG_A(c), GETARG_B(c)); 373 print_lv(mrb, irep, c, RAB); 374 break; 375 case OP_HASH: 376 printf("OP_HASH\tR%d\tR%d\t%d", GETARG_A(c), GETARG_B(c), GETARG_C(c)); 377 print_lv(mrb, irep, c, RAB); 378 break; 379 380 case OP_OCLASS: 381 printf("OP_OCLASS\tR%d\t\t", GETARG_A(c)); 382 print_lv(mrb, irep, c, RA); 383 break; 384 case OP_CLASS: 385 printf("OP_CLASS\tR%d\t:%s", GETARG_A(c), 386 mrb_sym2name(mrb, irep->syms[GETARG_B(c)])); 387 print_lv(mrb, irep, c, RA); 388 break; 389 case OP_MODULE: 390 printf("OP_MODULE\tR%d\t:%s", GETARG_A(c), 391 mrb_sym2name(mrb, irep->syms[GETARG_B(c)])); 392 print_lv(mrb, irep, c, RA); 393 break; 394 case OP_EXEC: 395 printf("OP_EXEC\tR%d\tI(%+d)", GETARG_A(c), GETARG_Bx(c)+1); 396 print_lv(mrb, irep, c, RA); 397 break; 398 case OP_SCLASS: 399 printf("OP_SCLASS\tR%d\tR%d\t", GETARG_A(c), GETARG_B(c)); 400 print_lv(mrb, irep, c, RAB); 401 break; 402 case OP_TCLASS: 403 printf("OP_TCLASS\tR%d\t\t", GETARG_A(c)); 404 print_lv(mrb, irep, c, RA); 405 break; 406 case OP_ERR: 407 { 408 mrb_value v = irep->pool[GETARG_Bx(c)]; 453 mrb_value v = irep->pool[a]; 409 454 mrb_value s = mrb_str_dump(mrb, mrb_str_new(mrb, RSTRING_PTR(v), RSTRING_LEN(v))); 410 455 printf("OP_ERR\t%s\n", RSTRING_PTR(s)); 411 456 } 412 457 break; 413 case OP_EPUSH: 414 printf("OP_EPUSH\t:I(%+d)\n", GETARG_Bx(c)+1); 415 break; 416 case OP_ONERR: 417 printf("OP_ONERR\t%03d\n", i+GETARG_sBx(c)); 418 break; 419 case OP_RESCUE: 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 } 458 CASE(OP_EPUSH, B): 459 printf("OP_EPUSH\t\t:I(%d:%p)\n", a, irep->reps[a]); 460 break; 461 CASE(OP_ONERR, S): 462 printf("OP_ONERR\t%03d\n", a); 463 break; 464 CASE(OP_EXCEPT, B): 465 printf("OP_EXCEPT\tR%d\t\t", a); 466 print_lv_a(mrb, irep, a); 467 break; 468 CASE(OP_RESCUE, BB): 469 printf("OP_RESCUE\tR%d\tR%d", a, b); 470 print_lv_ab(mrb, irep, a, b); 471 break; 472 CASE(OP_RAISE, B): 473 printf("OP_RAISE\tR%d\t\t", a); 474 print_lv_a(mrb, irep, a); 475 break; 476 CASE(OP_POPERR, B): 477 printf("OP_POPERR\t%d\t\t\n", a); 478 break; 479 CASE(OP_EPOP, B): 480 printf("OP_EPOP\t%d\n", a); 481 break; 482 483 CASE(OP_DEBUG, BBB): 484 printf("OP_DEBUG\t%d\t%d\t%d\n", a, b, c); 485 break; 486 487 CASE(OP_STOP, Z): 488 printf("OP_STOP\n"); 489 break; 490 491 CASE(OP_EXT1, Z): 492 ins = READ_B(); 493 printf("OP_EXT1\n"); 494 print_header(mrb, irep, pc-irep->iseq-2); 495 switch (ins) { 496 #define OPCODE(i,x) case OP_ ## i: FETCH_ ## x ## _1 (); goto L_OP_ ## i; 497 #include "mruby/ops.h" 498 #undef OPCODE 435 499 } 436 500 break; 437 case OP_RAISE: 438 printf("OP_RAISE\tR%d\t\t", GETARG_A(c)); 439 print_lv(mrb, irep, c, RA); 440 break; 441 case OP_POPERR: 442 printf("OP_POPERR\t%d\t\t\n", GETARG_A(c)); 443 break; 444 case OP_EPOP: 445 printf("OP_EPOP\t%d\n", GETARG_A(c)); 501 CASE(OP_EXT2, Z): 502 ins = READ_B(); 503 printf("OP_EXT2\n"); 504 print_header(mrb, irep, pc-irep->iseq-2); 505 switch (ins) { 506 #define OPCODE(i,x) case OP_ ## i: FETCH_ ## x ## _2 (); goto L_OP_ ## i; 507 #include "mruby/ops.h" 508 #undef OPCODE 509 } 510 break; 511 CASE(OP_EXT3, Z): 512 ins = READ_B(); 513 printf("OP_EXT3\n"); 514 print_header(mrb, irep, pc-irep->iseq-2); 515 switch (ins) { 516 #define OPCODE(i,x) case OP_ ## i: FETCH_ ## x ## _3 (); goto L_OP_ ## i; 517 #include "mruby/ops.h" 518 #undef OPCODE 519 } 446 520 break; 447 521 448 522 default: 449 printf("OP_unknown %d\t%d\t%d\t%d\n", GET_OPCODE(c), 450 GETARG_A(c), GETARG_B(c), GETARG_C(c)); 523 printf("OP_unknown (0x%x)\n", ins); 451 524 break; 452 525 } … … 454 527 } 455 528 printf("\n"); 456 #endif457 529 } 458 530 … … 460 532 codedump_recur(mrb_state *mrb, mrb_irep *irep) 461 533 { 462 size_t i;534 int i; 463 535 464 536 codedump(mrb, irep); … … 467 539 } 468 540 } 541 #endif 469 542 470 543 void 471 544 mrb_codedump_all(mrb_state *mrb, struct RProc *proc) 472 545 { 546 #ifndef MRB_DISABLE_STDIO 473 547 codedump_recur(mrb, proc->body.irep); 474 } 548 #endif 549 } -
EcnlProtoTool/trunk/mruby-2.1.1/src/debug.c
r331 r439 4 4 #include <mruby/debug.h> 5 5 6 static mrb_irep_debug_info_file 6 static mrb_irep_debug_info_file* 7 7 get_file(mrb_irep_debug_info *info, uint32_t pc) 8 8 { … … 52 52 53 53 MRB_API char const* 54 mrb_debug_get_filename(mrb_ irep *irep, uint32_t pc)55 { 56 if (irep && pc < irep->ilen) {54 mrb_debug_get_filename(mrb_state *mrb, mrb_irep *irep, ptrdiff_t pc) 55 { 56 if (irep && pc >= 0 && pc < irep->ilen) { 57 57 mrb_irep_debug_info_file* f = NULL; 58 if (!irep->debug_info) { return irep->filename; }59 else if ((f = get_file(irep->debug_info, pc))) {60 return f->filename;58 if (!irep->debug_info) return NULL; 59 else if ((f = get_file(irep->debug_info, (uint32_t)pc))) { 60 return mrb_sym_name_len(mrb, f->filename_sym, NULL); 61 61 } 62 62 } … … 65 65 66 66 MRB_API int32_t 67 mrb_debug_get_line(mrb_ irep *irep, uint32_t pc)68 { 69 if (irep && pc < irep->ilen) {67 mrb_debug_get_line(mrb_state *mrb, mrb_irep *irep, ptrdiff_t pc) 68 { 69 if (irep && pc >= 0 && pc < irep->ilen) { 70 70 mrb_irep_debug_info_file* f = NULL; 71 71 if (!irep->debug_info) { 72 return irep->lines? irep->lines[pc] :-1;73 } 74 else if ((f = get_file(irep->debug_info, pc))) {72 return -1; 73 } 74 else if ((f = get_file(irep->debug_info, (uint32_t)pc))) { 75 75 switch (f->line_type) { 76 76 case mrb_debug_line_ary: … … 109 109 } 110 110 111 MRB_API mrb_irep_debug_info 111 MRB_API mrb_irep_debug_info* 112 112 mrb_debug_info_alloc(mrb_state *mrb, mrb_irep *irep) 113 113 { … … 122 122 } 123 123 124 MRB_API mrb_irep_debug_info_file * 125 mrb_debug_info_append_file(mrb_state *mrb, mrb_irep *irep, 124 MRB_API mrb_irep_debug_info_file* 125 mrb_debug_info_append_file(mrb_state *mrb, mrb_irep_debug_info *d, 126 const char *filename, uint16_t *lines, 126 127 uint32_t start_pos, uint32_t end_pos) 127 128 { 128 mrb_irep_debug_info *info; 129 mrb_irep_debug_info_file *ret; 129 mrb_irep_debug_info_file *f; 130 130 uint32_t file_pc_count; 131 131 size_t fn_len; 132 mrb_int len;133 132 uint32_t i; 134 133 135 if (! irep->debug_info) { return NULL; }136 137 mrb_assert(irep->filename); 138 mrb_assert( irep->lines);139 140 info = irep->debug_info; 141 142 if (info->flen > 0 && strcmp(irep->filename, info->files[info->flen - 1]->filename) == 0) {143 return NULL;144 }145 146 ret = (mrb_irep_debug_info_file *)mrb_malloc(mrb, sizeof(*ret)); 147 info->files =148 149 info->files150 ? mrb_realloc(mrb, info->files, sizeof(mrb_irep_debug_info_file*) * (info->flen + 1))134 if (!d) return NULL; 135 if (start_pos == end_pos) return NULL; 136 137 mrb_assert(filename); 138 mrb_assert(lines); 139 140 if (d->flen > 0) { 141 const char *fn = mrb_sym_name_len(mrb, d->files[d->flen - 1]->filename_sym, NULL); 142 if (strcmp(filename, fn) == 0) 143 return NULL; 144 } 145 146 f = (mrb_irep_debug_info_file*)mrb_malloc(mrb, sizeof(*f)); 147 d->files = (mrb_irep_debug_info_file**)( 148 d->files 149 ? mrb_realloc(mrb, d->files, sizeof(mrb_irep_debug_info_file*) * (d->flen + 1)) 151 150 : mrb_malloc(mrb, sizeof(mrb_irep_debug_info_file*))); 152 info->files[info->flen++] = ret;151 d->files[d->flen++] = f; 153 152 154 153 file_pc_count = end_pos - start_pos; 155 154 156 ret->start_pos = start_pos; 157 info->pc_count = end_pos; 158 159 fn_len = strlen(irep->filename); 160 ret->filename_sym = mrb_intern(mrb, irep->filename, fn_len); 161 len = 0; 162 ret->filename = mrb_sym2name_len(mrb, ret->filename_sym, &len); 163 164 ret->line_type = select_line_type(irep->lines + start_pos, end_pos - start_pos); 165 ret->lines.ptr = NULL; 166 167 switch (ret->line_type) { 155 f->start_pos = start_pos; 156 d->pc_count = end_pos; 157 158 fn_len = strlen(filename); 159 f->filename_sym = mrb_intern(mrb, filename, fn_len); 160 161 f->line_type = select_line_type(lines + start_pos, end_pos - start_pos); 162 f->lines.ptr = NULL; 163 164 switch (f->line_type) { 168 165 case mrb_debug_line_ary: 169 ret->line_entry_count = file_pc_count;170 ret->lines.ary = (uint16_t*)mrb_malloc(mrb, sizeof(uint16_t) * file_pc_count);166 f->line_entry_count = file_pc_count; 167 f->lines.ary = (uint16_t*)mrb_malloc(mrb, sizeof(uint16_t) * file_pc_count); 171 168 for (i = 0; i < file_pc_count; ++i) { 172 ret->lines.ary[i] = irep->lines[start_pos + i];169 f->lines.ary[i] = lines[start_pos + i]; 173 170 } 174 171 break; … … 177 174 uint16_t prev_line = 0; 178 175 mrb_irep_debug_info_line m; 179 ret->lines.flat_map = (mrb_irep_debug_info_line*)mrb_malloc(mrb, sizeof(mrb_irep_debug_info_line) * 1);180 ret->line_entry_count = 0;176 f->lines.flat_map = (mrb_irep_debug_info_line*)mrb_malloc(mrb, sizeof(mrb_irep_debug_info_line) * 1); 177 f->line_entry_count = 0; 181 178 for (i = 0; i < file_pc_count; ++i) { 182 if ( irep->lines[start_pos + i] == prev_line) { continue; }183 184 ret->lines.flat_map = (mrb_irep_debug_info_line*)mrb_realloc(185 mrb, ret->lines.flat_map,186 sizeof(mrb_irep_debug_info_line) * ( ret->line_entry_count + 1));179 if (lines[start_pos + i] == prev_line) { continue; } 180 181 f->lines.flat_map = (mrb_irep_debug_info_line*)mrb_realloc( 182 mrb, f->lines.flat_map, 183 sizeof(mrb_irep_debug_info_line) * (f->line_entry_count + 1)); 187 184 m.start_pos = start_pos + i; 188 m.line = irep->lines[start_pos + i];189 ret->lines.flat_map[ret->line_entry_count] = m;185 m.line = lines[start_pos + i]; 186 f->lines.flat_map[f->line_entry_count] = m; 190 187 191 188 /* update */ 192 ++ ret->line_entry_count;193 prev_line = irep->lines[start_pos + i];189 ++f->line_entry_count; 190 prev_line = lines[start_pos + i]; 194 191 } 195 192 } break; … … 198 195 } 199 196 200 return ret;197 return f; 201 198 } 202 199 -
EcnlProtoTool/trunk/mruby-2.1.1/src/dump.c
r331 r439 7 7 #include <string.h> 8 8 #include <limits.h> 9 #include <math.h> 9 10 #include <mruby/dump.h> 10 11 #include <mruby/string.h> … … 16 17 #define FLAG_BYTEORDER_NONATIVE 0 17 18 19 #ifndef MRB_WITHOUT_FLOAT 18 20 #ifdef MRB_USE_FLOAT 19 #define MRB_FLOAT_FMT "%. 8e"21 #define MRB_FLOAT_FMT "%.9g" 20 22 #else 21 #define MRB_FLOAT_FMT "%.16e" 23 #define MRB_FLOAT_FMT "%.17g" 24 #endif 22 25 #endif 23 26 … … 80 83 { 81 84 uint8_t *cur = buf; 82 uint32_t iseq_no;83 85 84 86 cur += uint32_to_bin(irep->ilen, cur); /* number of opcode */ 85 87 cur += write_padding(cur); 86 switch (flags & DUMP_ENDIAN_NAT) { 87 case DUMP_ENDIAN_BIG: 88 if (bigendian_p()) goto native; 89 for (iseq_no = 0; iseq_no < irep->ilen; iseq_no++) { 90 cur += uint32_to_bin(irep->iseq[iseq_no], cur); /* opcode */ 91 } 92 break; 93 case DUMP_ENDIAN_LIL: 94 if (!bigendian_p()) goto native; 95 for (iseq_no = 0; iseq_no < irep->ilen; iseq_no++) { 96 cur += uint32l_to_bin(irep->iseq[iseq_no], cur); /* opcode */ 97 } 98 break; 99 100 native: 101 case DUMP_ENDIAN_NAT: 102 memcpy(cur, irep->iseq, irep->ilen * sizeof(mrb_code)); 103 cur += irep->ilen * sizeof(mrb_code); 104 break; 105 } 88 memcpy(cur, irep->iseq, irep->ilen * sizeof(mrb_code)); 89 cur += irep->ilen * sizeof(mrb_code); 106 90 107 91 return cur - buf; 108 92 } 109 93 94 #ifndef MRB_WITHOUT_FLOAT 95 static mrb_value 96 float_to_str(mrb_state *mrb, mrb_value flt) 97 { 98 mrb_float f = mrb_float(flt); 99 100 if (isinf(f)) { 101 return f < 0 ? mrb_str_new_lit(mrb, "I") : mrb_str_new_lit(mrb, "i"); 102 } 103 return mrb_float_to_str(mrb, flt, MRB_FLOAT_FMT); 104 } 105 #endif 110 106 111 107 static size_t 112 108 get_pool_block_size(mrb_state *mrb, mrb_irep *irep) 113 109 { 110 int pool_no; 114 111 size_t size = 0; 115 size_t pool_no;116 112 mrb_value str; 117 113 … … 132 128 break; 133 129 130 #ifndef MRB_WITHOUT_FLOAT 134 131 case MRB_TT_FLOAT: 135 str = mrb_float_to_str(mrb, irep->pool[pool_no], MRB_FLOAT_FMT);132 str = float_to_str(mrb, irep->pool[pool_no]); 136 133 { 137 134 mrb_int len = RSTRING_LEN(str); … … 140 137 } 141 138 break; 139 #endif 142 140 143 141 case MRB_TT_STRING: … … 161 159 write_pool_block(mrb_state *mrb, mrb_irep *irep, uint8_t *buf) 162 160 { 163 size_t pool_no;161 int pool_no; 164 162 uint8_t *cur = buf; 165 163 uint16_t len; … … 178 176 break; 179 177 178 #ifndef MRB_WITHOUT_FLOAT 180 179 case MRB_TT_FLOAT: 181 180 cur += uint8_to_bin(IREP_TT_FLOAT, cur); /* data type */ 182 str = mrb_float_to_str(mrb, irep->pool[pool_no], MRB_FLOAT_FMT);181 str = float_to_str(mrb, irep->pool[pool_no]); 183 182 break; 183 #endif 184 184 185 185 case MRB_TT_STRING: … … 214 214 { 215 215 size_t size = 0; 216 uint32_t sym_no;216 int sym_no; 217 217 mrb_int len; 218 218 … … 221 221 size += sizeof(uint16_t); /* snl(n) */ 222 222 if (irep->syms[sym_no] != 0) { 223 mrb_sym 2name_len(mrb, irep->syms[sym_no], &len);223 mrb_sym_name_len(mrb, irep->syms[sym_no], &len); 224 224 size += len + 1; /* sn(n) + null char */ 225 225 } … … 232 232 write_syms_block(mrb_state *mrb, mrb_irep *irep, uint8_t *buf) 233 233 { 234 uint32_t sym_no;234 int sym_no; 235 235 uint8_t *cur = buf; 236 236 const char *name; … … 242 242 mrb_int len; 243 243 244 name = mrb_sym 2name_len(mrb, irep->syms[sym_no], &len);244 name = mrb_sym_name_len(mrb, irep->syms[sym_no], &len); 245 245 246 246 mrb_assert_int_fit(mrb_int, len, uint16_t, UINT16_MAX); … … 274 274 { 275 275 size_t size = 0; 276 size_t irep_no;276 int irep_no; 277 277 278 278 size = get_irep_record_size_1(mrb, irep); … … 286 286 write_irep_record(mrb_state *mrb, mrb_irep *irep, uint8_t *bin, size_t *irep_record_size, uint8_t flags) 287 287 { 288 uint32_t i;288 int i; 289 289 uint8_t *src = bin; 290 290 … … 367 367 } 368 368 369 static int370 write_section_lineno_header(mrb_state *mrb, size_t section_size, uint8_t *bin)371 {372 struct rite_section_lineno_header *header = (struct rite_section_lineno_header*)bin;373 374 memcpy(header->section_ident, RITE_SECTION_LINENO_IDENT, sizeof(header->section_ident));375 uint32_to_bin((uint32_t)section_size, header->section_size);376 377 return MRB_DUMP_OK;378 }379 380 static size_t381 get_lineno_record_size(mrb_state *mrb, mrb_irep *irep)382 {383 size_t size = 0;384 385 size += sizeof(uint32_t); /* record size */386 size += sizeof(uint16_t); /* filename size */387 if (irep->filename) {388 size += strlen(irep->filename); /* filename */389 }390 size += sizeof(uint32_t); /* niseq */391 if (irep->lines) {392 size += sizeof(uint16_t) * irep->ilen; /* lineno */393 }394 395 return size;396 }397 398 static size_t399 write_lineno_record_1(mrb_state *mrb, mrb_irep *irep, uint8_t* bin)400 {401 uint8_t *cur = bin;402 size_t iseq_no;403 size_t filename_len;404 ptrdiff_t diff;405 406 cur += sizeof(uint32_t); /* record size */407 408 if (irep->filename) {409 filename_len = strlen(irep->filename);410 }411 else {412 filename_len = 0;413 }414 mrb_assert_int_fit(size_t, filename_len, uint16_t, UINT16_MAX);415 cur += uint16_to_bin((uint16_t)filename_len, cur); /* filename size */416 417 if (filename_len) {418 memcpy(cur, irep->filename, filename_len);419 cur += filename_len; /* filename */420 }421 422 if (irep->lines) {423 mrb_assert_int_fit(size_t, irep->ilen, uint32_t, UINT32_MAX);424 cur += uint32_to_bin((uint32_t)(irep->ilen), cur); /* niseq */425 for (iseq_no = 0; iseq_no < irep->ilen; iseq_no++) {426 cur += uint16_to_bin(irep->lines[iseq_no], cur); /* opcode */427 }428 }429 else {430 cur += uint32_to_bin(0, cur); /* niseq */431 }432 433 diff = cur - bin;434 mrb_assert_int_fit(ptrdiff_t, diff, uint32_t, UINT32_MAX);435 436 uint32_to_bin((uint32_t)diff, bin); /* record size */437 438 mrb_assert_int_fit(ptrdiff_t, diff, size_t, SIZE_MAX);439 return (size_t)diff;440 }441 442 static size_t443 write_lineno_record(mrb_state *mrb, mrb_irep *irep, uint8_t* bin)444 {445 size_t i;446 size_t rlen, size = 0;447 448 rlen = write_lineno_record_1(mrb, irep, bin);449 bin += rlen;450 size += rlen;451 for (i=0; i<irep->rlen; i++) {452 rlen = write_lineno_record(mrb, irep, bin);453 bin += rlen;454 size += rlen;455 }456 return size;457 }458 459 static int460 write_section_lineno(mrb_state *mrb, mrb_irep *irep, uint8_t *bin)461 {462 size_t section_size = 0;463 size_t rlen = 0; /* size of irep record */464 uint8_t *cur = bin;465 466 if (mrb == NULL || bin == NULL) {467 return MRB_DUMP_INVALID_ARGUMENT;468 }469 470 cur += sizeof(struct rite_section_lineno_header);471 section_size += sizeof(struct rite_section_lineno_header);472 473 rlen = write_lineno_record(mrb, irep, cur);474 section_size += rlen;475 476 write_section_lineno_header(mrb, section_size, bin);477 478 return MRB_DUMP_OK;479 }480 481 369 static size_t 482 370 get_debug_record_size(mrb_state *mrb, mrb_irep *irep) … … 484 372 size_t ret = 0; 485 373 uint16_t f_idx; 486 size_t i;374 int i; 487 375 488 376 ret += sizeof(uint32_t); /* record size */ … … 532 420 { 533 421 mrb_sym *filenames = *fp; 534 size_t i,size = 0;422 size_t size = 0; 535 423 mrb_irep_debug_info *di = irep->debug_info; 424 int i; 536 425 537 426 mrb_assert(lp); … … 548 437 549 438 /* filename */ 550 mrb_sym 2name_len(mrb, file->filename_sym, &filename_len);439 mrb_sym_name_len(mrb, file->filename_sym, &filename_len); 551 440 size += sizeof(uint16_t) + (size_t)filename_len; 552 441 } … … 606 495 ret = cur - bin; 607 496 mrb_assert_int_fit(ptrdiff_t, ret, uint32_t, UINT32_MAX); 608 uint32_to_bin( ret, bin);497 uint32_to_bin((uint32_t)ret, bin); 609 498 610 499 mrb_assert_int_fit(ptrdiff_t, ret, size_t, SIZE_MAX); … … 616 505 { 617 506 size_t size, len; 618 size_t irep_no;507 int irep_no; 619 508 620 509 size = len = write_debug_record_1(mrb, irep, bin, filenames, filenames_len); … … 652 541 section_size += sizeof(uint16_t); 653 542 for (i = 0; i < filenames_len; ++i) { 654 sym = mrb_sym 2name_len(mrb, filenames[i], &sym_len);543 sym = mrb_sym_name_len(mrb, filenames[i], &sym_len); 655 544 mrb_assert(sym); 656 cur += uint16_to_bin( sym_len, cur);545 cur += uint16_to_bin((uint16_t)sym_len, cur); 657 546 memcpy(cur, sym, sym_len); 658 547 cur += sym_len; … … 666 555 memcpy(header->section_ident, RITE_SECTION_DEBUG_IDENT, sizeof(header->section_ident)); 667 556 mrb_assert(section_size <= INT32_MAX); 668 uint32_to_bin( section_size, header->section_size);557 uint32_to_bin((uint32_t)section_size, header->section_size); 669 558 670 559 return MRB_DUMP_OK; … … 674 563 create_lv_sym_table(mrb_state *mrb, const mrb_irep *irep, mrb_sym **syms, uint32_t *syms_len) 675 564 { 676 size_t i;565 int i; 677 566 678 567 if (*syms == NULL) { … … 706 595 707 596 for (i = 0; i < syms_len; ++i) { 708 str = mrb_sym 2name_len(mrb, syms[i], &str_len);709 cur += uint16_to_bin( str_len, cur);597 str = mrb_sym_name_len(mrb, syms[i], &str_len); 598 cur += uint16_to_bin((uint16_t)str_len, cur); 710 599 memcpy(cur, str, str_len); 711 600 cur += str_len; … … 721 610 { 722 611 uint8_t *cur = *start; 723 size_t i;612 int i; 724 613 725 614 for (i = 0; i + 1 < irep->nlocals; ++i) { … … 749 638 get_lv_record_size(mrb_state *mrb, mrb_irep *irep) 750 639 { 751 size_t ret = 0, i; 640 size_t ret = 0; 641 int i; 752 642 753 643 ret += (sizeof(uint16_t) + sizeof(uint16_t)) * (irep->nlocals - 1); … … 769 659 for (i = 0; i < syms_len; ++i) { 770 660 mrb_int str_len; 771 mrb_sym 2name_len(mrb, syms[i], &str_len);661 mrb_sym_name_len(mrb, syms[i], &str_len); 772 662 ret += str_len; 773 663 } … … 807 697 diff = cur - start; 808 698 mrb_assert_int_fit(ptrdiff_t, diff, size_t, SIZE_MAX); 809 uint32_to_bin( diff, header->section_size);699 uint32_to_bin((uint32_t)diff, header->section_size); 810 700 811 701 lv_section_exit: … … 842 732 uint32_to_bin((uint32_t)binary_size, header->binary_size); 843 733 844 offset = ( &(header->binary_crc[0]) - bin) + sizeof(uint16_t);734 offset = (uint32_t)((&(header->binary_crc[0]) - bin) + sizeof(uint16_t)); 845 735 crc = calc_crc_16_ccitt(bin + offset, binary_size - offset, 0); 846 736 uint16_to_bin(crc, header->binary_crc); … … 850 740 851 741 static mrb_bool 852 is_debug_info_defined(mrb_irep *irep)853 { 854 size_t i;742 debug_info_defined_p(mrb_irep *irep) 743 { 744 int i; 855 745 856 746 if (!irep->debug_info) return FALSE; 857 747 for (i=0; i<irep->rlen; i++) { 858 if (! is_debug_info_defined(irep->reps[i])) return FALSE;748 if (!debug_info_defined_p(irep->reps[i])) return FALSE; 859 749 } 860 750 return TRUE; … … 862 752 863 753 static mrb_bool 864 is_lv_defined(mrb_irep *irep)865 { 866 size_t i;754 lv_defined_p(mrb_irep *irep) 755 { 756 int i; 867 757 868 758 if (irep->lv) { return TRUE; } 869 759 870 760 for (i = 0; i < irep->rlen; ++i) { 871 if ( is_lv_defined(irep->reps[i])) { return TRUE; }761 if (lv_defined_p(irep->reps[i])) { return TRUE; } 872 762 } 873 763 … … 898 788 size_t section_lineno_size = 0, section_lv_size = 0; 899 789 uint8_t *cur = NULL; 900 mrb_bool const debug_info_defined = is_debug_info_defined(irep), lv_defined = is_lv_defined(irep);790 mrb_bool const debug_info_defined = debug_info_defined_p(irep), lv_defined = lv_defined_p(irep); 901 791 mrb_sym *lv_syms = NULL; uint32_t lv_syms_len = 0; 902 792 mrb_sym *filenames = NULL; uint16_t filenames_len = 0; … … 923 813 section_lineno_size += get_debug_record_size(mrb, irep); 924 814 } 925 else {926 section_lineno_size += sizeof(struct rite_section_lineno_header);927 section_lineno_size += get_lineno_record_size(mrb, irep);928 }929 815 } 930 816 … … 954 840 if (debug_info_defined) { 955 841 result = write_section_debug(mrb, irep, cur, filenames, filenames_len); 956 } 957 else { 958 result = write_section_lineno(mrb, irep, cur); 959 } 960 if (result != MRB_DUMP_OK) { 961 goto error_exit; 842 if (result != MRB_DUMP_OK) { 843 goto error_exit; 844 } 962 845 } 963 846 cur += section_lineno_size; … … 1061 944 } 1062 945 if (fprintf(fp, 946 "#ifdef __cplusplus\n" 1063 947 "extern const uint8_t %s[];\n" 948 "#endif\n" 1064 949 "const uint8_t\n" 1065 950 "#if defined __GNUC__\n" -
EcnlProtoTool/trunk/mruby-2.1.1/src/enum.c
r331 r439 6 6 7 7 #include <mruby.h> 8 #include <mruby/proc.h> 9 10 /* internal method `__update_hash(oldhash, index, itemhash)` */ 11 static mrb_value 12 enum_update_hash(mrb_state *mrb, mrb_value self) 13 { 14 mrb_int hash; 15 mrb_int index; 16 mrb_int hv; 17 18 mrb_get_args(mrb, "iii", &hash, &index, &hv); 19 hash ^= ((uint32_t)hv << (index % 16)); 20 21 return mrb_fixnum_value(hash); 22 } 8 23 9 24 void 10 25 mrb_init_enumerable(mrb_state *mrb) 11 26 { 12 mrb_define_module(mrb, "Enumerable"); /* 15.3.2 */ 27 struct RClass *enumerable; 28 enumerable = mrb_define_module(mrb, "Enumerable"); /* 15.3.2 */ 29 mrb_define_module_function(mrb, enumerable, "__update_hash", enum_update_hash, MRB_ARGS_REQ(3)); 13 30 } 14 -
EcnlProtoTool/trunk/mruby-2.1.1/src/error.c
r331 r439 14 14 #include <mruby/string.h> 15 15 #include <mruby/variable.h> 16 #include <mruby/debug.h>17 16 #include <mruby/error.h> 18 17 #include <mruby/class.h> … … 29 28 mrb_exc_new_str(mrb_state *mrb, struct RClass* c, mrb_value str) 30 29 { 31 str = mrb_str_to_str(mrb, str);30 mrb_to_str(mrb, str); 32 31 return mrb_obj_new(mrb, c, 1, &str); 33 32 } … … 45 44 { 46 45 mrb_value mesg; 47 mrb_int argc; 48 mrb_value *argv; 49 50 if (mrb_get_args(mrb, "|o*", &mesg, &argv, &argc) >= 1) { 46 47 if (mrb_get_args(mrb, "|o", &mesg) == 1) { 51 48 mrb_iv_set(mrb, exc, mrb_intern_lit(mrb, "mesg"), mesg); 52 49 } … … 72 69 mrb_value exc; 73 70 mrb_value a; 74 int argc;71 mrb_int argc; 75 72 76 73 argc = mrb_get_args(mrb, "|o", &a); … … 91 88 */ 92 89 93 staticmrb_value90 mrb_value 94 91 exc_to_s(mrb_state *mrb, mrb_value exc) 95 92 { … … 131 128 */ 132 129 133 static mrb_value 134 exc_inspect(mrb_state *mrb, mrb_value exc) 135 { 136 mrb_value str, mesg, file, line; 137 mrb_bool append_mesg; 138 const char *cname; 139 140 mesg = mrb_attr_get(mrb, exc, mrb_intern_lit(mrb, "mesg")); 141 file = mrb_attr_get(mrb, exc, mrb_intern_lit(mrb, "file")); 142 line = mrb_attr_get(mrb, exc, mrb_intern_lit(mrb, "line")); 143 144 append_mesg = !mrb_nil_p(mesg); 145 if (append_mesg) { 146 mesg = mrb_obj_as_string(mrb, mesg); 147 append_mesg = RSTRING_LEN(mesg) > 0; 148 } 149 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)) { 153 if (append_mesg) { 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; 130 mrb_value 131 mrb_exc_inspect(mrb_state *mrb, mrb_value exc) 132 { 133 mrb_value mesg = mrb_attr_get(mrb, exc, mrb_intern_lit(mrb, "mesg")); 134 mrb_value cname = mrb_mod_to_s(mrb, mrb_obj_value(mrb_obj_class(mrb, exc))); 135 mesg = mrb_obj_as_string(mrb, mesg); 136 return RSTRING_LEN(mesg) == 0 ? cname : mrb_format(mrb, "%v (%v)", mesg, cname); 164 137 } 165 138 … … 195 168 } 196 169 197 static void198 exc_debug_info(mrb_state *mrb, struct RObject *exc)199 {200 mrb_callinfo *ci = mrb->c->ci;201 mrb_code *pc = ci->pc;202 203 while (ci >= mrb->c->cibase) {204 mrb_code *err = ci->err;205 206 if (!err && pc) err = pc - 1;207 if (err && ci->proc && !MRB_PROC_CFUNC_P(ci->proc)) {208 mrb_irep *irep = ci->proc->body.irep;209 210 int32_t const line = mrb_debug_get_line(irep, (uint32_t)(err - irep->iseq));211 char const* file = mrb_debug_get_filename(irep, (uint32_t)(err - irep->iseq));212 if (line != -1 && file) {213 mrb_obj_iv_set(mrb, exc, mrb_intern_lit(mrb, "file"), mrb_str_new_cstr(mrb, file));214 mrb_obj_iv_set(mrb, exc, mrb_intern_lit(mrb, "line"), mrb_fixnum_value(line));215 return;216 }217 }218 pc = ci->pc;219 ci--;220 }221 }222 223 170 void 224 171 mrb_exc_set(mrb_state *mrb, mrb_value exc) … … 229 176 else { 230 177 mrb->exc = mrb_obj_ptr(exc); 231 if (!mrb->gc.out_of_memory) { 232 exc_debug_info(mrb, mrb->exc); 178 if (mrb->gc.arena_idx > 0 && 179 (struct RBasic*)mrb->exc == mrb->gc.arena[mrb->gc.arena_idx-1]) { 180 mrb->gc.arena_idx--; 181 } 182 if (!mrb->gc.out_of_memory && !mrb_frozen_p(mrb->exc)) { 233 183 mrb_keep_backtrace(mrb, exc); 234 184 } … … 239 189 mrb_exc_raise(mrb_state *mrb, mrb_value exc) 240 190 { 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); 191 if (mrb_break_p(exc)) { 192 mrb->exc = mrb_obj_ptr(exc); 193 } 194 else { 195 if (!mrb_obj_is_kind_of(mrb, exc, mrb->eException_class)) { 196 mrb_raise(mrb, E_TYPE_ERROR, "exception object expected"); 197 } 198 mrb_exc_set(mrb, exc); 199 } 245 200 if (!mrb->jmp) { 246 201 mrb_p(mrb, exc); … … 256 211 } 257 212 213 /* 214 * <code>vsprintf</code> like formatting. 215 * 216 * The syntax of a format sequence is as follows. 217 * 218 * %[modifier]specifier 219 * 220 * The modifiers are: 221 * 222 * ----------+------------------------------------------------------------ 223 * Modifier | Meaning 224 * ----------+------------------------------------------------------------ 225 * ! | Convert to string by corresponding `inspect` instead of 226 * | corresponding `to_s`. 227 * ----------+------------------------------------------------------------ 228 * 229 * The specifiers are: 230 * 231 * ----------+----------------+-------------------------------------------- 232 * Specifier | Argument Type | Note 233 * ----------+----------------+-------------------------------------------- 234 * c | char | 235 * d | int | 236 * f | mrb_float | 237 * i | mrb_int | 238 * l | char*, size_t | Arguments are string and length. 239 * n | mrb_sym | 240 * s | char* | Argument is NUL terminated string. 241 * t | mrb_value | Convert to type (class) of object. 242 * v,S | mrb_value | 243 * C | struct RClass* | 244 * T | mrb_value | Convert to real type (class) of object. 245 * Y | mrb_value | Same as `!v` if argument is `true`, `false` 246 * | | or `nil`, otherwise same as `T`. 247 * % | - | Convert to percent sign itself (no argument 248 * | | taken). 249 * ----------+----------------+-------------------------------------------- 250 */ 258 251 MRB_API mrb_value 259 252 mrb_vformat(mrb_state *mrb, const char *format, va_list ap) 260 253 { 261 const char *p = format; 262 const char *b = p; 263 ptrdiff_t size; 264 mrb_value ary = mrb_ary_new_capa(mrb, 4); 254 const char *chars, *p = format, *b = format, *e; 255 char ch; 256 size_t len; 257 mrb_int i; 258 struct RClass *cls; 259 mrb_bool inspect = FALSE; 260 mrb_value result = mrb_str_new_capa(mrb, 128), obj, str; 265 261 int ai = mrb_gc_arena_save(mrb); 266 262 267 263 while (*p) { 268 264 const char c = *p++; 269 265 e = p; 270 266 if (c == '%') { 271 if (*p == 'S') { 272 size = p - b - 1; 273 mrb_ary_push(mrb, ary, mrb_str_new(mrb, b, size)); 274 mrb_ary_push(mrb, ary, va_arg(ap, mrb_value)); 275 b = p + 1; 267 if (*p == '!') { 268 inspect = TRUE; 269 ++p; 276 270 } 271 if (!*p) break; 272 switch (*p) { 273 case 'c': 274 ch = (char)va_arg(ap, int); 275 chars = &ch; 276 len = 1; 277 goto L_cat; 278 case 'd': case 'i': 279 #if MRB_INT_MAX < INT_MAX 280 i = (mrb_int)va_arg(ap, int); 281 #else 282 i = *p == 'd' ? (mrb_int)va_arg(ap, int) : va_arg(ap, mrb_int); 283 #endif 284 obj = mrb_fixnum_value(i); 285 goto L_cat_obj; 286 #ifndef MRB_WITHOUT_FLOAT 287 case 'f': 288 obj = mrb_float_value(mrb, (mrb_float)va_arg(ap, double)); 289 goto L_cat_obj; 290 #endif 291 case 'l': 292 chars = va_arg(ap, char*); 293 len = va_arg(ap, size_t); 294 L_cat: 295 if (inspect) { 296 obj = mrb_str_new(mrb, chars, len); 297 goto L_cat_obj; 298 } 299 mrb_str_cat(mrb, result, b, e - b - 1); 300 mrb_str_cat(mrb, result, chars, len); 301 b = ++p; 302 mrb_gc_arena_restore(mrb, ai); 303 break; 304 case 'n': 305 #if UINT32_MAX < INT_MAX 306 obj = mrb_symbol_value((mrb_sym)va_arg(ap, int)); 307 #else 308 obj = mrb_symbol_value(va_arg(ap, mrb_sym)); 309 #endif 310 goto L_cat_obj; 311 case 's': 312 chars = va_arg(ap, char*); 313 len = strlen(chars); 314 goto L_cat; 315 case 't': 316 cls = mrb_class(mrb, va_arg(ap, mrb_value)); 317 goto L_cat_class; 318 case 'v': case 'S': 319 obj = va_arg(ap, mrb_value); 320 L_cat_obj: 321 str = (inspect ? mrb_inspect : mrb_obj_as_string)(mrb, obj); 322 chars = RSTRING_PTR(str); 323 len = RSTRING_LEN(str); 324 inspect = FALSE; 325 goto L_cat; 326 case 'C': 327 cls = va_arg(ap, struct RClass*); 328 L_cat_class: 329 obj = mrb_obj_value(cls); 330 goto L_cat_obj; 331 case 'T': 332 obj = va_arg(ap, mrb_value); 333 L_cat_real_class_of: 334 cls = mrb_obj_class(mrb, obj); 335 goto L_cat_class; 336 case 'Y': 337 obj = va_arg(ap, mrb_value); 338 if (!mrb_test(obj) || mrb_true_p(obj)) { 339 inspect = TRUE; 340 goto L_cat_obj; 341 } 342 else { 343 goto L_cat_real_class_of; 344 } 345 case '%': 346 L_cat_current: 347 chars = p; 348 len = 1; 349 goto L_cat; 350 default: 351 mrb_raisef(mrb, E_ARGUMENT_ERROR, "malformed format string - %%%c", *p); 352 } 277 353 } 278 354 else if (c == '\\') { 279 if (*p) { 280 size = p - b - 1; 281 mrb_ary_push(mrb, ary, mrb_str_new(mrb, b, size)); 282 mrb_ary_push(mrb, ary, mrb_str_new(mrb, p, 1)); 283 b = ++p; 284 } 285 else { 286 break; 287 } 288 } 289 mrb_gc_arena_restore(mrb, ai); 290 } 291 if (b == format) { 292 return mrb_str_new_cstr(mrb, format); 293 } 294 else { 295 size = p - b; 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()); 301 } 355 if (!*p) break; 356 goto L_cat_current; 357 358 } 359 } 360 361 mrb_str_cat(mrb, result, b, p - b); 362 return result; 302 363 } 303 364 … … 319 380 { 320 381 mrb_value mesg; 382 static int called = 0; 321 383 322 384 mesg = mrb_vformat(mrb, fmt, ap); … … 327 389 argv[0] = mesg; 328 390 } 391 if (called) 392 mrb_exc_raise(mrb, mrb_obj_value(mrb->stack_err)); 393 called = 1; 329 394 mrb_exc_raise(mrb, mrb_obj_new(mrb, c, argc+1, argv)); 330 395 } … … 363 428 fputs("warning: ", stderr); 364 429 fwrite(RSTRING_PTR(str), RSTRING_LEN(str), 1, stderr); 430 putc('\n', stderr); 365 431 va_end(ap); 366 432 #endif … … 384 450 385 451 MRB_API mrb_value 386 mrb_make_exception(mrb_state *mrb, int argc, const mrb_value *argv)452 mrb_make_exception(mrb_state *mrb, mrb_int argc, const mrb_value *argv) 387 453 { 388 454 mrb_value mesg; … … 420 486 break; 421 487 default: 422 mrb_ raisef(mrb, E_ARGUMENT_ERROR, "wrong number of arguments (%S for 0..3)", mrb_fixnum_value(argc));488 mrb_argnum_error(mrb, argc, 0, 3); 423 489 break; 424 490 } … … 470 536 } 471 537 538 MRB_API mrb_noreturn void 539 mrb_frozen_error(mrb_state *mrb, void *frozen_obj) 540 { 541 mrb_raisef(mrb, E_FROZEN_ERROR, "can't modify frozen %t", mrb_obj_value(frozen_obj)); 542 } 543 544 MRB_API mrb_noreturn void 545 mrb_argnum_error(mrb_state *mrb, mrb_int argc, int min, int max) 546 { 547 #define FMT(exp) "wrong number of arguments (given %i, expected " exp ")" 548 if (min == max) 549 mrb_raisef(mrb, E_ARGUMENT_ERROR, FMT("%d"), argc, min); 550 else if (max < 0) 551 mrb_raisef(mrb, E_ARGUMENT_ERROR, FMT("%d+"), argc, min); 552 else 553 mrb_raisef(mrb, E_ARGUMENT_ERROR, FMT("%d..%d"), argc, min, max); 554 #undef FMT 555 } 556 472 557 void 473 558 mrb_init_exception(mrb_state *mrb) … … 477 562 mrb->eException_class = exception = mrb_define_class(mrb, "Exception", mrb->object_class); /* 15.2.22 */ 478 563 MRB_SET_INSTANCE_TT(exception, MRB_TT_EXCEPTION); 479 mrb_define_class_method(mrb, exception, "exception", mrb_instance_new, MRB_ARGS_ ANY());480 mrb_define_method(mrb, exception, "exception", exc_exception, MRB_ARGS_ ANY());481 mrb_define_method(mrb, exception, "initialize", exc_initialize, MRB_ARGS_ ANY());564 mrb_define_class_method(mrb, exception, "exception", mrb_instance_new, MRB_ARGS_OPT(1)); 565 mrb_define_method(mrb, exception, "exception", exc_exception, MRB_ARGS_OPT(1)); 566 mrb_define_method(mrb, exception, "initialize", exc_initialize, MRB_ARGS_OPT(1)); 482 567 mrb_define_method(mrb, exception, "to_s", exc_to_s, MRB_ARGS_NONE()); 483 568 mrb_define_method(mrb, exception, "message", exc_message, MRB_ARGS_NONE()); 484 mrb_define_method(mrb, exception, "inspect", exc_inspect,MRB_ARGS_NONE());569 mrb_define_method(mrb, exception, "inspect", mrb_exc_inspect, MRB_ARGS_NONE()); 485 570 mrb_define_method(mrb, exception, "backtrace", mrb_exc_backtrace, MRB_ARGS_NONE()); 486 571 mrb_define_method(mrb, exception, "set_backtrace", exc_set_backtrace, MRB_ARGS_REQ(1)); -
EcnlProtoTool/trunk/mruby-2.1.1/src/etc.c
r331 r439 1 1 /* 2 ** etc.c -2 ** etc.c 3 3 ** 4 4 ** See Copyright Notice in mruby.h … … 9 9 #include <mruby/data.h> 10 10 #include <mruby/class.h> 11 #include <mruby/re.h>12 #include <mruby/irep.h>13 11 14 12 MRB_API struct RData* … … 27 25 mrb_data_check_type(mrb_state *mrb, mrb_value obj, const mrb_data_type *type) 28 26 { 29 if ( mrb_type(obj) != MRB_TT_DATA) {27 if (!mrb_data_p(obj)) { 30 28 mrb_check_type(mrb, obj, MRB_TT_DATA); 31 29 } … … 34 32 35 33 if (t2) { 36 mrb_raisef(mrb, E_TYPE_ERROR, "wrong argument type % S (expected %S)",37 mrb_str_new_cstr(mrb, t2->struct_name), mrb_str_new_cstr(mrb, type->struct_name));34 mrb_raisef(mrb, E_TYPE_ERROR, "wrong argument type %s (expected %s)", 35 t2->struct_name, type->struct_name); 38 36 } 39 37 else { 40 struct RClass *c = mrb_class(mrb, obj); 41 42 mrb_raisef(mrb, E_TYPE_ERROR, "uninitialized %S (expected %S)", 43 mrb_obj_value(c), mrb_str_new_cstr(mrb, type->struct_name)); 38 mrb_raisef(mrb, E_TYPE_ERROR, "uninitialized %t (expected %s)", 39 obj, type->struct_name); 44 40 } 45 41 } … … 49 45 mrb_data_check_get_ptr(mrb_state *mrb, mrb_value obj, const mrb_data_type *type) 50 46 { 51 if ( mrb_type(obj) != MRB_TT_DATA) {47 if (!mrb_data_p(obj)) { 52 48 return NULL; 53 49 } … … 68 64 mrb_obj_to_sym(mrb_state *mrb, mrb_value name) 69 65 { 70 mrb_sym id; 71 72 switch (mrb_type(name)) { 73 default: 74 name = mrb_check_string_type(mrb, name); 75 if (mrb_nil_p(name)) { 76 name = mrb_inspect(mrb, name); 77 mrb_raisef(mrb, E_TYPE_ERROR, "%S is not a symbol", name); 78 } 79 /* fall through */ 80 case MRB_TT_STRING: 81 name = mrb_str_intern(mrb, name); 82 /* fall through */ 83 case MRB_TT_SYMBOL: 84 id = mrb_symbol(name); 85 } 86 return id; 66 if (mrb_symbol_p(name)) return mrb_symbol(name); 67 if (mrb_string_p(name)) return mrb_intern_str(mrb, name); 68 mrb_raisef(mrb, E_TYPE_ERROR, "%!v is not a symbol nor a string", name); 69 return 0; /* not reached */ 87 70 } 88 71 89 72 MRB_API mrb_int 73 #ifdef MRB_WITHOUT_FLOAT 74 mrb_fixnum_id(mrb_int f) 75 #else 90 76 mrb_float_id(mrb_float f) 77 #endif 91 78 { 92 79 const char *p = (const char*)&f; 93 80 int len = sizeof(f); 94 mrb_int id = 0; 95 81 uint32_t id = 0; 82 83 #ifndef MRB_WITHOUT_FLOAT 84 /* normalize -0.0 to 0.0 */ 85 if (f == 0) f = 0.0; 86 #endif 96 87 while (len--) { 97 88 id = id*65599 + *p; … … 100 91 id = id + (id>>5); 101 92 102 return id;93 return (mrb_int)id; 103 94 } 104 95 … … 124 115 return MakeID(mrb_symbol(obj)); 125 116 case MRB_TT_FIXNUM: 117 #ifdef MRB_WITHOUT_FLOAT 118 return MakeID(mrb_fixnum_id(mrb_fixnum(obj))); 119 #else 126 120 return MakeID2(mrb_float_id((mrb_float)mrb_fixnum(obj)), MRB_TT_FLOAT); 127 121 case MRB_TT_FLOAT: 128 122 return MakeID(mrb_float_id(mrb_float(obj))); 123 #endif 129 124 case MRB_TT_STRING: 130 125 case MRB_TT_OBJECT: … … 147 142 148 143 #ifdef MRB_WORD_BOXING 144 #ifndef MRB_WITHOUT_FLOAT 149 145 MRB_API mrb_value 150 146 mrb_word_boxing_float_value(mrb_state *mrb, mrb_float f) … … 154 150 v.value.p = mrb_obj_alloc(mrb, MRB_TT_FLOAT, mrb->float_class); 155 151 v.value.fp->f = f; 152 MRB_SET_FROZEN_FLAG(v.value.bp); 156 153 return v; 157 154 } … … 164 161 nf->c = mrb->float_class; 165 162 nf->f = f; 163 MRB_SET_FROZEN_FLAG(nf); 166 164 return mrb_obj_value(nf); 167 165 } 166 #endif /* MRB_WITHOUT_FLOAT */ 168 167 169 168 MRB_API mrb_value … … 177 176 } 178 177 #endif /* MRB_WORD_BOXING */ 179 180 MRB_API mrb_bool181 mrb_regexp_p(mrb_state *mrb, mrb_value v)182 {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;195 }196 178 197 179 #if defined _MSC_VER && _MSC_VER < 1900 -
EcnlProtoTool/trunk/mruby-2.1.1/src/fmt_fp.c
r331 r439 1 #ifndef MRB_WITHOUT_FLOAT 2 #if defined(MRB_DISABLE_STDIO) || defined(_WIN32) || defined(_WIN64) 1 3 /* 2 4 … … 29 31 #include <limits.h> 30 32 #include <string.h> 31 #include <stdint.h>32 33 #include <math.h> 33 34 #include <float.h> … … 62 63 #define PAD_SIZE 256 63 64 static void 64 pad(struct fmt_args *f, char c, int w, int l, int fl)65 pad(struct fmt_args *f, char c, ptrdiff_t w, ptrdiff_t l, uint8_t fl) 65 66 { 66 67 char pad[PAD_SIZE]; … … 92 93 93 94 static int 94 fmt_fp(struct fmt_args *f, long double y, int w, int p, int fl, int t)95 fmt_fp(struct fmt_args *f, long double y, ptrdiff_t p, uint8_t fl, int t) 95 96 { 96 97 uint32_t big[(LDBL_MANT_DIG+28)/29 + 1 // mantissa expansion … … 98 99 uint32_t *a, *d, *r, *z; 99 100 uint32_t i; 100 int e2=0, e, j, l; 101 int e2=0, e, j; 102 ptrdiff_t l; 101 103 char buf[9+LDBL_MANT_DIG/4], *s; 102 104 const char *prefix="-0X+0X 0X-0x+0x 0x"; 103 int pl;105 ptrdiff_t pl; 104 106 char ebuf0[3*sizeof(int)], *ebuf=&ebuf0[3*sizeof(int)], *estr; 105 107 … … 116 118 const char *ss = (t&32)?"inf":"INF"; 117 119 if (y!=y) ss=(t&32)?"nan":"NAN"; 118 pad(f, ' ', w, 3+pl, fl&~ZERO_PAD);120 pad(f, ' ', 0, 3+pl, fl&~ZERO_PAD); 119 121 out(f, prefix, pl); 120 122 out(f, ss, 3); 121 pad(f, ' ', w, 3+pl, fl^LEFT_ADJ);122 return MAX(w, 3+pl);123 pad(f, ' ', 0, 3+pl, fl^LEFT_ADJ); 124 return 3+(int)pl; 123 125 } 124 126 … … 128 130 if ((t|32)=='a') { 129 131 long double round = 8.0; 130 int re;132 ptrdiff_t re; 131 133 132 134 if (t&32) prefix += 9; … … 168 170 l = (s-buf) + (ebuf-estr); 169 171 170 pad(f, ' ', w, pl+l, fl);172 pad(f, ' ', 0, pl+l, fl); 171 173 out(f, prefix, pl); 172 pad(f, '0', w, pl+l, fl^ZERO_PAD);174 pad(f, '0', 0, pl+l, fl^ZERO_PAD); 173 175 out(f, buf, s-buf); 174 176 pad(f, '0', l-(ebuf-estr)-(s-buf), 0, 0); 175 177 out(f, estr, ebuf-estr); 176 pad(f, ' ', w, pl+l, fl^LEFT_ADJ);177 return MAX(w, pl+l);178 pad(f, ' ', 0, pl+l, fl^LEFT_ADJ); 179 return (int)pl+(int)l; 178 180 } 179 181 if (p<0) p=6; … … 203 205 while (e2<0) { 204 206 uint32_t carry=0, *b; 205 int sh=MIN(9,-e2), need=1+( p+LDBL_MANT_DIG/3+8)/9;207 int sh=MIN(9,-e2), need=1+((int)p+LDBL_MANT_DIG/3+8)/9; 206 208 for (d=a; d<z; d++) { 207 209 uint32_t rm = *d & ((1<<sh)-1); … … 217 219 } 218 220 219 if (a<z) for (i=10, e=9*( r-a); *a>=i; i*=10, e++);221 if (a<z) for (i=10, e=9*(int)(r-a); *a>=i; i*=10, e++); 220 222 else e=0; 221 223 222 224 /* Perform rounding: j is precision after the radix (possibly neg) */ 223 j = p - ((t|32)!='f')*e - ((t|32)=='g' && p);225 j = (int)p - ((t|32)!='f')*e - ((t|32)=='g' && p); 224 226 if (j < 9*(z-r-1)) { 225 227 uint32_t x; … … 248 250 (*d)++; 249 251 } 250 for (i=10, e=9*( r-a); *a>=i; i*=10, e++);252 for (i=10, e=9*(int)(r-a); *a>=i; i*=10, e++); 251 253 } 252 254 } … … 287 289 } 288 290 289 pad(f, ' ', w, pl+l, fl);291 pad(f, ' ', 0, pl+l, fl); 290 292 out(f, prefix, pl); 291 pad(f, '0', w, pl+l, fl^ZERO_PAD);293 pad(f, '0', 0, pl+l, fl^ZERO_PAD); 292 294 293 295 if ((t|32)=='f') { … … 318 320 } 319 321 out(f, ss, MIN(buf+9-ss, p)); 320 p -= buf+9-ss;322 p -= (int)(buf+9-ss); 321 323 } 322 324 pad(f, '0', p+18, 18, 0); … … 324 326 } 325 327 326 pad(f, ' ', w, pl+l, fl^LEFT_ADJ);327 328 return MAX(w, pl+l);328 pad(f, ' ', 0, pl+l, fl^LEFT_ADJ); 329 330 return (int)pl+(int)l; 329 331 } 330 332 … … 332 334 fmt_core(struct fmt_args *f, const char *fmt, mrb_float flo) 333 335 { 334 int p;336 ptrdiff_t p; 335 337 336 338 if (*fmt != '%') { … … 352 354 case 'e': case 'f': case 'g': case 'a': 353 355 case 'E': case 'F': case 'G': case 'A': 354 return fmt_fp(f, flo, 0,p, 0, *fmt);356 return fmt_fp(f, flo, p, 0, *fmt); 355 357 default: 356 358 return -1; … … 364 366 365 367 f.mrb = mrb; 366 f.str = mrb_str_ buf_new(mrb, 24);368 f.str = mrb_str_new_capa(mrb, 24); 367 369 if (fmt_core(&f, fmt, mrb_float(flo)) < 0) { 368 370 mrb_raise(mrb, E_ARGUMENT_ERROR, "invalid format string"); … … 370 372 return f.str; 371 373 } 374 #else /* MRB_DISABLE_STDIO || _WIN32 || _WIN64 */ 375 #include <mruby.h> 376 #include <stdio.h> 377 378 mrb_value 379 mrb_float_to_str(mrb_state *mrb, mrb_value flo, const char *fmt) 380 { 381 char buf[25]; 382 383 snprintf(buf, sizeof(buf), fmt, mrb_float(flo)); 384 return mrb_str_new_cstr(mrb, buf); 385 } 386 #endif /* MRB_DISABLE_STDIO || _WIN32 || _WIN64 */ 387 #endif -
EcnlProtoTool/trunk/mruby-2.1.1/src/gc.c
r331 r439 11 11 #include <mruby/class.h> 12 12 #include <mruby/data.h> 13 #include <mruby/istruct.h> 13 14 #include <mruby/hash.h> 14 15 #include <mruby/proc.h> … … 110 111 struct RRange range; 111 112 struct RData data; 113 struct RIStruct istruct; 112 114 struct RProc proc; 113 115 struct REnv env; 116 struct RFiber fiber; 114 117 struct RException exc; 115 118 struct RBreak brk; 116 119 #ifdef MRB_WORD_BOXING 120 #ifndef MRB_WITHOUT_FLOAT 117 121 struct RFloat floatv; 122 #endif 118 123 struct RCptr cptr; 119 124 #endif … … 176 181 #define GC_STEP_SIZE 1024 177 182 178 /* white: 0 11, black: 100, gray: 000 */183 /* white: 001 or 010, black: 100, gray: 000 */ 179 184 #define GC_GRAY 0 180 185 #define GC_WHITE_A 1 … … 273 278 } 274 279 280 MRB_API void* 281 mrb_alloca(mrb_state *mrb, size_t size) 282 { 283 struct RString *s; 284 s = (struct RString*)mrb_obj_alloc(mrb, MRB_TT_STRING, mrb->string_class); 285 return s->as.heap.ptr = (char*)mrb_malloc(mrb, size); 286 } 287 288 static mrb_bool 289 heap_p(mrb_gc *gc, struct RBasic *object) 290 { 291 mrb_heap_page* page; 292 293 page = gc->heaps; 294 while (page) { 295 RVALUE *p; 296 297 p = objects(page); 298 if (&p[0].as.basic <= object && object <= &p[MRB_HEAP_PAGE_SIZE].as.basic) { 299 return TRUE; 300 } 301 page = page->next; 302 } 303 return FALSE; 304 } 305 275 306 MRB_API mrb_bool 276 307 mrb_object_dead_p(mrb_state *mrb, struct RBasic *object) { 277 return is_dead(&mrb->gc, object); 308 mrb_gc *gc = &mrb->gc; 309 if (!heap_p(gc, object)) return TRUE; 310 return is_dead(gc, object); 278 311 } 279 312 … … 343 376 #define DEFAULT_GC_INTERVAL_RATIO 200 344 377 #define DEFAULT_GC_STEP_RATIO 200 345 #define DEFAULT_MAJOR_GC_INC_RATIO 200 378 #define MAJOR_GC_INC_RATIO 120 379 #define MAJOR_GC_TOOMANY 10000 346 380 #define is_generational(gc) ((gc)->generational) 347 381 #define is_major_gc(gc) (is_generational(gc) && (gc)->full) … … 374 408 static void obj_free(mrb_state *mrb, struct RBasic *obj, int end); 375 409 376 void410 static void 377 411 free_heap(mrb_state *mrb, mrb_gc *gc) 378 412 { … … 413 447 if (gc->arena_idx >= gc->arena_capa) { 414 448 /* extend arena */ 415 gc->arena_capa = (int)(gc->arena_capa * 1.5);449 gc->arena_capa = (int)(gc->arena_capa * 3 / 2); 416 450 gc->arena = (struct RBasic**)mrb_realloc(mrb, gc->arena, sizeof(struct RBasic*)*gc->arena_capa); 417 451 } … … 441 475 mrb_gc_register(mrb_state *mrb, mrb_value obj) 442 476 { 443 mrb_sym root = mrb_intern_lit(mrb, GC_ROOT_NAME); 444 mrb_value table = mrb_gv_get(mrb, root); 445 446 if (mrb_nil_p(table) || mrb_type(table) != MRB_TT_ARRAY) { 477 mrb_sym root; 478 mrb_value table; 479 480 if (mrb_immediate_p(obj)) return; 481 root = mrb_intern_lit(mrb, GC_ROOT_NAME); 482 table = mrb_gv_get(mrb, root); 483 if (mrb_nil_p(table) || !mrb_array_p(table)) { 447 484 table = mrb_ary_new(mrb); 448 485 mrb_gv_set(mrb, root, table); … … 455 492 mrb_gc_unregister(mrb_state *mrb, mrb_value obj) 456 493 { 457 mrb_sym root = mrb_intern_lit(mrb, GC_ROOT_NAME);458 mrb_value table = mrb_gv_get(mrb, root);494 mrb_sym root; 495 mrb_value table; 459 496 struct RArray *a; 460 497 mrb_int i; 461 498 499 if (mrb_immediate_p(obj)) return; 500 root = mrb_intern_lit(mrb, GC_ROOT_NAME); 501 table = mrb_gv_get(mrb, root); 462 502 if (mrb_nil_p(table)) return; 463 if ( mrb_type(table) != MRB_TT_ARRAY) {503 if (!mrb_array_p(table)) { 464 504 mrb_gv_set(mrb, root, mrb_nil_value()); 465 505 return; … … 467 507 a = mrb_ary_ptr(table); 468 508 mrb_ary_modify(mrb, a); 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])); 509 for (i = 0; i < ARY_LEN(a); i++) { 510 if (mrb_ptr(ARY_PTR(a)[i]) == mrb_ptr(obj)) { 511 mrb_int len = ARY_LEN(a)-1; 512 mrb_value *ptr = ARY_PTR(a); 513 514 ARY_SET_LEN(a, len); 515 memmove(&ptr[i], &ptr[i + 1], (len - i) * sizeof(mrb_value)); 473 516 break; 474 517 } … … 480 523 { 481 524 struct RBasic *p; 482 static const RVALUE RVALUE_zero = { { { MRB_TT_FALSE } } };525 static const RVALUE RVALUE_zero = { { { NULL, NULL, MRB_TT_FALSE } } }; 483 526 mrb_gc *gc = &mrb->gc; 484 527 … … 501 544 ttype != MRB_TT_ENV && 502 545 ttype != tt) { 503 mrb_raisef(mrb, E_TYPE_ERROR, "allocation failure of % S", mrb_obj_value(cls));546 mrb_raisef(mrb, E_TYPE_ERROR, "allocation failure of %C", cls); 504 547 } 505 548 } … … 543 586 } 544 587 588 static int 589 ci_nregs(mrb_callinfo *ci) 590 { 591 struct RProc *p = ci->proc; 592 int n = 0; 593 594 if (!p) { 595 if (ci->argc < 0) return 3; 596 return ci->argc+2; 597 } 598 if (!MRB_PROC_CFUNC_P(p) && p->body.irep) { 599 n = p->body.irep->nregs; 600 } 601 if (ci->argc < 0) { 602 if (n < 3) n = 3; /* self + args + blk */ 603 } 604 if (ci->argc > n) { 605 n = ci->argc + 2; /* self + blk */ 606 } 607 return n; 608 } 609 545 610 static void 546 611 mark_context_stack(mrb_state *mrb, struct mrb_context *c) … … 549 614 size_t e; 550 615 mrb_value nil; 551 int nregs;552 616 553 617 if (c->stack == NULL) return; 554 618 e = c->stack - c->stbase; 555 619 if (c->ci) { 556 nregs = c->ci->argc + 2; 557 if (c->ci->nregs > nregs) 558 nregs = c->ci->nregs; 559 e += nregs; 620 e += ci_nregs(c->ci); 560 621 } 561 622 if (c->stbase + e > c->stend) e = c->stend - c->stbase; … … 579 640 int i; 580 641 mrb_callinfo *ci; 642 643 start: 644 if (c->status == MRB_FIBER_TERMINATED) return; 581 645 582 646 /* mark VM stack */ … … 592 656 } 593 657 /* mark ensure stack */ 594 for (i=0; i<c->esize; i++) { 595 if (c->ensure[i] == NULL) break; 658 for (i=0; i<c->eidx; i++) { 596 659 mrb_gc_mark(mrb, (struct RBasic*)c->ensure[i]); 597 660 } … … 599 662 mrb_gc_mark(mrb, (struct RBasic*)c->fib); 600 663 if (c->prev) { 601 mark_context(mrb, c->prev); 664 c = c->prev; 665 goto start; 602 666 } 603 667 } … … 614 678 { 615 679 struct RClass *c = (struct RClass*)obj; 616 if (MRB_FLAG_TEST(c, MRB_FL AG_IS_ORIGIN))680 if (MRB_FLAG_TEST(c, MRB_FL_CLASS_IS_ORIGIN)) 617 681 mrb_gc_mark_mt(mrb, c); 618 682 mrb_gc_mark(mrb, (struct RBasic*)((struct RClass*)obj)->super); … … 641 705 struct RProc *p = (struct RProc*)obj; 642 706 643 mrb_gc_mark(mrb, (struct RBasic*)p-> env);644 mrb_gc_mark(mrb, (struct RBasic*)p-> target_class);707 mrb_gc_mark(mrb, (struct RBasic*)p->upper); 708 mrb_gc_mark(mrb, (struct RBasic*)p->e.env); 645 709 } 646 710 break; … … 651 715 mrb_int i, len; 652 716 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); 656 } 657 break; 717 if (MRB_ENV_STACK_SHARED_P(e) && e->cxt && e->cxt->fib) { 718 mrb_gc_mark(mrb, (struct RBasic*)e->cxt->fib); 658 719 } 659 720 len = MRB_ENV_STACK_LEN(e); … … 677 738 size_t i, e; 678 739 679 for (i=0,e= a->len; i<e; i++) {680 mrb_gc_mark_value(mrb, a->ptr[i]);740 for (i=0,e=ARY_LEN(a); i<e; i++) { 741 mrb_gc_mark_value(mrb, ARY_PTR(a)[i]); 681 742 } 682 743 } … … 689 750 690 751 case MRB_TT_STRING: 752 if (RSTR_FSHARED_P(obj)) { 753 struct RString *s = (struct RString*)obj; 754 mrb_gc_mark(mrb, (struct RBasic*)s->as.heap.aux.fshared); 755 } 691 756 break; 692 757 693 758 case MRB_TT_RANGE: 694 { 695 struct RRange *r = (struct RRange*)obj; 696 697 if (r->edges) { 698 mrb_gc_mark_value(mrb, r->edges->beg); 699 mrb_gc_mark_value(mrb, r->edges->end); 700 } 701 } 759 mrb_gc_mark_range(mrb, (struct RRange*)obj); 702 760 break; 703 761 … … 728 786 return; 729 787 788 #ifndef MRB_WITHOUT_FLOAT 730 789 case MRB_TT_FLOAT: 731 790 #ifdef MRB_WORD_BOXING … … 733 792 #else 734 793 return; 794 #endif 735 795 #endif 736 796 … … 748 808 mrb_gc_free_mt(mrb, (struct RClass*)obj); 749 809 mrb_gc_free_iv(mrb, (struct RObject*)obj); 810 mrb_mc_clear_by_class(mrb, (struct RClass*)obj); 750 811 break; 751 812 case MRB_TT_ICLASS: 752 if (MRB_FLAG_TEST(obj, MRB_FL AG_IS_ORIGIN))813 if (MRB_FLAG_TEST(obj, MRB_FL_CLASS_IS_ORIGIN)) 753 814 mrb_gc_free_mt(mrb, (struct RClass*)obj); 815 mrb_mc_clear_by_class(mrb, (struct RClass*)obj); 754 816 break; 755 817 case MRB_TT_ENV: … … 759 821 if (MRB_ENV_STACK_SHARED_P(e)) { 760 822 /* cannot be freed */ 761 return; 823 e->stack = NULL; 824 break; 762 825 } 763 826 mrb_free(mrb, e->stack); … … 770 833 struct mrb_context *c = ((struct RFiber*)obj)->cxt; 771 834 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); 835 if (c && c != mrb->root_c) { 836 if (!end && c->status != MRB_FIBER_TERMINATED) { 837 mrb_callinfo *ci = c->ci; 838 mrb_callinfo *ce = c->cibase; 839 840 while (ce <= ci) { 841 struct REnv *e = ci->env; 842 if (e && !mrb_object_dead_p(mrb, (struct RBasic*)e) && 843 e->tt == MRB_TT_ENV && MRB_ENV_STACK_SHARED_P(e)) { 844 mrb_env_unshare(mrb, e); 845 } 846 ci--; 781 847 } 782 ci--;783 848 } 784 849 mrb_free_context(mrb, c); … … 789 854 case MRB_TT_ARRAY: 790 855 if (ARY_SHARED_P(obj)) 791 mrb_ary_decref(mrb, ((struct RArray*)obj)->a ux.shared);792 else 793 mrb_free(mrb, ((struct RArray*)obj)-> ptr);856 mrb_ary_decref(mrb, ((struct RArray*)obj)->as.heap.aux.shared); 857 else if (!ARY_EMBED_P(obj)) 858 mrb_free(mrb, ((struct RArray*)obj)->as.heap.ptr); 794 859 break; 795 860 … … 808 873 809 874 if (!MRB_PROC_CFUNC_P(p) && p->body.irep) { 810 mrb_irep_decref(mrb, p->body.irep); 875 mrb_irep *irep = p->body.irep; 876 if (end) { 877 mrb_irep_cutref(mrb, irep); 878 } 879 mrb_irep_decref(mrb, irep); 811 880 } 812 881 } … … 814 883 815 884 case MRB_TT_RANGE: 816 mrb_ free(mrb, ((struct RRange*)obj)->edges);885 mrb_gc_free_range(mrb, ((struct RRange*)obj)); 817 886 break; 818 887 … … 858 927 mrb_gc_mark(mrb, (struct RBasic*)mrb->array_class); 859 928 mrb_gc_mark(mrb, (struct RBasic*)mrb->hash_class); 860 929 mrb_gc_mark(mrb, (struct RBasic*)mrb->range_class); 930 931 #ifndef MRB_WITHOUT_FLOAT 861 932 mrb_gc_mark(mrb, (struct RBasic*)mrb->float_class); 933 #endif 862 934 mrb_gc_mark(mrb, (struct RBasic*)mrb->fixnum_class); 863 935 mrb_gc_mark(mrb, (struct RBasic*)mrb->true_class); … … 918 990 919 991 case MRB_TT_ENV: 920 children += (int)obj->flags;992 children += MRB_ENV_STACK_LEN(obj); 921 993 break; 922 994 … … 927 999 mrb_callinfo *ci; 928 1000 929 if (!c) break; 1001 if (!c || c->status == MRB_FIBER_TERMINATED) break; 1002 930 1003 /* mark stack */ 931 1004 i = c->stack - c->stbase; 932 if (c->ci) i += c->ci->nregs; 1005 1006 if (c->ci) { 1007 i += ci_nregs(c->ci); 1008 } 933 1009 if (c->stbase + i > c->stend) i = c->stend - c->stbase; 934 1010 children += i; … … 949 1025 { 950 1026 struct RArray *a = (struct RArray*)obj; 951 children += a->len;1027 children += ARY_LEN(a); 952 1028 } 953 1029 break; … … 1190 1266 1191 1267 if (is_major_gc(gc)) { 1192 gc->majorgc_old_threshold = gc->live_after_mark/100 * DEFAULT_MAJOR_GC_INC_RATIO; 1268 size_t threshold = gc->live_after_mark/100 * MAJOR_GC_INC_RATIO; 1269 1193 1270 gc->full = FALSE; 1271 if (threshold < MAJOR_GC_TOOMANY) { 1272 gc->majorgc_old_threshold = threshold; 1273 } 1274 else { 1275 /* too many objects allocated during incremental GC, */ 1276 /* instead of increasing threshold, invoke full GC. */ 1277 mrb_full_gc(mrb); 1278 } 1194 1279 } 1195 1280 else if (is_minor_gc(gc)) { … … 1229 1314 1230 1315 if (is_generational(gc)) { 1231 gc->majorgc_old_threshold = gc->live_after_mark/100 * DEFAULT_MAJOR_GC_INC_RATIO;1316 gc->majorgc_old_threshold = gc->live_after_mark/100 * MAJOR_GC_INC_RATIO; 1232 1317 gc->full = FALSE; 1233 1318 } … … 1240 1325 { 1241 1326 mrb_full_gc(mrb); 1242 }1243 1244 MRB_API int1245 mrb_gc_arena_save(mrb_state *mrb)1246 {1247 return mrb->gc.arena_idx;1248 }1249 1250 MRB_API void1251 mrb_gc_arena_restore(mrb_state *mrb, int idx)1252 {1253 mrb_gc *gc = &mrb->gc;1254 1255 #ifndef MRB_GC_FIXED_ARENA1256 int capa = gc->arena_capa;1257 1258 if (idx < capa / 2) {1259 capa = (int)(capa * 0.66);1260 if (capa < MRB_GC_ARENA_SIZE) {1261 capa = MRB_GC_ARENA_SIZE;1262 }1263 if (capa != gc->arena_capa) {1264 gc->arena = (struct RBasic**)mrb_realloc(mrb, gc->arena, sizeof(struct RBasic*)*capa);1265 gc->arena_capa = capa;1266 }1267 }1268 #endif1269 gc->arena_idx = idx;1270 1327 } 1271 1328 … … 1407 1464 1408 1465 mrb_get_args(mrb, "i", &ratio); 1409 mrb->gc.interval_ratio = ratio;1466 mrb->gc.interval_ratio = (int)ratio; 1410 1467 return mrb_nil_value(); 1411 1468 } … … 1440 1497 1441 1498 mrb_get_args(mrb, "i", &ratio); 1442 mrb->gc.step_ratio = ratio;1499 mrb->gc.step_ratio = (int)ratio; 1443 1500 return mrb_nil_value(); 1444 1501 } … … 1458 1515 else if (!is_generational(gc) && enable) { 1459 1516 incremental_gc_until(mrb, gc, MRB_GC_STATE_ROOT); 1460 gc->majorgc_old_threshold = gc->live_after_mark/100 * DEFAULT_MAJOR_GC_INC_RATIO;1517 gc->majorgc_old_threshold = gc->live_after_mark/100 * MAJOR_GC_INC_RATIO; 1461 1518 gc->full = FALSE; 1462 1519 } … … 1523 1580 mrb_bool iterating = mrb->gc.iterating; 1524 1581 1582 mrb_full_gc(mrb); 1525 1583 mrb->gc.iterating = TRUE; 1526 1584 if (iterating) { … … 1535 1593 gc_each_objects(mrb, &mrb->gc, callback, data); 1536 1594 mrb->jmp = prev_jmp; 1537 mrb->gc.iterating = iterating; 1595 mrb->gc.iterating = iterating; 1538 1596 } MRB_CATCH(&c_jmp) { 1539 1597 mrb->gc.iterating = iterating; … … 1554 1612 { 1555 1613 struct RClass *gc; 1614 1615 mrb_static_assert(sizeof(RVALUE) <= sizeof(void*) * 6, 1616 "RVALUE size must be within 6 words"); 1556 1617 1557 1618 gc = mrb_define_module(mrb, "GC"); -
EcnlProtoTool/trunk/mruby-2.1.1/src/hash.c
r331 r439 9 9 #include <mruby/class.h> 10 10 #include <mruby/hash.h> 11 #include <mruby/khash.h>12 11 #include <mruby/string.h> 13 12 #include <mruby/variable.h> 14 13 14 #ifndef MRB_WITHOUT_FLOAT 15 15 /* a function to get hash value of a float number */ 16 16 mrb_int mrb_float_id(mrb_float f); 17 18 static inline khint_t 19 mrb_hash_ht_hash_func(mrb_state *mrb, mrb_value key) 20 { 21 enum mrb_vtype t = mrb_type(key); 17 #endif 18 19 #ifndef MRB_HT_INIT_SIZE 20 #define MRB_HT_INIT_SIZE 4 21 #endif 22 #define HT_SEG_INCREASE_RATIO 6 / 5 23 24 struct segkv { 25 mrb_value key; 26 mrb_value val; 27 }; 28 29 typedef struct segment { 30 uint16_t size; 31 struct segment *next; 32 struct segkv e[]; 33 } segment; 34 35 typedef struct segindex { 36 size_t size; 37 size_t capa; 38 struct segkv *table[]; 39 } segindex; 40 41 /* hash table structure */ 42 typedef struct htable { 43 segment *rootseg; 44 segment *lastseg; 45 mrb_int size; 46 uint16_t last_len; 47 segindex *index; 48 } htable; 49 50 static /* inline */ size_t 51 ht_hash_func(mrb_state *mrb, htable *t, mrb_value key) 52 { 53 enum mrb_vtype tt = mrb_type(key); 22 54 mrb_value hv; 23 const char *p;24 mrb_int i, len;25 khint_t h;26 27 switch (t ) {55 size_t h; 56 segindex *index = t->index; 57 size_t capa = index ? index->capa : 0; 58 59 switch (tt) { 28 60 case MRB_TT_STRING: 29 p = RSTRING_PTR(key); 30 len = RSTRING_LEN(key); 31 h = 0; 32 for (i=0; i<len; i++) { 33 h = (h << 5) - h + *p++; 34 } 35 return h; 36 61 h = mrb_str_hash(mrb, key); 62 break; 63 64 case MRB_TT_TRUE: 65 case MRB_TT_FALSE: 37 66 case MRB_TT_SYMBOL: 38 h = (khint_t)mrb_symbol(key);39 return kh_int_hash_func(mrb, h);40 41 67 case MRB_TT_FIXNUM: 42 h = (khint_t)mrb_float_id((mrb_float)mrb_fixnum(key)); 43 return kh_int_hash_func(mrb, h); 44 68 #ifndef MRB_WITHOUT_FLOAT 45 69 case MRB_TT_FLOAT: 46 h = (khint_t)mrb_float_id(mrb_float(key)); 47 return kh_int_hash_func(mrb, h); 70 #endif 71 h = (size_t)mrb_obj_id(key); 72 break; 48 73 49 74 default: 50 75 hv = mrb_funcall(mrb, key, "hash", 0); 51 h = (khint_t)t ^ mrb_fixnum(hv); 52 return kh_int_hash_func(mrb, h); 53 } 54 } 55 56 static inline khint_t 57 mrb_hash_ht_hash_equal(mrb_state *mrb, mrb_value a, mrb_value b) 58 { 59 enum mrb_vtype t = mrb_type(a); 60 61 switch (t) { 76 h = (size_t)t ^ (size_t)mrb_fixnum(hv); 77 break; 78 } 79 if (index && (index != t->index || capa != index->capa)) { 80 mrb_raise(mrb, E_RUNTIME_ERROR, "hash modified"); 81 } 82 return ((h)^((h)<<2)^((h)>>2)); 83 } 84 85 static inline mrb_bool 86 ht_hash_equal(mrb_state *mrb, htable *t, mrb_value a, mrb_value b) 87 { 88 enum mrb_vtype tt = mrb_type(a); 89 90 switch (tt) { 62 91 case MRB_TT_STRING: 63 92 return mrb_str_equal(mrb, a, b); 64 93 65 94 case MRB_TT_SYMBOL: 66 if ( mrb_type(b) != MRB_TT_SYMBOL) return FALSE;95 if (!mrb_symbol_p(b)) return FALSE; 67 96 return mrb_symbol(a) == mrb_symbol(b); 68 97 … … 71 100 case MRB_TT_FIXNUM: 72 101 return mrb_fixnum(a) == mrb_fixnum(b); 102 #ifndef MRB_WITHOUT_FLOAT 73 103 case MRB_TT_FLOAT: 74 104 return (mrb_float)mrb_fixnum(a) == mrb_float(b); 105 #endif 75 106 default: 76 107 return FALSE; 77 108 } 78 109 110 #ifndef MRB_WITHOUT_FLOAT 79 111 case MRB_TT_FLOAT: 80 112 switch (mrb_type(b)) { … … 86 118 return FALSE; 87 119 } 120 #endif 88 121 89 122 default: 90 return mrb_eql(mrb, a, b); 91 } 92 } 93 94 KHASH_DEFINE (ht, mrb_value, mrb_hash_value, TRUE, mrb_hash_ht_hash_func, mrb_hash_ht_hash_equal) 123 { 124 segindex *index = t->index; 125 size_t capa = index ? index->capa : 0; 126 mrb_bool eql = mrb_eql(mrb, a, b); 127 if (index && (index != t->index || capa != index->capa)) { 128 mrb_raise(mrb, E_RUNTIME_ERROR, "hash modified"); 129 } 130 return eql; 131 } 132 } 133 } 134 135 /* Creates the hash table. */ 136 static htable* 137 ht_new(mrb_state *mrb) 138 { 139 htable *t; 140 141 t = (htable*)mrb_malloc(mrb, sizeof(htable)); 142 t->size = 0; 143 t->rootseg = NULL; 144 t->lastseg = NULL; 145 t->last_len = 0; 146 t->index = NULL; 147 148 return t; 149 } 150 151 #define power2(v) do { \ 152 v--;\ 153 v |= v >> 1;\ 154 v |= v >> 2;\ 155 v |= v >> 4;\ 156 v |= v >> 8;\ 157 v |= v >> 16;\ 158 v++;\ 159 } while (0) 160 161 #ifndef UPPER_BOUND 162 #define UPPER_BOUND(x) ((x)>>2|(x)>>1) 163 #endif 164 165 #define HT_MASK(index) ((index->capa)-1) 166 167 /* Build index for the hash table */ 168 static void 169 ht_index(mrb_state *mrb, htable *t) 170 { 171 size_t size = (size_t)t->size; 172 size_t mask; 173 segindex *index = t->index; 174 segment *seg; 175 size_t i; 176 177 /* allocate index table */ 178 if (index && index->size >= UPPER_BOUND(index->capa)) { 179 size = index->capa+1; 180 } 181 power2(size); 182 if (!index || index->capa < size) { 183 index = (segindex*)mrb_realloc_simple(mrb, index, sizeof(segindex)+sizeof(struct segkv*)*size); 184 if (index == NULL) { 185 mrb_free(mrb, t->index); 186 t->index = NULL; 187 return; 188 } 189 t->index = index; 190 } 191 index->size = t->size; 192 index->capa = size; 193 for (i=0; i<size; i++) { 194 index->table[i] = NULL; 195 } 196 197 /* rebuld index */ 198 mask = HT_MASK(index); 199 seg = t->rootseg; 200 while (seg) { 201 for (i=0; i<seg->size; i++) { 202 mrb_value key; 203 size_t k, step = 0; 204 205 if (!seg->next && i >= (size_t)t->last_len) { 206 return; 207 } 208 key = seg->e[i].key; 209 if (mrb_undef_p(key)) continue; 210 k = ht_hash_func(mrb, t, key) & mask; 211 while (index->table[k]) { 212 k = (k+(++step)) & mask; 213 } 214 index->table[k] = &seg->e[i]; 215 } 216 seg = seg->next; 217 } 218 } 219 220 /* Compacts the hash table removing deleted entries. */ 221 static void 222 ht_compact(mrb_state *mrb, htable *t) 223 { 224 segment *seg; 225 uint16_t i, i2; 226 segment *seg2 = NULL; 227 mrb_int size = 0; 228 229 if (t == NULL) return; 230 seg = t->rootseg; 231 if (t->index && (size_t)t->size == t->index->size) { 232 ht_index(mrb, t); 233 return; 234 } 235 while (seg) { 236 for (i=0; i<seg->size; i++) { 237 mrb_value k = seg->e[i].key; 238 239 if (!seg->next && i >= t->last_len) { 240 goto exit; 241 } 242 if (mrb_undef_p(k)) { /* found deleted key */ 243 if (seg2 == NULL) { 244 seg2 = seg; 245 i2 = i; 246 } 247 } 248 else { 249 size++; 250 if (seg2 != NULL) { 251 seg2->e[i2++] = seg->e[i]; 252 if (i2 >= seg2->size) { 253 seg2 = seg2->next; 254 i2 = 0; 255 } 256 } 257 } 258 } 259 seg = seg->next; 260 } 261 exit: 262 /* reached at end */ 263 t->size = size; 264 if (seg2) { 265 seg = seg2->next; 266 seg2->next = NULL; 267 t->last_len = i2; 268 t->lastseg = seg2; 269 while (seg) { 270 seg2 = seg->next; 271 mrb_free(mrb, seg); 272 seg = seg2; 273 } 274 } 275 if (t->index) { 276 ht_index(mrb, t); 277 } 278 } 279 280 static segment* 281 segment_alloc(mrb_state *mrb, segment *seg) 282 { 283 uint32_t size; 284 285 if (!seg) size = MRB_HT_INIT_SIZE; 286 else { 287 size = seg->size*HT_SEG_INCREASE_RATIO + 1; 288 if (size > UINT16_MAX) size = UINT16_MAX; 289 } 290 291 seg = (segment*)mrb_malloc(mrb, sizeof(segment)+sizeof(struct segkv)*size); 292 seg->size = size; 293 seg->next = NULL; 294 295 return seg; 296 } 297 298 /* Set the value for the key in the indexed table. */ 299 static void 300 ht_index_put(mrb_state *mrb, htable *t, mrb_value key, mrb_value val) 301 { 302 segindex *index = t->index; 303 size_t k, sp, step = 0, mask; 304 segment *seg; 305 306 if (index->size >= UPPER_BOUND(index->capa)) { 307 /* need to expand table */ 308 ht_compact(mrb, t); 309 index = t->index; 310 } 311 mask = HT_MASK(index); 312 sp = index->capa; 313 k = ht_hash_func(mrb, t, key) & mask; 314 while (index->table[k]) { 315 mrb_value key2 = index->table[k]->key; 316 if (mrb_undef_p(key2)) { 317 if (sp == index->capa) sp = k; 318 } 319 else if (ht_hash_equal(mrb, t, key, key2)) { 320 index->table[k]->val = val; 321 return; 322 } 323 k = (k+(++step)) & mask; 324 } 325 if (sp < index->capa) { 326 k = sp; 327 } 328 329 /* put the value at the last */ 330 seg = t->lastseg; 331 if (t->last_len < seg->size) { 332 index->table[k] = &seg->e[t->last_len++]; 333 } 334 else { /* append a new segment */ 335 seg->next = segment_alloc(mrb, seg); 336 seg = seg->next; 337 seg->next = NULL; 338 t->lastseg = seg; 339 t->last_len = 1; 340 index->table[k] = &seg->e[0]; 341 } 342 index->table[k]->key = key; 343 index->table[k]->val = val; 344 index->size++; 345 t->size++; 346 } 347 348 /* Set the value for the key in the hash table. */ 349 static void 350 ht_put(mrb_state *mrb, htable *t, mrb_value key, mrb_value val) 351 { 352 segment *seg; 353 mrb_int i, deleted = 0; 354 355 if (t == NULL) return; 356 if (t->index) { 357 ht_index_put(mrb, t, key, val); 358 return; 359 } 360 seg = t->rootseg; 361 while (seg) { 362 for (i=0; i<seg->size; i++) { 363 mrb_value k = seg->e[i].key; 364 /* Found room in last segment after last_len */ 365 if (!seg->next && i >= t->last_len) { 366 seg->e[i].key = key; 367 seg->e[i].val = val; 368 t->last_len = i+1; 369 t->size++; 370 return; 371 } 372 if (mrb_undef_p(k)) { 373 deleted++; 374 continue; 375 } 376 if (ht_hash_equal(mrb, t, k, key)) { 377 seg->e[i].val = val; 378 return; 379 } 380 } 381 seg = seg->next; 382 } 383 /* Not found */ 384 385 /* Compact if last segment has room */ 386 if (deleted > 0 && deleted > MRB_HT_INIT_SIZE) { 387 ht_compact(mrb, t); 388 } 389 t->size++; 390 391 /* check if thre's room after compaction */ 392 if (t->lastseg && t->last_len < t->lastseg->size) { 393 seg = t->lastseg; 394 i = t->last_len; 395 } 396 else { 397 /* append new segment */ 398 seg = segment_alloc(mrb, t->lastseg); 399 i = 0; 400 if (t->rootseg == NULL) { 401 t->rootseg = seg; 402 } 403 else { 404 t->lastseg->next = seg; 405 } 406 t->lastseg = seg; 407 } 408 seg->e[i].key = key; 409 seg->e[i].val = val; 410 t->last_len = i+1; 411 if (t->index == NULL && t->size > MRB_HT_INIT_SIZE*4) { 412 ht_index(mrb, t); 413 } 414 } 415 416 /* Get a value for a key from the indexed table. */ 417 static mrb_bool 418 ht_index_get(mrb_state *mrb, htable *t, mrb_value key, mrb_value *vp) 419 { 420 segindex *index = t->index; 421 size_t mask = HT_MASK(index); 422 size_t k = ht_hash_func(mrb, t, key) & mask; 423 size_t step = 0; 424 425 while (index->table[k]) { 426 mrb_value key2 = index->table[k]->key; 427 if (!mrb_undef_p(key2) && ht_hash_equal(mrb, t, key, key2)) { 428 if (vp) *vp = index->table[k]->val; 429 return TRUE; 430 } 431 k = (k+(++step)) & mask; 432 } 433 return FALSE; 434 } 435 436 /* Get a value for a key from the hash table. */ 437 static mrb_bool 438 ht_get(mrb_state *mrb, htable *t, mrb_value key, mrb_value *vp) 439 { 440 segment *seg; 441 mrb_int i; 442 443 if (t == NULL) return FALSE; 444 if (t->index) { 445 return ht_index_get(mrb, t, key, vp); 446 } 447 448 seg = t->rootseg; 449 while (seg) { 450 for (i=0; i<seg->size; i++) { 451 mrb_value k = seg->e[i].key; 452 453 if (!seg->next && i >= t->last_len) { 454 return FALSE; 455 } 456 if (mrb_undef_p(k)) continue; 457 if (ht_hash_equal(mrb, t, k, key)) { 458 if (vp) *vp = seg->e[i].val; 459 return TRUE; 460 } 461 } 462 seg = seg->next; 463 } 464 return FALSE; 465 } 466 467 /* Deletes the value for the symbol from the hash table. */ 468 /* Deletion is done by overwriting keys by `undef`. */ 469 static mrb_bool 470 ht_del(mrb_state *mrb, htable *t, mrb_value key, mrb_value *vp) 471 { 472 segment *seg; 473 mrb_int i; 474 475 if (t == NULL) return FALSE; 476 seg = t->rootseg; 477 while (seg) { 478 for (i=0; i<seg->size; i++) { 479 mrb_value key2; 480 481 if (!seg->next && i >= t->last_len) { 482 /* not found */ 483 return FALSE; 484 } 485 key2 = seg->e[i].key; 486 if (!mrb_undef_p(key2) && ht_hash_equal(mrb, t, key, key2)) { 487 if (vp) *vp = seg->e[i].val; 488 seg->e[i].key = mrb_undef_value(); 489 t->size--; 490 return TRUE; 491 } 492 } 493 seg = seg->next; 494 } 495 return FALSE; 496 } 497 498 /* Iterates over the hash table. */ 499 static void 500 ht_foreach(mrb_state *mrb, htable *t, mrb_hash_foreach_func *func, void *p) 501 { 502 segment *seg; 503 mrb_int i; 504 505 if (t == NULL) return; 506 seg = t->rootseg; 507 while (seg) { 508 for (i=0; i<seg->size; i++) { 509 /* no value in last segment after last_len */ 510 if (!seg->next && i >= t->last_len) { 511 return; 512 } 513 if (mrb_undef_p(seg->e[i].key)) continue; 514 if ((*func)(mrb, seg->e[i].key, seg->e[i].val, p) != 0) 515 return; 516 } 517 seg = seg->next; 518 } 519 } 520 521 /* Iterates over the hash table. */ 522 MRB_API void 523 mrb_hash_foreach(mrb_state *mrb, struct RHash *hash, mrb_hash_foreach_func *func, void *p) 524 { 525 ht_foreach(mrb, hash->ht, func, p); 526 } 527 528 /* Copy the hash table. */ 529 static htable* 530 ht_copy(mrb_state *mrb, htable *t) 531 { 532 segment *seg; 533 htable *t2; 534 mrb_int i; 535 536 seg = t->rootseg; 537 t2 = ht_new(mrb); 538 if (t->size == 0) return t2; 539 540 while (seg) { 541 for (i=0; i<seg->size; i++) { 542 mrb_value key = seg->e[i].key; 543 mrb_value val = seg->e[i].val; 544 545 if ((seg->next == NULL) && (i >= t->last_len)) { 546 return t2; 547 } 548 if (mrb_undef_p(key)) continue; /* skip deleted key */ 549 ht_put(mrb, t2, key, val); 550 } 551 seg = seg->next; 552 } 553 return t2; 554 } 555 556 /* Free memory of the hash table. */ 557 static void 558 ht_free(mrb_state *mrb, htable *t) 559 { 560 segment *seg; 561 562 if (!t) return; 563 seg = t->rootseg; 564 while (seg) { 565 segment *p = seg; 566 seg = seg->next; 567 mrb_free(mrb, p); 568 } 569 if (t->index) mrb_free(mrb, t->index); 570 mrb_free(mrb, t); 571 } 95 572 96 573 static void mrb_hash_modify(mrb_state *mrb, mrb_value hash); 97 574 98 575 static inline mrb_value 99 mrb_hash_ht_key(mrb_state *mrb, mrb_value key)100 { 101 if (mrb_string_p(key) && ! MRB_FROZEN_P(mrb_str_ptr(key))) {576 ht_key(mrb_state *mrb, mrb_value key) 577 { 578 if (mrb_string_p(key) && !mrb_frozen_p(mrb_str_ptr(key))) { 102 579 key = mrb_str_dup(mrb, key); 103 580 MRB_SET_FROZEN_FLAG(mrb_str_ptr(key)); … … 106 583 } 107 584 108 #define KEY(key) mrb_hash_ht_key(mrb, key) 585 #define KEY(key) ht_key(mrb, key) 586 587 static int 588 hash_mark_i(mrb_state *mrb, mrb_value key, mrb_value val, void *p) 589 { 590 mrb_gc_mark_value(mrb, key); 591 mrb_gc_mark_value(mrb, val); 592 return 0; 593 } 109 594 110 595 void 111 596 mrb_gc_mark_hash(mrb_state *mrb, struct RHash *hash) 112 597 { 113 khiter_t k; 114 khash_t(ht) *h = hash->ht; 115 116 if (!h) return; 117 for (k = kh_begin(h); k != kh_end(h); k++) { 118 if (kh_exist(h, k)) { 119 mrb_value key = kh_key(h, k); 120 mrb_value val = kh_value(h, k).v; 121 122 mrb_gc_mark_value(mrb, key); 123 mrb_gc_mark_value(mrb, val); 124 } 125 } 598 ht_foreach(mrb, hash->ht, hash_mark_i, NULL); 126 599 } 127 600 … … 130 603 { 131 604 if (!hash->ht) return 0; 132 return kh_size(hash->ht)*2;605 return hash->ht->size*2; 133 606 } 134 607 … … 136 609 mrb_gc_free_hash(mrb_state *mrb, struct RHash *hash) 137 610 { 138 if (hash->ht) kh_destroy(ht, mrb, hash->ht); 139 } 140 611 ht_free(mrb, hash->ht); 612 } 613 614 MRB_API mrb_value 615 mrb_hash_new(mrb_state *mrb) 616 { 617 struct RHash *h; 618 619 h = (struct RHash*)mrb_obj_alloc(mrb, MRB_TT_HASH, mrb->hash_class); 620 h->ht = 0; 621 h->iv = 0; 622 return mrb_obj_value(h); 623 } 141 624 142 625 MRB_API mrb_value … … 146 629 147 630 h = (struct RHash*)mrb_obj_alloc(mrb, MRB_TT_HASH, mrb->hash_class); 148 h->ht = kh_init(ht, mrb); 149 if (capa > 0) { 150 kh_resize(ht, mrb, h->ht, capa); 151 } 631 /* preallocate hash table */ 632 h->ht = ht_new(mrb); 633 /* capacity ignored */ 152 634 h->iv = 0; 153 635 return mrb_obj_value(h); 154 636 } 155 637 156 MRB_API mrb_value157 mrb_hash_new(mrb_state *mrb)158 {159 return mrb_hash_new_capa(mrb, 0);160 }161 162 638 static mrb_value mrb_hash_default(mrb_state *mrb, mrb_value hash); 163 639 static mrb_value hash_default(mrb_state *mrb, mrb_value hash, mrb_value key); 164 640 641 static mrb_value 642 mrb_hash_init_copy(mrb_state *mrb, mrb_value self) 643 { 644 mrb_value orig; 645 struct RHash* copy; 646 htable *orig_h; 647 mrb_value ifnone, vret; 648 649 mrb_get_args(mrb, "o", &orig); 650 if (mrb_obj_equal(mrb, self, orig)) return self; 651 if ((mrb_type(self) != mrb_type(orig)) || (mrb_obj_class(mrb, self) != mrb_obj_class(mrb, orig))) { 652 mrb_raise(mrb, E_TYPE_ERROR, "initialize_copy should take same class object"); 653 } 654 655 orig_h = RHASH_TBL(self); 656 copy = (struct RHash*)mrb_obj_alloc(mrb, MRB_TT_HASH, mrb->hash_class); 657 copy->ht = ht_copy(mrb, orig_h); 658 659 if (MRB_RHASH_DEFAULT_P(self)) { 660 copy->flags |= MRB_HASH_DEFAULT; 661 } 662 if (MRB_RHASH_PROCDEFAULT_P(self)) { 663 copy->flags |= MRB_HASH_PROC_DEFAULT; 664 } 665 vret = mrb_obj_value(copy); 666 ifnone = RHASH_IFNONE(self); 667 if (!mrb_nil_p(ifnone)) { 668 mrb_iv_set(mrb, vret, mrb_intern_lit(mrb, "ifnone"), ifnone); 669 } 670 return vret; 671 } 672 673 static int 674 check_kdict_i(mrb_state *mrb, mrb_value key, mrb_value val, void *data) 675 { 676 if (!mrb_symbol_p(key)) { 677 mrb_raise(mrb, E_ARGUMENT_ERROR, "keyword argument hash with non symbol keys"); 678 } 679 return 0; 680 } 681 682 void 683 mrb_hash_check_kdict(mrb_state *mrb, mrb_value self) 684 { 685 htable *t; 686 687 t = RHASH_TBL(self); 688 if (!t || t->size == 0) return; 689 ht_foreach(mrb, t, check_kdict_i, NULL); 690 } 691 692 MRB_API mrb_value 693 mrb_hash_dup(mrb_state *mrb, mrb_value self) 694 { 695 struct RHash* copy; 696 htable *orig_h; 697 698 orig_h = RHASH_TBL(self); 699 copy = (struct RHash*)mrb_obj_alloc(mrb, MRB_TT_HASH, mrb->hash_class); 700 copy->ht = orig_h ? ht_copy(mrb, orig_h) : NULL; 701 return mrb_obj_value(copy); 702 } 703 165 704 MRB_API mrb_value 166 705 mrb_hash_get(mrb_state *mrb, mrb_value hash, mrb_value key) 167 706 { 168 khash_t(ht) *h = RHASH_TBL(hash); 169 khiter_t k; 707 mrb_value val; 170 708 mrb_sym mid; 171 709 172 if (h) { 173 k = kh_get(ht, mrb, h, key); 174 if (k != kh_end(h)) 175 return kh_value(h, k).v; 710 if (ht_get(mrb, RHASH_TBL(hash), key, &val)) { 711 return val; 176 712 } 177 713 … … 187 723 mrb_hash_fetch(mrb_state *mrb, mrb_value hash, mrb_value key, mrb_value def) 188 724 { 189 khash_t(ht) *h = RHASH_TBL(hash); 190 khiter_t k; 191 192 if (h) { 193 k = kh_get(ht, mrb, h, key); 194 if (k != kh_end(h)) 195 return kh_value(h, k).v; 196 } 197 725 mrb_value val; 726 727 if (ht_get(mrb, RHASH_TBL(hash), key, &val)) { 728 return val; 729 } 198 730 /* not found */ 199 731 return def; … … 203 735 mrb_hash_set(mrb_state *mrb, mrb_value hash, mrb_value key, mrb_value val) 204 736 { 205 khash_t(ht) *h;206 khiter_t k;207 int r;208 209 737 mrb_hash_modify(mrb, hash); 210 h = RHASH_TBL(hash); 211 212 if (!h) h = RHASH_TBL(hash) = kh_init(ht, mrb); 213 k = kh_put2(ht, mrb, h, key, &r); 214 kh_value(h, k).v = val; 215 216 if (r != 0) { 217 /* expand */ 218 int ai = mrb_gc_arena_save(mrb); 219 key = kh_key(h, k) = KEY(key); 220 mrb_gc_arena_restore(mrb, ai); 221 kh_value(h, k).n = kh_size(h)-1; 222 } 223 738 739 key = KEY(key); 740 ht_put(mrb, RHASH_TBL(hash), key, val); 224 741 mrb_field_write_barrier_value(mrb, (struct RBasic*)RHASH(hash), key); 225 742 mrb_field_write_barrier_value(mrb, (struct RBasic*)RHASH(hash), val); … … 227 744 } 228 745 229 static mrb_value230 mrb_hash_dup(mrb_state *mrb, mrb_value hash)231 {232 struct RHash* ret;233 khash_t(ht) *h, *ret_h;234 khiter_t k, ret_k;235 mrb_value ifnone, vret;236 237 h = RHASH_TBL(hash);238 ret = (struct RHash*)mrb_obj_alloc(mrb, MRB_TT_HASH, mrb->hash_class);239 ret->ht = kh_init(ht, mrb);240 241 if (h && kh_size(h) > 0) {242 ret_h = ret->ht;243 244 for (k = kh_begin(h); k != kh_end(h); k++) {245 if (kh_exist(h, k)) {246 int ai = mrb_gc_arena_save(mrb);247 ret_k = kh_put(ht, mrb, ret_h, KEY(kh_key(h, k)));248 mrb_gc_arena_restore(mrb, ai);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;251 }252 }253 }254 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;267 }268 269 MRB_API mrb_value270 mrb_check_hash_type(mrb_state *mrb, mrb_value hash)271 {272 return mrb_check_convert_type(mrb, hash, MRB_TT_HASH, "Hash", "to_hash");273 }274 275 MRB_API khash_t(ht)*276 mrb_hash_tbl(mrb_state *mrb, mrb_value hash)277 {278 khash_t(ht) *h = RHASH_TBL(hash);279 280 if (!h) {281 return RHASH_TBL(hash) = kh_init(ht, mrb);282 }283 return h;284 }285 286 746 static void 287 747 mrb_hash_modify(mrb_state *mrb, mrb_value hash) 288 748 { 289 if (MRB_FROZEN_P(mrb_hash_ptr(hash))) {290 mrb_raise(mrb, E_RUNTIME_ERROR, "can't modify frozen hash");291 }292 mrb_hash_tbl(mrb, hash);749 mrb_check_frozen(mrb, mrb_hash_ptr(hash)); 750 if (!RHASH_TBL(hash)) { 751 RHASH_TBL(hash) = ht_new(mrb); 752 } 293 753 } 294 754 … … 340 800 if (!mrb_nil_p(block)) { 341 801 if (ifnone_p) { 342 mrb_ raise(mrb, E_ARGUMENT_ERROR, "wrong number of arguments");802 mrb_argnum_error(mrb, 1, 0, 0); 343 803 } 344 804 RHASH(hash)->flags |= MRB_HASH_PROC_DEFAULT; … … 530 990 mrb_hash_delete_key(mrb_state *mrb, mrb_value hash, mrb_value key) 531 991 { 532 khash_t(ht) *h = RHASH_TBL(hash); 533 khiter_t k; 534 mrb_value delVal; 535 mrb_int n; 536 537 if (h) { 538 k = kh_get(ht, mrb, h, key); 539 if (k != kh_end(h)) { 540 delVal = kh_value(h, k).v; 541 n = kh_value(h, k).n; 542 kh_del(ht, mrb, h, k); 543 for (k = kh_begin(h); k != kh_end(h); k++) { 544 if (!kh_exist(h, k)) continue; 545 if (kh_value(h, k).n > n) kh_value(h, k).n--; 546 } 547 return delVal; 548 } 992 htable *t = RHASH_TBL(hash); 993 mrb_value del_val; 994 995 if (ht_del(mrb, t, key, &del_val)) { 996 return del_val; 549 997 } 550 998 … … 553 1001 } 554 1002 555 /* 15.2.13.4.8 */556 /*557 * call-seq:558 * hsh.delete(key) -> value559 * hsh.delete(key) {| key | block } -> value560 *561 * Deletes and returns a key-value pair from <i>hsh</i> whose key is562 * equal to <i>key</i>. If the key is not found, returns the563 * <em>default value</em>. If the optional code block is given and the564 * key is not found, pass in the key and return the result of565 * <i>block</i>.566 *567 * h = { "a" => 100, "b" => 200 }568 * h.delete("a") #=> 100569 * h.delete("z") #=> nil570 * h.delete("z") { |el| "#{el} not found" } #=> "z not found"571 *572 */573 1003 static mrb_value 574 1004 mrb_hash_delete(mrb_state *mrb, mrb_value self) … … 581 1011 } 582 1012 1013 /* find first element in the hash table, and remove it. */ 1014 static void 1015 ht_shift(mrb_state *mrb, htable *t, mrb_value *kp, mrb_value *vp) 1016 { 1017 segment *seg = t->rootseg; 1018 mrb_int i; 1019 1020 while (seg) { 1021 for (i=0; i<seg->size; i++) { 1022 mrb_value key; 1023 1024 if (!seg->next && i >= t->last_len) { 1025 return; 1026 } 1027 key = seg->e[i].key; 1028 if (mrb_undef_p(key)) continue; 1029 *kp = key; 1030 *vp = seg->e[i].val; 1031 /* delete element */ 1032 seg->e[i].key = mrb_undef_value(); 1033 t->size--; 1034 return; 1035 } 1036 seg = seg->next; 1037 } 1038 } 1039 583 1040 /* 15.2.13.4.24 */ 584 1041 /* … … 598 1055 mrb_hash_shift(mrb_state *mrb, mrb_value hash) 599 1056 { 600 khash_t(ht) *h = RHASH_TBL(hash); 601 khiter_t k; 602 mrb_value delKey, delVal; 1057 htable *t = RHASH_TBL(hash); 603 1058 604 1059 mrb_hash_modify(mrb, hash); 605 if (h && kh_size(h) > 0) { 606 for (k = kh_begin(h); k != kh_end(h); k++) { 607 if (!kh_exist(h, k)) continue; 608 609 delKey = kh_key(h, k); 610 mrb_gc_protect(mrb, delKey); 611 delVal = mrb_hash_delete_key(mrb, hash, delKey); 612 mrb_gc_protect(mrb, delVal); 613 614 return mrb_assoc_new(mrb, delKey, delVal); 615 } 1060 if (t && t->size > 0) { 1061 mrb_value del_key, del_val; 1062 1063 ht_shift(mrb, t, &del_key, &del_val); 1064 mrb_gc_protect(mrb, del_key); 1065 mrb_gc_protect(mrb, del_val); 1066 return mrb_assoc_new(mrb, del_key, del_val); 616 1067 } 617 1068 … … 642 1093 mrb_hash_clear(mrb_state *mrb, mrb_value hash) 643 1094 { 644 khash_t(ht) *h= RHASH_TBL(hash);1095 htable *t = RHASH_TBL(hash); 645 1096 646 1097 mrb_hash_modify(mrb, hash); 647 if (h) kh_clear(ht, mrb, h); 1098 if (t) { 1099 ht_free(mrb, t); 1100 RHASH_TBL(hash) = NULL; 1101 } 648 1102 return hash; 649 1103 } … … 678 1132 } 679 1133 1134 MRB_API mrb_int 1135 mrb_hash_size(mrb_state *mrb, mrb_value hash) 1136 { 1137 htable *t = RHASH_TBL(hash); 1138 1139 if (!t) return 0; 1140 return t->size; 1141 } 1142 680 1143 /* 15.2.13.4.20 */ 681 1144 /* 15.2.13.4.25 */ … … 695 1158 mrb_hash_size_m(mrb_state *mrb, mrb_value self) 696 1159 { 697 khash_t(ht) *h = RHASH_TBL(self); 698 699 if (!h) return mrb_fixnum_value(0); 700 return mrb_fixnum_value(kh_size(h)); 1160 mrb_int size = mrb_hash_size(mrb, self); 1161 return mrb_fixnum_value(size); 1162 } 1163 1164 MRB_API mrb_bool 1165 mrb_hash_empty_p(mrb_state *mrb, mrb_value self) 1166 { 1167 htable *t = RHASH_TBL(self); 1168 1169 if (!t) return TRUE; 1170 return t->size == 0; 701 1171 } 702 1172 … … 711 1181 * 712 1182 */ 713 MRB_API mrb_value 714 mrb_hash_empty_p(mrb_state *mrb, mrb_value self) 715 { 716 khash_t(ht) *h = RHASH_TBL(self); 717 718 if (h) return mrb_bool_value(kh_size(h) == 0); 719 return mrb_true_value(); 720 } 721 722 /* 15.2.13.4.29 (x)*/ 723 /* 724 * call-seq: 725 * hsh.to_hash => hsh 726 * 727 * Returns +self+. 728 */ 729 730 static mrb_value 731 mrb_hash_to_hash(mrb_state *mrb, mrb_value hash) 732 { 733 return hash; 1183 static mrb_value 1184 mrb_hash_empty_m(mrb_state *mrb, mrb_value self) 1185 { 1186 return mrb_bool_value(mrb_hash_empty_p(mrb, self)); 1187 } 1188 1189 static int 1190 hash_keys_i(mrb_state *mrb, mrb_value key, mrb_value val, void *p) 1191 { 1192 mrb_ary_push(mrb, *(mrb_value*)p, key); 1193 return 0; 734 1194 } 735 1195 … … 750 1210 mrb_hash_keys(mrb_state *mrb, mrb_value hash) 751 1211 { 752 khash_t(ht) *h = RHASH_TBL(hash); 753 khiter_t k; 754 mrb_int end; 1212 htable *t = RHASH_TBL(hash); 1213 mrb_int size; 755 1214 mrb_value ary; 756 mrb_value *p; 757 758 if (!h || kh_size(h) == 0) return mrb_ary_new(mrb); 759 ary = mrb_ary_new_capa(mrb, kh_size(h)); 760 end = kh_size(h)-1; 761 mrb_ary_set(mrb, ary, end, mrb_nil_value()); 762 p = mrb_ary_ptr(ary)->ptr; 763 for (k = kh_begin(h); k != kh_end(h); k++) { 764 if (kh_exist(h, k)) { 765 mrb_value kv = kh_key(h, k); 766 mrb_hash_value hv = kh_value(h, k); 767 768 if (hv.n <= end) { 769 p[hv.n] = kv; 770 } 771 else { 772 p[end] = kv; 773 } 774 } 775 } 1215 1216 if (!t || (size = t->size) == 0) 1217 return mrb_ary_new(mrb); 1218 ary = mrb_ary_new_capa(mrb, size); 1219 ht_foreach(mrb, t, hash_keys_i, (void*)&ary); 776 1220 return ary; 1221 } 1222 1223 static int 1224 hash_vals_i(mrb_state *mrb, mrb_value key, mrb_value val, void *p) 1225 { 1226 mrb_ary_push(mrb, *(mrb_value*)p, val); 1227 return 0; 777 1228 } 778 1229 … … 793 1244 mrb_hash_values(mrb_state *mrb, mrb_value hash) 794 1245 { 795 khash_t(ht) *h= RHASH_TBL(hash);796 khiter_t k;1246 htable *t = RHASH_TBL(hash); 1247 mrb_int size; 797 1248 mrb_value ary; 798 1249 799 if (!h) return mrb_ary_new(mrb); 800 ary = mrb_ary_new_capa(mrb, kh_size(h)); 801 for (k = kh_begin(h); k != kh_end(h); k++) { 802 if (kh_exist(h, k)) { 803 mrb_hash_value hv = kh_value(h, k); 804 805 mrb_ary_set(mrb, ary, hv.n, hv.v); 806 } 807 } 1250 if (!t || (size = t->size) == 0) 1251 return mrb_ary_new(mrb); 1252 ary = mrb_ary_new_capa(mrb, size); 1253 ht_foreach(mrb, t, hash_vals_i, (void*)&ary); 808 1254 return ary; 809 1255 } … … 828 1274 */ 829 1275 1276 MRB_API mrb_bool 1277 mrb_hash_key_p(mrb_state *mrb, mrb_value hash, mrb_value key) 1278 { 1279 htable *t; 1280 1281 t = RHASH_TBL(hash); 1282 if (ht_get(mrb, t, key, NULL)) { 1283 return TRUE; 1284 } 1285 return FALSE; 1286 } 1287 830 1288 static mrb_value 831 1289 mrb_hash_has_key(mrb_state *mrb, mrb_value hash) 832 1290 { 833 1291 mrb_value key; 834 khash_t(ht) *h; 835 khiter_t k; 1292 mrb_bool key_p; 836 1293 837 1294 mrb_get_args(mrb, "o", &key); 838 839 h = RHASH_TBL(hash); 840 if (h) { 841 k = kh_get(ht, mrb, h, key); 842 return mrb_bool_value(k != kh_end(h)); 843 } 844 return mrb_false_value(); 1295 key_p = mrb_hash_key_p(mrb, hash, key); 1296 return mrb_bool_value(key_p); 1297 } 1298 1299 struct has_v_arg { 1300 mrb_bool found; 1301 mrb_value val; 1302 }; 1303 1304 static int 1305 hash_has_value_i(mrb_state *mrb, mrb_value key, mrb_value val, void *p) 1306 { 1307 struct has_v_arg *arg = (struct has_v_arg*)p; 1308 1309 if (mrb_equal(mrb, arg->val, val)) { 1310 arg->found = TRUE; 1311 return 1; 1312 } 1313 return 0; 845 1314 } 846 1315 … … 864 1333 { 865 1334 mrb_value val; 866 khash_t(ht) *h; 867 khiter_t k; 868 1335 struct has_v_arg arg; 1336 869 1337 mrb_get_args(mrb, "o", &val); 870 h = RHASH_TBL(hash); 871 872 if (h) { 873 for (k = kh_begin(h); k != kh_end(h); k++) { 874 if (!kh_exist(h, k)) continue; 875 876 if (mrb_equal(mrb, kh_value(h, k).v, val)) { 877 return mrb_true_value(); 878 } 879 } 880 } 881 return mrb_false_value(); 1338 arg.found = FALSE; 1339 arg.val = val; 1340 ht_foreach(mrb, RHASH_TBL(hash), hash_has_value_i, &arg); 1341 return mrb_bool_value(arg.found); 1342 } 1343 1344 static int 1345 merge_i(mrb_state *mrb, mrb_value key, mrb_value val, void *data) 1346 { 1347 htable *h1 = (htable*)data; 1348 1349 ht_put(mrb, h1, key, val); 1350 return 0; 1351 } 1352 1353 MRB_API void 1354 mrb_hash_merge(mrb_state *mrb, mrb_value hash1, mrb_value hash2) 1355 { 1356 htable *h1, *h2; 1357 1358 mrb_hash_modify(mrb, hash1); 1359 hash2 = mrb_ensure_hash_type(mrb, hash2); 1360 h1 = RHASH_TBL(hash1); 1361 h2 = RHASH_TBL(hash2); 1362 1363 if (!h2) return; 1364 if (!h1) { 1365 RHASH_TBL(hash1) = ht_copy(mrb, h2); 1366 return; 1367 } 1368 ht_foreach(mrb, h2, merge_i, h1); 1369 mrb_write_barrier(mrb, (struct RBasic*)RHASH(hash1)); 1370 return; 1371 } 1372 1373 /* 1374 * call-seq: 1375 * hsh.rehash -> hsh 1376 * 1377 * Rebuilds the hash based on the current hash values for each key. If 1378 * values of key objects have changed since they were inserted, this 1379 * method will reindex <i>hsh</i>. 1380 * 1381 * keys = (1..17).map{|n| [n]} 1382 * k = keys[0] 1383 * h = {} 1384 * keys.each{|key| h[key] = key[0]} 1385 * h #=> { [1]=> 1, [2]=> 2, [3]=> 3, [4]=> 4, [5]=> 5, [6]=> 6, [7]=> 7, 1386 * [8]=> 8, [9]=> 9,[10]=>10,[11]=>11,[12]=>12,[13]=>13,[14]=>14, 1387 * [15]=>15,[16]=>16,[17]=>17} 1388 * h[k] #=> 1 1389 * k[0] = keys.size + 1 1390 * h #=> {[18]=> 1, [2]=> 2, [3]=> 3, [4]=> 4, [5]=> 5, [6]=> 6, [7]=> 7, 1391 * [8]=> 8, [9]=> 9,[10]=>10,[11]=>11,[12]=>12,[13]=>13,[14]=>14, 1392 * [15]=>15,[16]=>16,[17]=>17} 1393 * h[k] #=> nil 1394 * h.rehash 1395 * h[k] #=> 1 1396 */ 1397 static mrb_value 1398 mrb_hash_rehash(mrb_state *mrb, mrb_value self) 1399 { 1400 ht_compact(mrb, RHASH_TBL(self)); 1401 return self; 882 1402 } 883 1403 … … 890 1410 MRB_SET_INSTANCE_TT(h, MRB_TT_HASH); 891 1411 1412 mrb_define_method(mrb, h, "initialize_copy", mrb_hash_init_copy, MRB_ARGS_REQ(1)); 892 1413 mrb_define_method(mrb, h, "[]", mrb_hash_aget, MRB_ARGS_REQ(1)); /* 15.2.13.4.2 */ 893 1414 mrb_define_method(mrb, h, "[]=", mrb_hash_aset, MRB_ARGS_REQ(2)); /* 15.2.13.4.3 */ 894 1415 mrb_define_method(mrb, h, "clear", mrb_hash_clear, MRB_ARGS_NONE()); /* 15.2.13.4.4 */ 895 mrb_define_method(mrb, h, "default", mrb_hash_default, MRB_ARGS_ ANY()); /* 15.2.13.4.5 */1416 mrb_define_method(mrb, h, "default", mrb_hash_default, MRB_ARGS_OPT(1)); /* 15.2.13.4.5 */ 896 1417 mrb_define_method(mrb, h, "default=", mrb_hash_set_default, MRB_ARGS_REQ(1)); /* 15.2.13.4.6 */ 897 1418 mrb_define_method(mrb, h, "default_proc", mrb_hash_default_proc,MRB_ARGS_NONE()); /* 15.2.13.4.7 */ 898 1419 mrb_define_method(mrb, h, "default_proc=", mrb_hash_set_default_proc,MRB_ARGS_REQ(1)); /* 15.2.13.4.7 */ 899 1420 mrb_define_method(mrb, h, "__delete", mrb_hash_delete, MRB_ARGS_REQ(1)); /* core of 15.2.13.4.8 */ 900 mrb_define_method(mrb, h, "empty?", mrb_hash_empty_ p, MRB_ARGS_NONE()); /* 15.2.13.4.12 */1421 mrb_define_method(mrb, h, "empty?", mrb_hash_empty_m, MRB_ARGS_NONE()); /* 15.2.13.4.12 */ 901 1422 mrb_define_method(mrb, h, "has_key?", mrb_hash_has_key, MRB_ARGS_REQ(1)); /* 15.2.13.4.13 */ 902 1423 mrb_define_method(mrb, h, "has_value?", mrb_hash_has_value, MRB_ARGS_REQ(1)); /* 15.2.13.4.14 */ 903 1424 mrb_define_method(mrb, h, "include?", mrb_hash_has_key, MRB_ARGS_REQ(1)); /* 15.2.13.4.15 */ 904 mrb_define_method(mrb, h, "initialize", mrb_hash_init, MRB_ARGS_OPT(1) ); /* 15.2.13.4.16 */1425 mrb_define_method(mrb, h, "initialize", mrb_hash_init, MRB_ARGS_OPT(1)|MRB_ARGS_BLOCK()); /* 15.2.13.4.16 */ 905 1426 mrb_define_method(mrb, h, "key?", mrb_hash_has_key, MRB_ARGS_REQ(1)); /* 15.2.13.4.18 */ 906 1427 mrb_define_method(mrb, h, "keys", mrb_hash_keys, MRB_ARGS_NONE()); /* 15.2.13.4.19 */ … … 908 1429 mrb_define_method(mrb, h, "member?", mrb_hash_has_key, MRB_ARGS_REQ(1)); /* 15.2.13.4.21 */ 909 1430 mrb_define_method(mrb, h, "shift", mrb_hash_shift, MRB_ARGS_NONE()); /* 15.2.13.4.24 */ 910 mrb_define_method(mrb, h, "dup", mrb_hash_dup, MRB_ARGS_NONE());911 1431 mrb_define_method(mrb, h, "size", mrb_hash_size_m, MRB_ARGS_NONE()); /* 15.2.13.4.25 */ 912 1432 mrb_define_method(mrb, h, "store", mrb_hash_aset, MRB_ARGS_REQ(2)); /* 15.2.13.4.26 */ 913 1433 mrb_define_method(mrb, h, "value?", mrb_hash_has_value, MRB_ARGS_REQ(1)); /* 15.2.13.4.27 */ 914 1434 mrb_define_method(mrb, h, "values", mrb_hash_values, MRB_ARGS_NONE()); /* 15.2.13.4.28 */ 915 916 mrb_define_method(mrb, h, "to_hash", mrb_hash_to_hash, MRB_ARGS_NONE()); /* 15.2.13.4.29 (x)*/ 917 } 1435 mrb_define_method(mrb, h, "rehash", mrb_hash_rehash, MRB_ARGS_NONE()); 1436 } -
EcnlProtoTool/trunk/mruby-2.1.1/src/kernel.c
r331 r439 15 15 #include <mruby/istruct.h> 16 16 17 typedef enum {18 NOEX_PUBLIC = 0x00,19 NOEX_NOSUPER = 0x01,20 NOEX_PRIVATE = 0x02,21 NOEX_PROTECTED = 0x04,22 NOEX_MASK = 0x06,23 NOEX_BASIC = 0x08,24 NOEX_UNDEF = NOEX_NOSUPER,25 NOEX_MODFUNC = 0x12,26 NOEX_SUPER = 0x20,27 NOEX_VCALL = 0x40,28 NOEX_RESPONDS = 0x8029 } mrb_method_flag_t;30 31 17 MRB_API mrb_bool 32 18 mrb_func_basic_p(mrb_state *mrb, mrb_value obj, mrb_sym mid, mrb_func_t func) 33 19 { 34 struct RProc *me = mrb_method_search(mrb, mrb_class(mrb, obj), mid); 35 if (MRB_PROC_CFUNC_P(me) && (me->body.func == func)) 20 struct RClass *c = mrb_class(mrb, obj); 21 mrb_method_t m = mrb_method_search_vm(mrb, &c, mid); 22 struct RProc *p; 23 24 if (MRB_METHOD_UNDEF_P(m)) return FALSE; 25 if (MRB_METHOD_FUNC_P(m)) 26 return MRB_METHOD_FUNC(m) == func; 27 p = MRB_METHOD_PROC(m); 28 if (MRB_PROC_CFUNC_P(p) && (MRB_PROC_CFUNC(p) == func)) 36 29 return TRUE; 37 30 return FALSE; … … 61 54 mrb_obj_inspect(mrb_state *mrb, mrb_value obj) 62 55 { 63 if ( (mrb_type(obj) == MRB_TT_OBJECT) && mrb_obj_basic_to_s_p(mrb, obj)) {56 if (mrb_object_p(obj) && mrb_obj_basic_to_s_p(mrb, obj)) { 64 57 return mrb_obj_iv_inspect(mrb, mrb_obj_ptr(obj)); 65 58 } … … 135 128 mrb_f_block_given_p_m(mrb_state *mrb, mrb_value self) 136 129 { 137 mrb_callinfo *ci = mrb->c->ci; 130 mrb_callinfo *ci = &mrb->c->ci[-1]; 131 mrb_callinfo *cibase = mrb->c->cibase; 138 132 mrb_value *bp; 139 140 bp = ci->stackent + 1; 141 ci--;142 if (ci <= mrb->c->cibase) {133 struct RProc *p; 134 135 if (ci <= cibase) { 136 /* toplevel does not have block */ 143 137 return mrb_false_value(); 144 138 } 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 } 139 p = ci->proc; 140 /* search method/class/module proc */ 141 while (p) { 142 if (MRB_PROC_SCOPE_P(p)) break; 143 p = p->upper; 144 } 145 if (p == NULL) return mrb_false_value(); 146 /* search ci corresponding to proc */ 147 while (cibase < ci) { 148 if (ci->proc == p) break; 149 ci--; 150 } 151 if (ci == cibase) { 152 return mrb_false_value(); 153 } 154 else if (ci->env) { 155 struct REnv *e = ci->env; 156 int bidx; 157 152 158 /* top-level does not have block slot (always false) */ 153 159 if (e->stack == mrb->c->stbase) 154 160 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 */ 161 /* use saved block arg position */ 162 bidx = MRB_ENV_BIDX(e); 163 /* bidx may be useless (e.g. define_method) */ 164 if (bidx >= MRB_ENV_STACK_LEN(e)) 165 return mrb_false_value(); 166 bp = &e->stack[bidx]; 167 } 168 else { 169 bp = ci[1].stackent+1; 170 if (ci->argc >= 0) { 171 bp += ci->argc; 159 172 } 160 173 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; 174 bp++; 175 } 167 176 } 168 177 if (mrb_nil_p(*bp)) … … 231 240 /* if the origin is not the same as the class, then the origin and 232 241 the current class need to be copied */ 233 if (sc->flags & MRB_FL AG_IS_PREPENDED) {242 if (sc->flags & MRB_FL_CLASS_IS_PREPENDED) { 234 243 struct RClass *c0 = sc->super; 235 244 struct RClass *c1 = dc; 236 245 237 246 /* copy prepended iclasses */ 238 while (!(c0->flags & MRB_FL AG_IS_ORIGIN)) {247 while (!(c0->flags & MRB_FL_CLASS_IS_ORIGIN)) { 239 248 c1->super = mrb_class_ptr(mrb_obj_dup(mrb, mrb_obj_value(c0))); 240 249 c1 = c1->super; … … 242 251 } 243 252 c1->super = mrb_class_ptr(mrb_obj_dup(mrb, mrb_obj_value(c0))); 244 c1->super->flags |= MRB_FL AG_IS_ORIGIN;253 c1->super->flags |= MRB_FL_CLASS_IS_ORIGIN; 245 254 } 246 255 if (sc->mt) { … … 258 267 { 259 268 switch (mrb_type(obj)) { 269 case MRB_TT_ICLASS: 270 copy_class(mrb, dest, obj); 271 return; 260 272 case MRB_TT_CLASS: 261 273 case MRB_TT_MODULE: 262 274 copy_class(mrb, dest, obj); 263 /* fall through */ 275 mrb_iv_copy(mrb, dest, obj); 276 mrb_iv_remove(mrb, dest, mrb_intern_lit(mrb, "__classname__")); 277 break; 264 278 case MRB_TT_OBJECT: 265 279 case MRB_TT_SCLASS: … … 312 326 313 327 if (mrb_immediate_p(self)) { 314 mrb_raisef(mrb, E_TYPE_ERROR, "can't clone % S", self);315 } 316 if (mrb_ type(self) == MRB_TT_SCLASS) {328 mrb_raisef(mrb, E_TYPE_ERROR, "can't clone %v", self); 329 } 330 if (mrb_sclass_p(self)) { 317 331 mrb_raise(mrb, E_TYPE_ERROR, "can't clone singleton class"); 318 332 } 319 333 p = (struct RObject*)mrb_obj_alloc(mrb, mrb_type(self), mrb_obj_class(mrb, self)); 320 334 p->c = mrb_singleton_class_clone(mrb, self); 335 mrb_field_write_barrier(mrb, (struct RBasic*)p, (struct RBasic*)p->c); 321 336 clone = mrb_obj_value(p); 322 337 init_copy(mrb, clone, self); 338 p->flags |= mrb_obj_ptr(self)->flags & MRB_FL_OBJ_IS_FROZEN; 323 339 324 340 return clone; … … 351 367 352 368 if (mrb_immediate_p(obj)) { 353 mrb_raisef(mrb, E_TYPE_ERROR, "can't dup % S", obj);354 } 355 if (mrb_ type(obj) == MRB_TT_SCLASS) {369 mrb_raisef(mrb, E_TYPE_ERROR, "can't dup %v", obj); 370 } 371 if (mrb_sclass_p(obj)) { 356 372 mrb_raise(mrb, E_TYPE_ERROR, "can't dup singleton class"); 357 373 } … … 369 385 370 386 if (argc == 0) { 371 mrb_ raise(mrb, E_ARGUMENT_ERROR, "wrong number of arguments (at least 1)");387 mrb_argnum_error(mrb, argc, 1, -1); 372 388 } 373 389 for (i = 0; i < argc; i++) { … … 411 427 mrb_value *argv; 412 428 mrb_int argc; 413 mrb_value args;414 429 415 430 mrb_get_args(mrb, "*", &argv, &argc); 416 args = mrb_ary_new_from_values(mrb, argc, argv);417 argv = (mrb_value*)RARRAY_PTR(args);418 431 return mrb_obj_extend(mrb, argc, argv, self); 419 432 } 420 433 421 staticmrb_value434 MRB_API mrb_value 422 435 mrb_obj_freeze(mrb_state *mrb, mrb_value self) 423 436 { 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); 437 if (!mrb_immediate_p(self)) { 438 struct RBasic *b = mrb_basic_ptr(self); 439 if (!mrb_frozen_p(b)) { 440 MRB_SET_FROZEN_FLAG(b); 441 if (b->c->tt == MRB_TT_SCLASS) MRB_SET_FROZEN_FLAG(b->c); 442 } 440 443 } 441 444 return self; … … 445 448 mrb_obj_frozen(mrb_state *mrb, mrb_value self) 446 449 { 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(); 450 return mrb_bool_value(mrb_immediate_p(self) || mrb_frozen_p(mrb_basic_ptr(self))); 465 451 } 466 452 … … 476 462 * <code>Fixnum</code> will be truncated before being used. 477 463 */ 478 MRB_APImrb_value464 static mrb_value 479 465 mrb_obj_hash(mrb_state *mrb, mrb_value self) 480 466 { … … 520 506 521 507 return mrb_bool_value(mrb_obj_is_instance_of(mrb, self, mrb_class_ptr(arg))); 522 }523 524 /* 15.3.1.3.20 */525 /*526 * call-seq:527 * obj.instance_variable_defined?(symbol) -> true or false528 *529 * Returns <code>true</code> if the given instance variable is530 * defined in <i>obj</i>.531 *532 * class Fred533 * def initialize(p1, p2)534 * @a, @b = p1, p2535 * end536 * end537 * fred = Fred.new('cat', 99)538 * fred.instance_variable_defined?(:@a) #=> true539 * fred.instance_variable_defined?("@b") #=> true540 * fred.instance_variable_defined?("@c") #=> false541 */542 static mrb_value543 mrb_obj_ivar_defined(mrb_state *mrb, mrb_value self)544 {545 mrb_sym sym;546 547 mrb_get_args(mrb, "n", &sym);548 mrb_iv_check(mrb, sym);549 return mrb_bool_value(mrb_iv_defined(mrb, self, sym));550 }551 552 /* 15.3.1.3.21 */553 /*554 * call-seq:555 * obj.instance_variable_get(symbol) -> obj556 *557 * Returns the value of the given instance variable, or nil if the558 * instance variable is not set. The <code>@</code> part of the559 * variable name should be included for regular instance560 * variables. Throws a <code>NameError</code> exception if the561 * supplied symbol is not valid as an instance variable name.562 *563 * class Fred564 * def initialize(p1, p2)565 * @a, @b = p1, p2566 * end567 * end568 * fred = Fred.new('cat', 99)569 * fred.instance_variable_get(:@a) #=> "cat"570 * fred.instance_variable_get("@b") #=> 99571 */572 static mrb_value573 mrb_obj_ivar_get(mrb_state *mrb, mrb_value self)574 {575 mrb_sym iv_name;576 577 mrb_get_args(mrb, "n", &iv_name);578 mrb_iv_check(mrb, iv_name);579 return mrb_iv_get(mrb, self, iv_name);580 }581 582 /* 15.3.1.3.22 */583 /*584 * call-seq:585 * obj.instance_variable_set(symbol, obj) -> obj586 *587 * Sets the instance variable names by <i>symbol</i> to588 * <i>object</i>, thereby frustrating the efforts of the class's589 * author to attempt to provide proper encapsulation. The variable590 * did not have to exist prior to this call.591 *592 * class Fred593 * def initialize(p1, p2)594 * @a, @b = p1, p2595 * end596 * end597 * fred = Fred.new('cat', 99)598 * fred.instance_variable_set(:@a, 'dog') #=> "dog"599 * fred.instance_variable_set(:@c, 'cat') #=> "cat"600 * fred.inspect #=> "#<Fred:0x401b3da8 @a=\"dog\", @b=99, @c=\"cat\">"601 */602 static mrb_value603 mrb_obj_ivar_set(mrb_state *mrb, mrb_value self)604 {605 mrb_sym iv_name;606 mrb_value val;607 608 mrb_get_args(mrb, "no", &iv_name, &val);609 mrb_iv_check(mrb, iv_name);610 mrb_iv_set(mrb, self, iv_name, val);611 return val;612 508 } 613 509 … … 652 548 KHASH_DEFINE(st, mrb_sym, char, FALSE, kh_int_hash_func, kh_int_hash_equal) 653 549 654 static void655 method_entry_loop(mrb_state *mrb, struct RClass* klass, khash_t(st)* set)656 {657 khint_t i;658 659 khash_t(mt) *h = klass->mt;660 if (!h) return;661 for (i=0;i<kh_end(h);i++) {662 if (kh_exist(h, i) && kh_value(h, i)) {663 kh_put(st, mrb, set, kh_key(h, i));664 }665 }666 }667 668 mrb_value669 mrb_class_instance_method_list(mrb_state *mrb, mrb_bool recur, struct RClass* klass, int obj)670 {671 khint_t i;672 mrb_value ary;673 mrb_bool prepended = FALSE;674 struct RClass* oldklass;675 khash_t(st)* set = kh_init(st, mrb);676 677 if (!recur && (klass->flags & MRB_FLAG_IS_PREPENDED)) {678 MRB_CLASS_ORIGIN(klass);679 prepended = TRUE;680 }681 682 oldklass = 0;683 while (klass && (klass != oldklass)) {684 method_entry_loop(mrb, klass, set);685 if ((klass->tt == MRB_TT_ICLASS && !prepended) ||686 (klass->tt == MRB_TT_SCLASS)) {687 }688 else {689 if (!recur) break;690 }691 oldklass = klass;692 klass = klass->super;693 }694 695 ary = mrb_ary_new(mrb);696 for (i=0;i<kh_end(set);i++) {697 if (kh_exist(set, i)) {698 mrb_ary_push(mrb, ary, mrb_symbol_value(kh_key(set, i)));699 }700 }701 kh_destroy(st, mrb, set);702 703 return ary;704 }705 706 static mrb_value707 mrb_obj_singleton_methods(mrb_state *mrb, mrb_bool recur, mrb_value obj)708 {709 khint_t i;710 mrb_value ary;711 struct RClass* klass;712 khash_t(st)* set = kh_init(st, mrb);713 714 klass = mrb_class(mrb, obj);715 716 if (klass && (klass->tt == MRB_TT_SCLASS)) {717 method_entry_loop(mrb, klass, set);718 klass = klass->super;719 }720 if (recur) {721 while (klass && ((klass->tt == MRB_TT_SCLASS) || (klass->tt == MRB_TT_ICLASS))) {722 method_entry_loop(mrb, klass, set);723 klass = klass->super;724 }725 }726 727 ary = mrb_ary_new(mrb);728 for (i=0;i<kh_end(set);i++) {729 if (kh_exist(set, i)) {730 mrb_ary_push(mrb, ary, mrb_symbol_value(kh_key(set, i)));731 }732 }733 kh_destroy(st, mrb, set);734 735 return ary;736 }737 738 static mrb_value739 mrb_obj_methods(mrb_state *mrb, mrb_bool recur, mrb_value obj, mrb_method_flag_t flag)740 {741 return mrb_class_instance_method_list(mrb, recur, mrb_class(mrb, obj), 0);742 }743 /* 15.3.1.3.31 */744 /*745 * call-seq:746 * obj.methods -> array747 *748 * Returns a list of the names of methods publicly accessible in749 * <i>obj</i>. This will include all the methods accessible in750 * <i>obj</i>'s ancestors.751 *752 * class Klass753 * def kMethod()754 * end755 * end756 * k = Klass.new757 * k.methods[0..9] #=> [:kMethod, :respond_to?, :nil?, :is_a?,758 * # :class, :instance_variable_set,759 * # :methods, :extend, :__send__, :instance_eval]760 * k.methods.length #=> 42761 */762 static mrb_value763 mrb_obj_methods_m(mrb_state *mrb, mrb_value self)764 {765 mrb_bool recur = TRUE;766 mrb_get_args(mrb, "|b", &recur);767 return mrb_obj_methods(mrb, recur, self, (mrb_method_flag_t)0); /* everything but private */768 }769 770 550 /* 15.3.1.3.32 */ 771 551 /* … … 780 560 { 781 561 return mrb_false_value(); 782 }783 784 /* 15.3.1.3.36 */785 /*786 * call-seq:787 * obj.private_methods(all=true) -> array788 *789 * Returns the list of private methods accessible to <i>obj</i>. If790 * the <i>all</i> parameter is set to <code>false</code>, only those methods791 * in the receiver will be listed.792 */793 static mrb_value794 mrb_obj_private_methods(mrb_state *mrb, mrb_value self)795 {796 mrb_bool recur = TRUE;797 mrb_get_args(mrb, "|b", &recur);798 return mrb_obj_methods(mrb, recur, self, NOEX_PRIVATE); /* private attribute not define */799 }800 801 /* 15.3.1.3.37 */802 /*803 * call-seq:804 * obj.protected_methods(all=true) -> array805 *806 * Returns the list of protected methods accessible to <i>obj</i>. If807 * the <i>all</i> parameter is set to <code>false</code>, only those methods808 * in the receiver will be listed.809 */810 static mrb_value811 mrb_obj_protected_methods(mrb_state *mrb, mrb_value self)812 {813 mrb_bool recur = TRUE;814 mrb_get_args(mrb, "|b", &recur);815 return mrb_obj_methods(mrb, recur, self, NOEX_PROTECTED); /* protected attribute not define */816 }817 818 /* 15.3.1.3.38 */819 /*820 * call-seq:821 * obj.public_methods(all=true) -> array822 *823 * Returns the list of public methods accessible to <i>obj</i>. If824 * the <i>all</i> parameter is set to <code>false</code>, only those methods825 * in the receiver will be listed.826 */827 static mrb_value828 mrb_obj_public_methods(mrb_state *mrb, mrb_value self)829 {830 mrb_bool recur = TRUE;831 mrb_get_args(mrb, "|b", &recur);832 return mrb_obj_methods(mrb, recur, self, NOEX_PUBLIC); /* public attribute not define */833 562 } 834 563 … … 858 587 { 859 588 mrb_value a[2], exc; 860 int argc;589 mrb_int argc; 861 590 862 591 … … 910 639 911 640 mrb_get_args(mrb, "n", &sym); 912 mrb_iv_ check(mrb, sym);641 mrb_iv_name_sym_check(mrb, sym); 913 642 val = mrb_iv_remove(mrb, self, sym); 914 643 if (mrb_undef_p(val)) { 915 mrb_name_error(mrb, sym, "instance variable % S not defined", mrb_sym2str(mrb, sym));644 mrb_name_error(mrb, sym, "instance variable %n not defined", sym); 916 645 } 917 646 return val; … … 921 650 mrb_method_missing(mrb_state *mrb, mrb_sym name, mrb_value self, mrb_value args) 922 651 { 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); 652 mrb_no_method_error(mrb, name, args, "undefined method '%n'", name); 943 653 } 944 654 … … 976 686 * r.mm #=> 2000 977 687 */ 978 #ifdef MRB_DEFAULT_METHOD_MISSING979 688 static mrb_value 980 689 mrb_obj_missing(mrb_state *mrb, mrb_value mod) … … 984 693 mrb_int alen; 985 694 986 mrb_get_args(mrb, "n* ", &name, &a, &alen);695 mrb_get_args(mrb, "n*!", &name, &a, &alen); 987 696 mrb_method_missing(mrb, name, mod, mrb_ary_new_from_values(mrb, alen, a)); 988 697 /* not reached */ 989 698 return mrb_nil_value(); 990 699 } 991 #endif992 700 993 701 static inline mrb_bool … … 996 704 return mrb_respond_to(mrb, obj, id); 997 705 } 706 998 707 /* 15.3.1.3.43 */ 999 708 /* … … 1015 724 obj_respond_to(mrb_state *mrb, mrb_value self) 1016 725 { 1017 mrb_value mid;1018 726 mrb_sym id, rtm_id; 1019 mrb_bool priv = FALSE, respond_to_p = TRUE; 1020 1021 mrb_get_args(mrb, "o|b", &mid, &priv); 1022 1023 if (mrb_symbol_p(mid)) { 1024 id = mrb_symbol(mid); 1025 } 1026 else { 1027 mrb_value tmp; 1028 if (mrb_string_p(mid)) { 1029 tmp = mrb_check_intern_str(mrb, mid); 1030 } 1031 else { 1032 tmp = mrb_check_string_type(mrb, mid); 1033 if (mrb_nil_p(tmp)) { 1034 tmp = mrb_inspect(mrb, mid); 1035 mrb_raisef(mrb, E_TYPE_ERROR, "%S is not a symbol", tmp); 1036 } 1037 tmp = mrb_check_intern_str(mrb, tmp); 1038 } 1039 if (mrb_nil_p(tmp)) { 1040 respond_to_p = FALSE; 1041 } 1042 else { 1043 id = mrb_symbol(tmp); 1044 } 1045 } 1046 1047 if (respond_to_p) { 1048 respond_to_p = basic_obj_respond_to(mrb, self, id, !priv); 1049 } 1050 727 mrb_bool priv = FALSE, respond_to_p; 728 729 mrb_get_args(mrb, "n|b", &id, &priv); 730 respond_to_p = basic_obj_respond_to(mrb, self, id, !priv); 1051 731 if (!respond_to_p) { 1052 732 rtm_id = mrb_intern_lit(mrb, "respond_to_missing?"); 1053 733 if (basic_obj_respond_to(mrb, self, rtm_id, !priv)) { 1054 734 mrb_value args[2], v; 1055 args[0] = m id;735 args[0] = mrb_symbol_value(id); 1056 736 args[1] = mrb_bool_value(priv); 1057 737 v = mrb_funcall_argv(mrb, self, rtm_id, 2, args); … … 1060 740 } 1061 741 return mrb_bool_value(respond_to_p); 1062 }1063 1064 /* 15.3.1.3.45 */1065 /*1066 * call-seq:1067 * obj.singleton_methods(all=true) -> array1068 *1069 * Returns an array of the names of singleton methods for <i>obj</i>.1070 * If the optional <i>all</i> parameter is true, the list will include1071 * methods in modules included in <i>obj</i>.1072 * Only public and protected singleton methods are returned.1073 *1074 * module Other1075 * def three() end1076 * end1077 *1078 * class Single1079 * def Single.four() end1080 * end1081 *1082 * a = Single.new1083 *1084 * def a.one()1085 * end1086 *1087 * class << a1088 * include Other1089 * def two()1090 * end1091 * end1092 *1093 * Single.singleton_methods #=> [:four]1094 * a.singleton_methods(false) #=> [:two, :one]1095 * a.singleton_methods #=> [:two, :one, :three]1096 */1097 static mrb_value1098 mrb_obj_singleton_methods_m(mrb_state *mrb, mrb_value self)1099 {1100 mrb_bool recur = TRUE;1101 mrb_get_args(mrb, "|b", &recur);1102 return mrb_obj_singleton_methods(mrb, recur, self);1103 }1104 1105 static mrb_value1106 mod_define_singleton_method(mrb_state *mrb, mrb_value self)1107 {1108 struct RProc *p;1109 mrb_sym mid;1110 mrb_value blk = mrb_nil_value();1111 1112 mrb_get_args(mrb, "n&", &mid, &blk);1113 if (mrb_nil_p(blk)) {1114 mrb_raise(mrb, E_ARGUMENT_ERROR, "no block given");1115 }1116 p = (struct RProc*)mrb_obj_alloc(mrb, MRB_TT_PROC, mrb->proc_class);1117 mrb_proc_copy(p, mrb_proc_ptr(blk));1118 p->flags |= MRB_PROC_STRICT;1119 mrb_define_method_raw(mrb, mrb_class_ptr(mrb_singleton_class(mrb, self)), mid, p);1120 return mrb_symbol_value(mid);1121 742 } 1122 743 … … 1138 759 } 1139 760 1140 static mrb_value1141 mrb_local_variables(mrb_state *mrb, mrb_value self)1142 {1143 struct RProc *proc;1144 mrb_value vars;1145 struct mrb_irep *irep;1146 size_t i;1147 1148 proc = mrb->c->ci[-1].proc;1149 1150 if (MRB_PROC_CFUNC_P(proc)) {1151 return mrb_ary_new(mrb);1152 }1153 1154 irep = proc->body.irep;1155 if (!irep->lv) {1156 return mrb_ary_new(mrb);1157 }1158 vars = mrb_hash_new(mrb);1159 for (i = 0; i + 1 < irep->nlocals; ++i) {1160 if (irep->lv[i].name) {1161 mrb_hash_set(mrb, vars, mrb_symbol_value(irep->lv[i].name), mrb_true_value());1162 }1163 }1164 if (proc->env) {1165 struct REnv *e = proc->env;1166 1167 while (e) {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;1171 if (irep->lv) {1172 for (i = 0; i + 1 < irep->nlocals; ++i) {1173 if (irep->lv[i].name) {1174 mrb_hash_set(mrb, vars, mrb_symbol_value(irep->lv[i].name), mrb_true_value());1175 }1176 }1177 }1178 }1179 e = (struct REnv*)e->c;1180 }1181 }1182 1183 return mrb_hash_keys(mrb, vars);1184 }1185 1186 761 mrb_value mrb_obj_equal_m(mrb_state *mrb, mrb_value); 762 1187 763 void 1188 764 mrb_init_kernel(mrb_state *mrb) … … 1192 768 mrb->kernel_module = krn = mrb_define_module(mrb, "Kernel"); /* 15.3.1 */ 1193 769 mrb_define_class_method(mrb, krn, "block_given?", mrb_f_block_given_p_m, MRB_ARGS_NONE()); /* 15.3.1.2.2 */ 1194 mrb_define_class_method(mrb, krn, "global_variables", mrb_f_global_variables, MRB_ARGS_NONE()); /* 15.3.1.2.4 */1195 770 mrb_define_class_method(mrb, krn, "iterator?", mrb_f_block_given_p_m, MRB_ARGS_NONE()); /* 15.3.1.2.5 */ 1196 mrb_define_class_method(mrb, krn, "local_variables", mrb_local_variables, MRB_ARGS_NONE()); /* 15.3.1.2.7 */1197 771 ; /* 15.3.1.2.11 */ 1198 772 mrb_define_class_method(mrb, krn, "raise", mrb_f_raise, MRB_ARGS_OPT(2)); /* 15.3.1.2.12 */ 1199 773 1200 mrb_define_method(mrb, krn, "singleton_class", mrb_singleton_class, MRB_ARGS_NONE());1201 774 1202 775 mrb_define_method(mrb, krn, "===", mrb_equal_m, MRB_ARGS_REQ(1)); /* 15.3.1.3.2 */ … … 1206 779 mrb_define_method(mrb, krn, "dup", mrb_obj_dup, MRB_ARGS_NONE()); /* 15.3.1.3.9 */ 1207 780 mrb_define_method(mrb, krn, "eql?", mrb_obj_equal_m, MRB_ARGS_REQ(1)); /* 15.3.1.3.10 */ 1208 mrb_define_method(mrb, krn, "equal?", mrb_obj_equal_m, MRB_ARGS_REQ(1)); /* 15.3.1.3.11 */1209 781 mrb_define_method(mrb, krn, "extend", mrb_obj_extend_m, MRB_ARGS_ANY()); /* 15.3.1.3.13 */ 1210 782 mrb_define_method(mrb, krn, "freeze", mrb_obj_freeze, MRB_ARGS_NONE()); 1211 783 mrb_define_method(mrb, krn, "frozen?", mrb_obj_frozen, MRB_ARGS_NONE()); 1212 mrb_define_method(mrb, krn, "global_variables", mrb_f_global_variables, MRB_ARGS_NONE()); /* 15.3.1.3.14 */1213 784 mrb_define_method(mrb, krn, "hash", mrb_obj_hash, MRB_ARGS_NONE()); /* 15.3.1.3.15 */ 1214 785 mrb_define_method(mrb, krn, "initialize_copy", mrb_obj_init_copy, MRB_ARGS_REQ(1)); /* 15.3.1.3.16 */ 1215 786 mrb_define_method(mrb, krn, "inspect", mrb_obj_inspect, MRB_ARGS_NONE()); /* 15.3.1.3.17 */ 1216 787 mrb_define_method(mrb, krn, "instance_of?", obj_is_instance_of, MRB_ARGS_REQ(1)); /* 15.3.1.3.19 */ 1217 mrb_define_method(mrb, krn, "instance_variable_defined?", mrb_obj_ivar_defined, MRB_ARGS_REQ(1)); /* 15.3.1.3.20 */ 1218 mrb_define_method(mrb, krn, "instance_variable_get", mrb_obj_ivar_get, MRB_ARGS_REQ(1)); /* 15.3.1.3.21 */ 1219 mrb_define_method(mrb, krn, "instance_variable_set", mrb_obj_ivar_set, MRB_ARGS_REQ(2)); /* 15.3.1.3.22 */ 1220 mrb_define_method(mrb, krn, "instance_variables", mrb_obj_instance_variables, MRB_ARGS_NONE()); /* 15.3.1.3.23 */ 788 1221 789 mrb_define_method(mrb, krn, "is_a?", mrb_obj_is_kind_of_m, MRB_ARGS_REQ(1)); /* 15.3.1.3.24 */ 1222 790 mrb_define_method(mrb, krn, "iterator?", mrb_f_block_given_p_m, MRB_ARGS_NONE()); /* 15.3.1.3.25 */ 1223 791 mrb_define_method(mrb, krn, "kind_of?", mrb_obj_is_kind_of_m, MRB_ARGS_REQ(1)); /* 15.3.1.3.26 */ 1224 mrb_define_method(mrb, krn, "local_variables", mrb_local_variables, MRB_ARGS_NONE()); /* 15.3.1.3.28 */1225 #ifdef MRB_DEFAULT_METHOD_MISSING1226 792 mrb_define_method(mrb, krn, "method_missing", mrb_obj_missing, MRB_ARGS_ANY()); /* 15.3.1.3.30 */ 1227 #endif1228 mrb_define_method(mrb, krn, "methods", mrb_obj_methods_m, MRB_ARGS_OPT(1)); /* 15.3.1.3.31 */1229 793 mrb_define_method(mrb, krn, "nil?", mrb_false, MRB_ARGS_NONE()); /* 15.3.1.3.32 */ 1230 794 mrb_define_method(mrb, krn, "object_id", mrb_obj_id_m, MRB_ARGS_NONE()); /* 15.3.1.3.33 */ 1231 mrb_define_method(mrb, krn, "private_methods", mrb_obj_private_methods, MRB_ARGS_OPT(1)); /* 15.3.1.3.36 */1232 mrb_define_method(mrb, krn, "protected_methods", mrb_obj_protected_methods, MRB_ARGS_OPT(1)); /* 15.3.1.3.37 */1233 mrb_define_method(mrb, krn, "public_methods", mrb_obj_public_methods, MRB_ARGS_OPT(1)); /* 15.3.1.3.38 */1234 795 mrb_define_method(mrb, krn, "raise", mrb_f_raise, MRB_ARGS_ANY()); /* 15.3.1.3.40 */ 1235 796 mrb_define_method(mrb, krn, "remove_instance_variable", mrb_obj_remove_instance_variable,MRB_ARGS_REQ(1)); /* 15.3.1.3.41 */ 1236 mrb_define_method(mrb, krn, "respond_to?", obj_respond_to, MRB_ARGS_ANY()); /* 15.3.1.3.43 */ 1237 mrb_define_method(mrb, krn, "send", mrb_f_send, MRB_ARGS_ANY()); /* 15.3.1.3.44 */ 1238 mrb_define_method(mrb, krn, "singleton_methods", mrb_obj_singleton_methods_m, MRB_ARGS_OPT(1)); /* 15.3.1.3.45 */ 1239 mrb_define_method(mrb, krn, "define_singleton_method", mod_define_singleton_method, MRB_ARGS_ANY()); 797 mrb_define_method(mrb, krn, "respond_to?", obj_respond_to, MRB_ARGS_ARG(1,1)); /* 15.3.1.3.43 */ 1240 798 mrb_define_method(mrb, krn, "to_s", mrb_any_to_s, MRB_ARGS_NONE()); /* 15.3.1.3.46 */ 1241 799 mrb_define_method(mrb, krn, "__case_eqq", mrb_obj_ceqq, MRB_ARGS_REQ(1)); /* internal */ 800 mrb_define_method(mrb, krn, "__to_int", mrb_to_int, MRB_ARGS_NONE()); /* internal */ 801 mrb_define_method(mrb, krn, "__to_str", mrb_to_str, MRB_ARGS_NONE()); /* internal */ 1242 802 1243 803 mrb_include_module(mrb, mrb->object_class, mrb->kernel_module); 1244 mrb_alias_method(mrb, mrb->module_class, mrb_intern_lit(mrb, "dup"), mrb_intern_lit(mrb, "clone")); 1245 } 804 } -
EcnlProtoTool/trunk/mruby-2.1.1/src/load.c
r331 r439 8 8 #include <stdlib.h> 9 9 #include <string.h> 10 #include <math.h> 10 11 #include <mruby/dump.h> 11 12 #include <mruby/irep.h> … … 25 26 #define FLAG_SRC_STATIC 0 26 27 27 #define SIZE_ERROR_MUL(nmemb, size) (( nmemb) > SIZE_MAX / (size))28 #define SIZE_ERROR_MUL(nmemb, size) ((size_t)(nmemb) > SIZE_MAX / (size)) 28 29 29 30 static size_t … … 41 42 } 42 43 44 #ifndef MRB_WITHOUT_FLOAT 45 double mrb_str_len_to_dbl(mrb_state *mrb, const char *s, size_t len, mrb_bool badcheck); 46 47 static double 48 str_to_double(mrb_state *mrb, const char *p, size_t len) 49 { 50 /* `i`, `inf`, `infinity` */ 51 if (len > 0 && p[0] == 'i') return INFINITY; 52 53 /* `I`, `-inf`, `-infinity` */ 54 if (p[0] == 'I' || (len > 1 && p[0] == '-' && p[1] == 'i')) return -INFINITY; 55 return mrb_str_len_to_dbl(mrb, p, len, TRUE); 56 } 57 #endif 58 59 mrb_value mrb_str_len_to_inum(mrb_state *mrb, const char *str, mrb_int len, mrb_int base, int badcheck); 60 43 61 static mrb_irep* 44 62 read_irep_record_1(mrb_state *mrb, const uint8_t *bin, size_t *len, uint8_t flags) 45 63 { 46 size_t i;64 int i; 47 65 const uint8_t *src = bin; 48 66 ptrdiff_t diff; 49 67 uint16_t tt, pool_data_len, snl; 50 size_t plen;68 int plen; 51 69 int ai = mrb_gc_arena_save(mrb); 52 70 mrb_irep *irep = mrb_add_irep(mrb); … … 69 87 /* Binary Data Section */ 70 88 /* ISEQ BLOCK */ 71 irep->ilen = ( size_t)bin_to_uint32(src);89 irep->ilen = (uint16_t)bin_to_uint32(src); 72 90 src += sizeof(uint32_t); 73 91 src += skip_padding(src); … … 80 98 (flags & FLAG_BYTEORDER_NATIVE)) { 81 99 irep->iseq = (mrb_code*)src; 82 src += sizeof( uint32_t) * irep->ilen;100 src += sizeof(mrb_code) * irep->ilen; 83 101 irep->flags |= MRB_ISEQ_NO_FREE; 84 102 } 85 103 else { 86 irep->iseq = (mrb_code *)mrb_malloc(mrb, sizeof(mrb_code) * irep->ilen); 87 if (flags & FLAG_BYTEORDER_NATIVE) { 88 memcpy(irep->iseq, src, sizeof(uint32_t) * irep->ilen); 89 src += sizeof(uint32_t) * irep->ilen; 90 } 91 else if (flags & FLAG_BYTEORDER_BIG) { 92 for (i = 0; i < irep->ilen; i++) { 93 irep->iseq[i] = (mrb_code)bin_to_uint32(src); /* iseq */ 94 src += sizeof(uint32_t); 95 } 96 } 97 else { 98 for (i = 0; i < irep->ilen; i++) { 99 irep->iseq[i] = (mrb_code)bin_to_uint32l(src); /* iseq */ 100 src += sizeof(uint32_t); 101 } 102 } 104 size_t data_len = sizeof(mrb_code) * irep->ilen; 105 void *buf = mrb_malloc(mrb, data_len); 106 irep->iseq = (mrb_code *)buf; 107 memcpy(buf, src, data_len); 108 src += data_len; 103 109 } 104 110 } 105 111 106 112 /* POOL BLOCK */ 107 plen = (size_t)bin_to_uint32(src); /* number of pool */113 plen = bin_to_uint32(src); /* number of pool */ 108 114 src += sizeof(uint32_t); 109 115 if (plen > 0) { … … 114 120 115 121 for (i = 0; i < plen; i++) { 116 mrb_value s; 122 const char *s; 123 mrb_bool st = (flags & FLAG_SRC_MALLOC)==0; 117 124 118 125 tt = *src++; /* pool TT */ 119 126 pool_data_len = bin_to_uint16(src); /* pool data length */ 120 127 src += sizeof(uint16_t); 121 if (flags & FLAG_SRC_MALLOC) { 122 s = mrb_str_new(mrb, (char *)src, pool_data_len); 123 } 124 else { 125 s = mrb_str_new_static(mrb, (char *)src, pool_data_len); 126 } 128 s = (const char*)src; 127 129 src += pool_data_len; 128 130 switch (tt) { /* pool data */ 129 case IREP_TT_FIXNUM: 130 irep->pool[i] = mrb_str_to_inum(mrb, s, 10, FALSE); 131 case IREP_TT_FIXNUM: { 132 mrb_value num = mrb_str_len_to_inum(mrb, s, pool_data_len, 10, FALSE); 133 #ifdef MRB_WITHOUT_FLOAT 134 irep->pool[i] = num; 135 #else 136 irep->pool[i] = mrb_float_p(num)? mrb_float_pool(mrb, mrb_float(num)) : num; 137 #endif 138 } 131 139 break; 132 140 141 #ifndef MRB_WITHOUT_FLOAT 133 142 case IREP_TT_FLOAT: 134 irep->pool[i] = mrb_float_pool(mrb, mrb_str_to_dbl(mrb, s, FALSE));143 irep->pool[i] = mrb_float_pool(mrb, str_to_double(mrb, s, pool_data_len)); 135 144 break; 145 #endif 136 146 137 147 case IREP_TT_STRING: 138 irep->pool[i] = mrb_str_pool(mrb, s );148 irep->pool[i] = mrb_str_pool(mrb, s, pool_data_len, st); 139 149 break; 140 150 … … 150 160 151 161 /* SYMS BLOCK */ 152 irep->slen = ( size_t)bin_to_uint32(src); /* syms length */162 irep->slen = (uint16_t)bin_to_uint32(src); /* syms length */ 153 163 src += sizeof(uint32_t); 154 164 if (irep->slen > 0) { … … 192 202 { 193 203 mrb_irep *irep = read_irep_record_1(mrb, bin, len, flags); 194 size_t i;204 int i; 195 205 196 206 if (irep == NULL) { … … 222 232 223 233 static int 224 read_lineno_record_1(mrb_state *mrb, const uint8_t *bin, mrb_irep *irep, size_t *len)225 {226 size_t i, fname_len, niseq;227 char *fname;228 uint16_t *lines;229 230 *len = 0;231 bin += sizeof(uint32_t); /* record size */232 *len += sizeof(uint32_t);233 fname_len = bin_to_uint16(bin);234 bin += sizeof(uint16_t);235 *len += sizeof(uint16_t);236 fname = (char *)mrb_malloc(mrb, fname_len + 1);237 memcpy(fname, bin, fname_len);238 fname[fname_len] = '\0';239 bin += fname_len;240 *len += fname_len;241 242 niseq = (size_t)bin_to_uint32(bin);243 bin += sizeof(uint32_t); /* niseq */244 *len += sizeof(uint32_t);245 246 if (SIZE_ERROR_MUL(niseq, sizeof(uint16_t))) {247 return MRB_DUMP_GENERAL_FAILURE;248 }249 lines = (uint16_t *)mrb_malloc(mrb, niseq * sizeof(uint16_t));250 for (i = 0; i < niseq; i++) {251 lines[i] = bin_to_uint16(bin);252 bin += sizeof(uint16_t); /* niseq */253 *len += sizeof(uint16_t);254 }255 256 irep->filename = fname;257 irep->lines = lines;258 return MRB_DUMP_OK;259 }260 261 static int262 read_lineno_record(mrb_state *mrb, const uint8_t *bin, mrb_irep *irep, size_t *lenp)263 {264 int result = read_lineno_record_1(mrb, bin, irep, lenp);265 size_t i;266 267 if (result != MRB_DUMP_OK) return result;268 for (i = 0; i < irep->rlen; i++) {269 size_t len;270 271 result = read_lineno_record(mrb, bin, irep->reps[i], &len);272 if (result != MRB_DUMP_OK) break;273 bin += len;274 *lenp += len;275 }276 return result;277 }278 279 static int280 read_section_lineno(mrb_state *mrb, const uint8_t *bin, mrb_irep *irep)281 {282 size_t len;283 284 len = 0;285 bin += sizeof(struct rite_section_lineno_header);286 287 /* Read Binary Data Section */288 return read_lineno_record(mrb, bin, irep, &len);289 }290 291 static int292 234 read_debug_record(mrb_state *mrb, const uint8_t *start, mrb_irep* irep, size_t *record_len, const mrb_sym *filenames, size_t filenames_len) 293 235 { 294 236 const uint8_t *bin = start; 295 237 ptrdiff_t diff; 296 size_t record_size , i;238 size_t record_size; 297 239 uint16_t f_idx; 240 int i; 298 241 299 242 if (irep->debug_info) { return MRB_DUMP_INVALID_IREP; } 300 243 301 244 irep->debug_info = (mrb_irep_debug_info*)mrb_malloc(mrb, sizeof(mrb_irep_debug_info)); 302 irep->debug_info->pc_count = irep->ilen;245 irep->debug_info->pc_count = (uint32_t)irep->ilen; 303 246 304 247 record_size = (size_t)bin_to_uint32(bin); … … 312 255 mrb_irep_debug_info_file *file; 313 256 uint16_t filename_idx; 314 mrb_int len;315 257 316 258 file = (mrb_irep_debug_info_file *)mrb_malloc(mrb, sizeof(*file)); … … 325 267 mrb_assert(filename_idx < filenames_len); 326 268 file->filename_sym = filenames[filename_idx]; 327 len = 0;328 file->filename = mrb_sym2name_len(mrb, file->filename_sym, &len);329 269 330 270 file->line_entry_count = bin_to_uint32(bin); … … 433 373 { 434 374 const uint8_t *bin = start; 435 size_t i;436 375 ptrdiff_t diff; 376 int i; 437 377 438 378 irep->lv = (struct mrb_locals*)mrb_malloc(mrb, sizeof(struct mrb_locals) * (irep->nlocals - 1)); … … 517 457 518 458 static int 519 read_binary_header(const uint8_t *bin, size_t *bin_size, uint16_t *crc, uint8_t *flags)459 read_binary_header(const uint8_t *bin, size_t bufsize, size_t *bin_size, uint16_t *crc, uint8_t *flags) 520 460 { 521 461 const struct rite_binary_header *header = (const struct rite_binary_header *)bin; 462 463 if (bufsize < sizeof(struct rite_binary_header)) { 464 return MRB_DUMP_READ_FAULT; 465 } 522 466 523 467 if (memcmp(header->binary_ident, RITE_BINARY_IDENT, sizeof(header->binary_ident)) == 0) { … … 537 481 } 538 482 483 if (memcmp(header->binary_version, RITE_BINARY_FORMAT_VER, sizeof(header->binary_version)) != 0) { 484 return MRB_DUMP_INVALID_FILE_HEADER; 485 } 486 539 487 if (crc) { 540 488 *crc = bin_to_uint16(header->binary_crc); … … 542 490 *bin_size = (size_t)bin_to_uint32(header->binary_size); 543 491 492 if (bufsize < *bin_size) { 493 return MRB_DUMP_READ_FAULT; 494 } 495 544 496 return MRB_DUMP_OK; 545 497 } 546 498 547 499 static mrb_irep* 548 read_irep(mrb_state *mrb, const uint8_t *bin, uint8_t flags)500 read_irep(mrb_state *mrb, const uint8_t *bin, size_t bufsize, uint8_t flags) 549 501 { 550 502 int result; … … 559 511 } 560 512 561 result = read_binary_header(bin, &bin_size, &crc, &flags);513 result = read_binary_header(bin, bufsize, &bin_size, &crc, &flags); 562 514 if (result != MRB_DUMP_OK) { 563 515 return NULL; … … 576 528 if (!irep) return NULL; 577 529 } 578 else if (memcmp(section_header->section_ident, RITE_SECTION_LINENO_IDENT, sizeof(section_header->section_ident)) == 0) {579 if (!irep) return NULL; /* corrupted data */580 result = read_section_lineno(mrb, bin, irep);581 if (result < MRB_DUMP_OK) {582 return NULL;583 }584 }585 530 else if (memcmp(section_header->section_ident, RITE_SECTION_DEBUG_IDENT, sizeof(section_header->section_ident)) == 0) { 586 531 if (!irep) return NULL; /* corrupted data */ … … 606 551 mrb_read_irep(mrb_state *mrb, const uint8_t *bin) 607 552 { 608 #if def MRB_USE_ETEXT_EDATA553 #if defined(MRB_USE_LINK_TIME_RO_DATA_P) || defined(MRB_USE_CUSTOM_RO_DATA_P) 609 554 uint8_t flags = mrb_ro_data_p((char*)bin) ? FLAG_SRC_STATIC : FLAG_SRC_MALLOC; 610 555 #else … … 612 557 #endif 613 558 614 return read_irep(mrb, bin, flags); 559 return read_irep(mrb, bin, (size_t)-1, flags); 560 } 561 562 MRB_API mrb_irep* 563 mrb_read_irep_buf(mrb_state *mrb, const void *buf, size_t bufsize) 564 { 565 return read_irep(mrb, (const uint8_t *)buf, bufsize, FLAG_SRC_MALLOC); 615 566 } 616 567 … … 623 574 } 624 575 625 MRB_API mrb_value 626 mrb_load_irep_cxt(mrb_state *mrb, const uint8_t *bin, mrbc_context *c) 627 { 628 mrb_irep *irep = mrb_read_irep(mrb, bin); 576 void mrb_codedump_all(mrb_state*, struct RProc*); 577 578 static mrb_value 579 load_irep(mrb_state *mrb, mrb_irep *irep, mrbc_context *c) 580 { 629 581 struct RProc *proc; 630 582 … … 634 586 } 635 587 proc = mrb_proc_new(mrb, irep); 588 proc->c = NULL; 636 589 mrb_irep_decref(mrb, irep); 590 if (c && c->dump_result) mrb_codedump_all(mrb, proc); 637 591 if (c && c->no_exec) return mrb_obj_value(proc); 638 592 return mrb_top_run(mrb, proc, mrb_top_self(mrb), 0); … … 640 594 641 595 MRB_API mrb_value 596 mrb_load_irep_cxt(mrb_state *mrb, const uint8_t *bin, mrbc_context *c) 597 { 598 return load_irep(mrb, mrb_read_irep(mrb, bin), c); 599 } 600 601 MRB_API mrb_value 602 mrb_load_irep_buf_cxt(mrb_state *mrb, const void *buf, size_t bufsize, mrbc_context *c) 603 { 604 return load_irep(mrb, mrb_read_irep_buf(mrb, buf, bufsize), c); 605 } 606 607 MRB_API mrb_value 642 608 mrb_load_irep(mrb_state *mrb, const uint8_t *bin) 643 609 { 644 610 return mrb_load_irep_cxt(mrb, bin, NULL); 611 } 612 613 MRB_API mrb_value 614 mrb_load_irep_buf(mrb_state *mrb, const void *buf, size_t bufsize) 615 { 616 return mrb_load_irep_buf_cxt(mrb, buf, bufsize, NULL); 645 617 } 646 618 … … 665 637 goto irep_exit; 666 638 } 667 result = read_binary_header(buf, &buf_size, NULL, &flags);639 result = read_binary_header(buf, (size_t)-1, &buf_size, NULL, &flags); 668 640 if (result != MRB_DUMP_OK || buf_size <= header_size) { 669 641 goto irep_exit; … … 674 646 goto irep_exit; 675 647 } 676 irep = read_irep(mrb, buf, FLAG_SRC_MALLOC);648 irep = read_irep(mrb, buf, (size_t)-1, FLAG_SRC_MALLOC); 677 649 678 650 irep_exit: … … 681 653 } 682 654 683 void mrb_codedump_all(mrb_state*, struct RProc*);684 685 655 MRB_API mrb_value 686 656 mrb_load_irep_file_cxt(mrb_state *mrb, FILE* fp, mrbc_context *c) 687 657 { 688 mrb_irep *irep = mrb_read_irep_file(mrb, fp); 689 mrb_value val; 690 struct RProc *proc; 691 692 if (!irep) { 693 irep_error(mrb); 694 return mrb_nil_value(); 695 } 696 proc = mrb_proc_new(mrb, irep); 697 mrb_irep_decref(mrb, irep); 698 if (c && c->dump_result) mrb_codedump_all(mrb, proc); 699 if (c && c->no_exec) return mrb_obj_value(proc); 700 val = mrb_top_run(mrb, proc, mrb_top_self(mrb), 0); 701 return val; 658 return load_irep(mrb, mrb_read_irep_file(mrb, fp), c); 702 659 } 703 660 -
EcnlProtoTool/trunk/mruby-2.1.1/src/mruby_core.rake
r331 r439 12 12 objs += %w(vm error).map { |v| compile_as_cxx "#{current_dir}/#{v}.c", "#{current_build_dir}/#{v}.cxx" } 13 13 end 14 self.libmruby << objs14 self.libmruby_objs << objs 15 15 16 file lib file("#{build_dir}/lib/libmruby_core")=> objs do |t|16 file libmruby_core_static => objs do |t| 17 17 archiver.run t.name, t.prerequisites 18 18 end -
EcnlProtoTool/trunk/mruby-2.1.1/src/numeric.c
r331 r439 5 5 */ 6 6 7 #ifndef MRB_WITHOUT_FLOAT 7 8 #include <float.h> 9 #include <math.h> 10 #endif 8 11 #include <limits.h> 9 #include <math.h>10 12 #include <stdlib.h> 13 #include <string.h> 11 14 12 15 #include <mruby.h> … … 16 19 #include <mruby/class.h> 17 20 21 #ifndef MRB_WITHOUT_FLOAT 18 22 #ifdef MRB_USE_FLOAT 19 23 #define trunc(f) truncf(f) … … 21 25 #define ceil(f) ceilf(f) 22 26 #define fmod(x,y) fmodf(x,y) 23 #define MRB_FLO_TO_STR_FMT "%.7g" 24 #else 25 #define MRB_FLO_TO_STR_FMT "%.14g" 26 #endif 27 27 #define FLO_TO_STR_PREC 8 28 #else 29 #define FLO_TO_STR_PREC 16 30 #endif 31 #endif 32 33 #ifndef MRB_WITHOUT_FLOAT 28 34 MRB_API mrb_float 29 35 mrb_to_flo(mrb_state *mrb, mrb_value val) … … 40 46 } 41 47 48 MRB_API mrb_value 49 mrb_int_value(mrb_state *mrb, mrb_float f) 50 { 51 if (FIXABLE_FLOAT(f)) { 52 return mrb_fixnum_value((mrb_int)f); 53 } 54 return mrb_float_value(mrb, f); 55 } 56 #endif 57 42 58 /* 43 59 * call-seq: … … 50 66 */ 51 67 static mrb_value 52 num_pow(mrb_state *mrb, mrb_value x) 53 { 54 mrb_value y; 68 integral_pow(mrb_state *mrb, mrb_value x) 69 { 70 mrb_value y; 71 #ifndef MRB_WITHOUT_FLOAT 55 72 mrb_float d; 73 #endif 56 74 57 75 mrb_get_args(mrb, "o", &y); … … 62 80 mrb_int result = 1; 63 81 64 if (exp < 0) goto float_pow; 82 if (exp < 0) 83 #ifdef MRB_WITHOUT_FLOAT 84 return mrb_fixnum_value(0); 85 #else 86 goto float_pow; 87 #endif 65 88 for (;;) { 66 89 if (exp & 1) { 67 90 if (mrb_int_mul_overflow(result, base, &result)) { 91 #ifndef MRB_WITHOUT_FLOAT 68 92 goto float_pow; 93 #endif 69 94 } 70 95 } … … 72 97 if (exp == 0) break; 73 98 if (mrb_int_mul_overflow(base, base, &base)) { 99 #ifndef MRB_WITHOUT_FLOAT 74 100 goto float_pow; 101 #endif 75 102 } 76 103 } 77 104 return mrb_fixnum_value(result); 78 105 } 106 #ifdef MRB_WITHOUT_FLOAT 107 mrb_raise(mrb, E_TYPE_ERROR, "non fixnum value"); 108 #else 79 109 float_pow: 80 110 d = pow(mrb_to_flo(mrb, x), mrb_to_flo(mrb, y)); 81 111 return mrb_float_value(mrb, d); 112 #endif 113 } 114 115 static mrb_value 116 integral_idiv(mrb_state *mrb, mrb_value x) 117 { 118 #ifdef MRB_WITHOUT_FLOAT 119 mrb_value y; 120 121 mrb_get_args(mrb, "o", &y); 122 if (!mrb_fixnum_p(y)) { 123 mrb_raise(mrb, E_TYPE_ERROR, "non fixnum value"); 124 } 125 return mrb_fixnum_value(mrb_fixnum(x) / mrb_fixnum(y)); 126 #else 127 mrb_float y; 128 129 mrb_get_args(mrb, "f", &y); 130 return mrb_int_value(mrb, mrb_to_flo(mrb, x) / y); 131 #endif 82 132 } 83 133 … … 93 143 */ 94 144 95 mrb_value96 mrb_num_div(mrb_state *mrb, mrb_value x, mrb_value y)97 {98 return mrb_float_value(mrb, mrb_to_flo(mrb, x) / mrb_to_flo(mrb, y));99 }100 101 145 /* 15.2.9.3.19(x) */ 102 146 /* … … 108 152 109 153 static mrb_value 110 num_div(mrb_state *mrb, mrb_value x) 111 { 154 integral_div(mrb_state *mrb, mrb_value x) 155 { 156 #ifdef MRB_WITHOUT_FLOAT 157 mrb_value y; 158 159 mrb_get_args(mrb, "o", &y); 160 if (!mrb_fixnum_p(y)) { 161 mrb_raise(mrb, E_TYPE_ERROR, "non fixnum value"); 162 } 163 return mrb_fixnum_value(mrb_fixnum(x) / mrb_fixnum(y)); 164 #else 112 165 mrb_float y; 113 166 114 167 mrb_get_args(mrb, "f", &y); 115 168 return mrb_float_value(mrb, mrb_to_flo(mrb, x) / y); 116 } 117 169 #endif 170 } 171 172 static mrb_value 173 integral_coerce_step_counter(mrb_state *mrb, mrb_value self) 174 { 175 mrb_value num, step; 176 177 mrb_get_args(mrb, "oo", &num, &step); 178 179 #ifndef MRB_WITHOUT_FLOAT 180 if (mrb_float_p(self) || mrb_float_p(num) || mrb_float_p(step)) { 181 return mrb_Float(mrb, self); 182 } 183 #endif 184 185 return self; 186 } 187 188 #ifndef MRB_WITHOUT_FLOAT 118 189 /******************************************************************** 119 190 * … … 139 210 flo_to_s(mrb_state *mrb, mrb_value flt) 140 211 { 141 if (isnan(mrb_float(flt))) { 212 mrb_float f = mrb_float(flt); 213 214 if (isinf(f)) { 215 return f < 0 ? mrb_str_new_lit(mrb, "-Infinity") 216 : mrb_str_new_lit(mrb, "Infinity"); 217 } 218 else if (isnan(f)) { 142 219 return mrb_str_new_lit(mrb, "NaN"); 143 220 } 144 return mrb_float_to_str(mrb, flt, MRB_FLO_TO_STR_FMT); 221 else { 222 char fmt[] = "%." MRB_STRINGIZE(FLO_TO_STR_PREC) "g"; 223 mrb_value str = mrb_float_to_str(mrb, flt, fmt); 224 mrb_int len; 225 char *begp, *p, *endp; 226 227 insert_dot_zero: 228 begp = RSTRING_PTR(str); 229 len = RSTRING_LEN(str); 230 for (p = begp, endp = p + len; p < endp; ++p) { 231 if (*p == '.') { 232 return str; 233 } 234 else if (*p == 'e') { 235 ptrdiff_t e_pos = p - begp; 236 mrb_str_cat(mrb, str, ".0", 2); 237 p = RSTRING_PTR(str) + e_pos; 238 memmove(p + 2, p, len - e_pos); 239 memcpy(p, ".0", 2); 240 return str; 241 } 242 } 243 244 if (FLO_TO_STR_PREC + (begp[0] == '-') <= len) { 245 --fmt[sizeof(fmt) - 3]; /* %.16g(%.8g) -> %.15g(%.7g) */ 246 str = mrb_float_to_str(mrb, flt, fmt); 247 goto insert_dot_zero; 248 } 249 250 return str; 251 } 145 252 } 146 253 … … 182 289 183 290 static void 184 flodivmod(mrb_state *mrb, mrb_float x, mrb_float y, mrb_float *divp, mrb_float *modp) 185 { 186 mrb_float div; 187 mrb_float mod; 188 291 flodivmod(mrb_state *mrb, double x, double y, mrb_float *divp, mrb_float *modp) 292 { 293 double div, mod; 294 295 if (isnan(y)) { 296 /* y is NaN so all results are NaN */ 297 div = mod = y; 298 goto exit; 299 } 189 300 if (y == 0.0) { 190 div = INFINITY; 301 if (x == 0) div = NAN; 302 else if (x > 0.0) div = INFINITY; 303 else div = -INFINITY; /* x < 0.0 */ 191 304 mod = NAN; 305 goto exit; 306 } 307 if ((x == 0.0) || (isinf(y) && !isinf(x))) { 308 mod = x; 192 309 } 193 310 else { 194 311 mod = fmod(x, y); 195 if (isinf(x) && isfinite(y)) 196 div = x; 197 else 198 div = (x - mod) / y; 199 if (y*mod < 0) { 200 mod += y; 201 div -= 1.0; 202 } 203 } 204 312 } 313 if (isinf(x) && !isinf(y)) { 314 div = x; 315 } 316 else { 317 div = (x - mod) / y; 318 if (modp && divp) div = round(div); 319 } 320 if (div == 0) div = 0.0; 321 if (mod == 0) mod = 0.0; 322 if (y*mod < 0) { 323 mod += y; 324 div -= 1.0; 325 } 326 exit: 205 327 if (modp) *modp = mod; 206 328 if (divp) *divp = div; … … 230 352 return mrb_float_value(mrb, mod); 231 353 } 354 #endif 232 355 233 356 /* 15.2.8.3.16 */ … … 253 376 } 254 377 378 #ifndef MRB_WITHOUT_FLOAT 255 379 static mrb_value 256 380 flo_eql(mrb_state *mrb, mrb_value x) … … 260 384 mrb_get_args(mrb, "o", &y); 261 385 if (!mrb_float_p(y)) return mrb_false_value(); 262 return mrb_bool_value(mrb_float(x) == (mrb_float)mrb_fixnum(y));386 return mrb_bool_value(mrb_float(x) == mrb_float(y)); 263 387 } 264 388 … … 312 436 int64_value(mrb_state *mrb, int64_t v) 313 437 { 314 if ( FIXABLE(v)) {438 if (TYPED_FIXABLE(v,int64_t)) { 315 439 return mrb_fixnum_value((mrb_int)v); 316 440 } … … 322 446 { 323 447 int64_t v1; 324 mrb_get_args(mrb, "");325 448 v1 = (int64_t)mrb_float(x); 326 449 return int64_value(mrb, ~v1); … … 375 498 while (width++) { 376 499 val /= 2; 500 if (val < 1.0) { 501 val = 0; 502 break; 503 } 377 504 } 378 505 #if defined(_ISOC99_SOURCE) 379 506 val = trunc(val); 380 507 #else 381 val = val > 0 ? floor(val) : ceil(val); 508 if (val > 0){ 509 val = floor(val); 510 } else { 511 val = ceil(val); 512 } 382 513 #endif 383 514 if (val == 0 && mrb_float(x) < 0) { … … 390 521 } 391 522 } 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) 523 return mrb_int_value(mrb, val); 524 } 525 526 static mrb_value 527 flo_rshift(mrb_state *mrb, mrb_value x) 400 528 { 401 529 mrb_int width; … … 406 534 407 535 static mrb_value 408 flo_ rshift(mrb_state *mrb, mrb_value x)536 flo_lshift(mrb_state *mrb, mrb_value x) 409 537 { 410 538 mrb_int width; … … 412 540 mrb_get_args(mrb, "i", &width); 413 541 return flo_shift(mrb, x, width); 414 }415 416 /* 15.2.8.3.18 */417 /*418 * call-seq:419 * flt.hash -> integer420 *421 * Returns a hash code for this float.422 */423 static mrb_value424 flo_hash(mrb_state *mrb, mrb_value num)425 {426 mrb_float d;427 char *c;428 size_t i;429 mrb_int hash;430 431 d = (mrb_float)mrb_fixnum(num);432 /* normalize -0.0 to 0.0 */433 if (d == 0) d = 0.0;434 c = (char*)&d;435 for (hash=0,i=0; i<sizeof(mrb_float); i++) {436 hash = (hash * 971) ^ (unsigned char)c[i];437 }438 if (hash < 0) hash = -hash;439 return mrb_fixnum_value(hash);440 542 } 441 543 … … 525 627 526 628 mrb_check_num_exact(mrb, f); 527 if (!FIXABLE_FLOAT(f)) { 528 return mrb_float_value(mrb, f); 529 } 530 return mrb_fixnum_value((mrb_int)f); 629 return mrb_int_value(mrb, f); 531 630 } 532 631 … … 551 650 552 651 mrb_check_num_exact(mrb, f); 553 if (!FIXABLE_FLOAT(f)) { 554 return mrb_float_value(mrb, f); 555 } 556 return mrb_fixnum_value((mrb_int)f); 652 return mrb_int_value(mrb, f); 557 653 } 558 654 … … 605 701 f = 1.0; 606 702 i = ndigits >= 0 ? ndigits : -ndigits; 703 if (ndigits > DBL_DIG+2) return num; 607 704 while (--i >= 0) 608 705 f = f*10.0; … … 635 732 return mrb_float_value(mrb, number); 636 733 } 637 return mrb_ fixnum_value((mrb_int)number);734 return mrb_int_value(mrb, number); 638 735 } 639 736 … … 643 740 * call-seq: 644 741 * flt.to_i -> integer 645 * flt.to_int -> integer646 742 * flt.truncate -> integer 647 743 * … … 658 754 659 755 mrb_check_num_exact(mrb, f); 660 if (!FIXABLE_FLOAT(f)) { 661 return mrb_float_value(mrb, f); 662 } 663 return mrb_fixnum_value((mrb_int)f); 756 return mrb_int_value(mrb, f); 664 757 } 665 758 … … 669 762 return mrb_bool_value(isnan(mrb_float(num))); 670 763 } 764 #endif 671 765 672 766 /* … … 682 776 * call-seq: 683 777 * int.to_i -> integer 684 * int.to_int -> integer685 778 * 686 779 * As <i>int</i> is already an <code>Integer</code>, all these … … 694 787 } 695 788 696 mrb_value697 mrb_fixnum_mul(mrb_state *mrb, mrb_value x, mrb_value y)789 static mrb_value 790 fixnum_mul(mrb_state *mrb, mrb_value x, mrb_value y) 698 791 { 699 792 mrb_int a; … … 706 799 b = mrb_fixnum(y); 707 800 if (mrb_int_mul_overflow(a, b, &c)) { 801 #ifndef MRB_WITHOUT_FLOAT 708 802 return mrb_float_value(mrb, (mrb_float)a * (mrb_float)b); 803 #endif 709 804 } 710 805 return mrb_fixnum_value(c); 711 806 } 807 #ifdef MRB_WITHOUT_FLOAT 808 mrb_raise(mrb, E_TYPE_ERROR, "non fixnum value"); 809 #else 712 810 return mrb_float_value(mrb, (mrb_float)a * mrb_to_flo(mrb, y)); 811 #endif 812 } 813 814 MRB_API mrb_value 815 mrb_num_mul(mrb_state *mrb, mrb_value x, mrb_value y) 816 { 817 if (mrb_fixnum_p(x)) { 818 return fixnum_mul(mrb, x, y); 819 } 820 #ifndef MRB_WITHOUT_FLOAT 821 if (mrb_float_p(x)) { 822 return mrb_float_value(mrb, mrb_float(x) * mrb_to_flo(mrb, y)); 823 } 824 #endif 825 mrb_raise(mrb, E_TYPE_ERROR, "no number multiply"); 826 return mrb_nil_value(); /* not reached */ 713 827 } 714 828 … … 729 843 730 844 mrb_get_args(mrb, "o", &y); 731 return mrb_fixnum_mul(mrb, x, y);845 return fixnum_mul(mrb, x, y); 732 846 } 733 847 … … 774 888 { 775 889 mrb_value y; 776 mrb_int a ;890 mrb_int a, b; 777 891 778 892 mrb_get_args(mrb, "o", &y); 779 893 a = mrb_fixnum(x); 780 if (mrb_fixnum_p(y)) { 781 mrb_int b, mod; 782 783 if ((b=mrb_fixnum(y)) == 0) { 894 if (mrb_fixnum_p(y) && a != MRB_INT_MIN && (b=mrb_fixnum(y)) != MRB_INT_MIN) { 895 mrb_int mod; 896 897 if (b == 0) { 898 #ifdef MRB_WITHOUT_FLOAT 899 /* ZeroDivisionError */ 900 return mrb_fixnum_value(0); 901 #else 902 if (a > 0) return mrb_float_value(mrb, INFINITY); 903 if (a < 0) return mrb_float_value(mrb, INFINITY); 784 904 return mrb_float_value(mrb, NAN); 785 } 786 fixdivmod(mrb, a, b, 0, &mod); 905 #endif 906 } 907 fixdivmod(mrb, a, b, NULL, &mod); 787 908 return mrb_fixnum_value(mod); 788 909 } 910 #ifdef MRB_WITHOUT_FLOAT 911 mrb_raise(mrb, E_TYPE_ERROR, "non fixnum value"); 912 #else 789 913 else { 790 914 mrb_float mod; 791 915 792 flodivmod(mrb, (mrb_float)a, mrb_to_flo(mrb, y), 0, &mod);916 flodivmod(mrb, (mrb_float)a, mrb_to_flo(mrb, y), NULL, &mod); 793 917 return mrb_float_value(mrb, mod); 794 918 } 919 #endif 795 920 } 796 921 … … 812 937 813 938 if (mrb_fixnum(y) == 0) { 814 return mrb_assoc_new(mrb, mrb_float_value(mrb, INFINITY), 815 mrb_float_value(mrb, NAN)); 939 #ifdef MRB_WITHOUT_FLOAT 940 return mrb_assoc_new(mrb, mrb_fixnum_value(0), mrb_fixnum_value(0)); 941 #else 942 return mrb_assoc_new(mrb, ((mrb_fixnum(x) == 0) ? 943 mrb_float_value(mrb, NAN): 944 mrb_float_value(mrb, INFINITY)), 945 mrb_float_value(mrb, NAN)); 946 #endif 816 947 } 817 948 fixdivmod(mrb, mrb_fixnum(x), mrb_fixnum(y), &div, &mod); 818 949 return mrb_assoc_new(mrb, mrb_fixnum_value(div), mrb_fixnum_value(mod)); 819 950 } 951 #ifdef MRB_WITHOUT_FLOAT 952 mrb_raise(mrb, E_TYPE_ERROR, "non fixnum value"); 953 #else 820 954 else { 821 955 mrb_float div, mod; … … 823 957 824 958 flodivmod(mrb, (mrb_float)mrb_fixnum(x), mrb_to_flo(mrb, y), &div, &mod); 825 a = mrb_ float_value(mrb, (mrb_int)div);959 a = mrb_int_value(mrb, div); 826 960 b = mrb_float_value(mrb, mod); 827 961 return mrb_assoc_new(mrb, a, b); 828 962 } 829 } 830 963 #endif 964 } 965 966 #ifndef MRB_WITHOUT_FLOAT 831 967 static mrb_value 832 968 flo_divmod(mrb_state *mrb, mrb_value x) … … 839 975 840 976 flodivmod(mrb, mrb_float(x), mrb_to_flo(mrb, y), &div, &mod); 841 a = mrb_ float_value(mrb, (mrb_int)div);977 a = mrb_int_value(mrb, div); 842 978 b = mrb_float_value(mrb, mod); 843 979 return mrb_assoc_new(mrb, a, b); 844 980 } 981 #endif 845 982 846 983 /* 15.2.8.3.7 */ … … 865 1002 case MRB_TT_FIXNUM: 866 1003 return mrb_bool_value(mrb_fixnum(x) == mrb_fixnum(y)); 1004 #ifndef MRB_WITHOUT_FLOAT 867 1005 case MRB_TT_FLOAT: 868 1006 return mrb_bool_value((mrb_float)mrb_fixnum(x) == mrb_float(y)); 1007 #endif 869 1008 default: 870 1009 return mrb_false_value(); … … 891 1030 } 892 1031 1032 #ifdef MRB_WITHOUT_FLOAT 1033 #define bit_op(x,y,op1,op2) do {\ 1034 return mrb_fixnum_value(mrb_fixnum(x) op2 mrb_fixnum(y));\ 1035 } while(0) 1036 #else 893 1037 static mrb_value flo_and(mrb_state *mrb, mrb_value x); 894 1038 static mrb_value flo_or(mrb_state *mrb, mrb_value x); … … 896 1040 #define bit_op(x,y,op1,op2) do {\ 897 1041 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)));\1042 return flo_ ## op1(mrb, mrb_float_value(mrb, (mrb_float)mrb_fixnum(x)));\ 899 1043 } while(0) 1044 #endif 900 1045 901 1046 /* 15.2.8.3.9 */ … … 956 1101 { 957 1102 if (width < 0) { /* mrb_int overflow */ 1103 #ifdef MRB_WITHOUT_FLOAT 1104 return mrb_fixnum_value(0); 1105 #else 958 1106 return mrb_float_value(mrb, INFINITY); 1107 #endif 959 1108 } 960 1109 if (val > 0) { 961 1110 if ((width > NUMERIC_SHIFT_WIDTH_MAX) || 962 1111 (val > (MRB_INT_MAX >> width))) { 1112 #ifdef MRB_WITHOUT_FLOAT 1113 return mrb_fixnum_value(-1); 1114 #else 963 1115 goto bit_overflow; 964 } 1116 #endif 1117 } 1118 return mrb_fixnum_value(val << width); 965 1119 } 966 1120 else { 967 1121 if ((width > NUMERIC_SHIFT_WIDTH_MAX) || 968 (val < (MRB_INT_MIN >> width))) { 1122 (val <= (MRB_INT_MIN >> width))) { 1123 #ifdef MRB_WITHOUT_FLOAT 1124 return mrb_fixnum_value(0); 1125 #else 969 1126 goto bit_overflow; 970 } 971 } 972 973 return mrb_fixnum_value(val << width); 974 1127 #endif 1128 } 1129 return mrb_fixnum_value(val * ((mrb_int)1 << width)); 1130 } 1131 1132 #ifndef MRB_WITHOUT_FLOAT 975 1133 bit_overflow: 976 1134 { … … 981 1139 return mrb_float_value(mrb, f); 982 1140 } 1141 #endif 983 1142 } 984 1143 … … 1057 1216 */ 1058 1217 1218 #ifndef MRB_WITHOUT_FLOAT 1059 1219 static mrb_value 1060 1220 fix_to_f(mrb_state *mrb, mrb_value num) … … 1070 1230 * to numerical classes which don't support them. 1071 1231 * 1072 * Float::INFINITY.to_ r1232 * Float::INFINITY.to_i 1073 1233 * 1074 1234 * <em>raises the exception:</em> … … 1089 1249 mrb_float d = mrb_float(x); 1090 1250 1091 if (isinf(d)) { 1092 mrb_raise(mrb, E_FLOATDOMAIN_ERROR, d < 0 ? "-Infinity" : "Infinity"); 1093 } 1094 if (isnan(d)) { 1095 mrb_raise(mrb, E_FLOATDOMAIN_ERROR, "NaN"); 1096 } 1251 mrb_check_num_exact(mrb, d); 1097 1252 if (FIXABLE_FLOAT(d)) { 1098 1253 z = (mrb_int)d; 1099 1254 } 1100 1255 else { 1101 mrb_raisef(mrb, E_ ARGUMENT_ERROR, "number (%S) too big for integer", x);1256 mrb_raisef(mrb, E_RANGE_ERROR, "number (%v) too big for integer", x); 1102 1257 } 1103 1258 } 1104 1259 return mrb_fixnum_value(z); 1105 1260 } 1106 1107 mrb_value 1108 mrb_fixnum_plus(mrb_state *mrb, mrb_value x, mrb_value y) 1261 #endif 1262 1263 static mrb_value 1264 fixnum_plus(mrb_state *mrb, mrb_value x, mrb_value y) 1109 1265 { 1110 1266 mrb_int a; … … 1117 1273 b = mrb_fixnum(y); 1118 1274 if (mrb_int_add_overflow(a, b, &c)) { 1275 #ifndef MRB_WITHOUT_FLOAT 1119 1276 return mrb_float_value(mrb, (mrb_float)a + (mrb_float)b); 1277 #endif 1120 1278 } 1121 1279 return mrb_fixnum_value(c); 1122 1280 } 1281 #ifdef MRB_WITHOUT_FLOAT 1282 mrb_raise(mrb, E_TYPE_ERROR, "non fixnum value"); 1283 #else 1123 1284 return mrb_float_value(mrb, (mrb_float)a + mrb_to_flo(mrb, y)); 1285 #endif 1286 } 1287 1288 MRB_API mrb_value 1289 mrb_num_plus(mrb_state *mrb, mrb_value x, mrb_value y) 1290 { 1291 if (mrb_fixnum_p(x)) { 1292 return fixnum_plus(mrb, x, y); 1293 } 1294 #ifndef MRB_WITHOUT_FLOAT 1295 if (mrb_float_p(x)) { 1296 return mrb_float_value(mrb, mrb_float(x) + mrb_to_flo(mrb, y)); 1297 } 1298 #endif 1299 mrb_raise(mrb, E_TYPE_ERROR, "no number addition"); 1300 return mrb_nil_value(); /* not reached */ 1124 1301 } 1125 1302 … … 1139 1316 1140 1317 mrb_get_args(mrb, "o", &other); 1141 return mrb_fixnum_plus(mrb, self, other);1142 } 1143 1144 mrb_value1145 mrb_fixnum_minus(mrb_state *mrb, mrb_value x, mrb_value y)1318 return fixnum_plus(mrb, self, other); 1319 } 1320 1321 static mrb_value 1322 fixnum_minus(mrb_state *mrb, mrb_value x, mrb_value y) 1146 1323 { 1147 1324 mrb_int a; … … 1153 1330 b = mrb_fixnum(y); 1154 1331 if (mrb_int_sub_overflow(a, b, &c)) { 1332 #ifndef MRB_WITHOUT_FLOAT 1155 1333 return mrb_float_value(mrb, (mrb_float)a - (mrb_float)b); 1334 #endif 1156 1335 } 1157 1336 return mrb_fixnum_value(c); 1158 1337 } 1338 #ifdef MRB_WITHOUT_FLOAT 1339 mrb_raise(mrb, E_TYPE_ERROR, "non fixnum value"); 1340 #else 1159 1341 return mrb_float_value(mrb, (mrb_float)a - mrb_to_flo(mrb, y)); 1342 #endif 1343 } 1344 1345 MRB_API mrb_value 1346 mrb_num_minus(mrb_state *mrb, mrb_value x, mrb_value y) 1347 { 1348 if (mrb_fixnum_p(x)) { 1349 return fixnum_minus(mrb, x, y); 1350 } 1351 #ifndef MRB_WITHOUT_FLOAT 1352 if (mrb_float_p(x)) { 1353 return mrb_float_value(mrb, mrb_float(x) - mrb_to_flo(mrb, y)); 1354 } 1355 #endif 1356 mrb_raise(mrb, E_TYPE_ERROR, "no number subtraction"); 1357 return mrb_nil_value(); /* not reached */ 1160 1358 } 1161 1359 … … 1176 1374 1177 1375 mrb_get_args(mrb, "o", &other); 1178 return mrb_fixnum_minus(mrb, self, other);1376 return fixnum_minus(mrb, self, other); 1179 1377 } 1180 1378 1181 1379 1182 1380 MRB_API mrb_value 1183 mrb_fixnum_to_str(mrb_state *mrb, mrb_value x, int base)1381 mrb_fixnum_to_str(mrb_state *mrb, mrb_value x, mrb_int base) 1184 1382 { 1185 1383 char buf[MRB_INT_BIT+1]; … … 1188 1386 1189 1387 if (base < 2 || 36 < base) { 1190 mrb_raisef(mrb, E_ARGUMENT_ERROR, "invalid radix % S", mrb_fixnum_value(base));1388 mrb_raisef(mrb, E_ARGUMENT_ERROR, "invalid radix %i", base); 1191 1389 } 1192 1390 … … 1232 1430 mrb_get_args(mrb, "|i", &base); 1233 1431 return mrb_fixnum_to_str(mrb, self, base); 1432 } 1433 1434 /* compare two numbers: (1:0:-1; -2 for error) */ 1435 static mrb_int 1436 cmpnum(mrb_state *mrb, mrb_value v1, mrb_value v2) 1437 { 1438 #ifdef MRB_WITHOUT_FLOAT 1439 mrb_int x, y; 1440 #else 1441 mrb_float x, y; 1442 #endif 1443 1444 #ifdef MRB_WITHOUT_FLOAT 1445 x = mrb_fixnum(v1); 1446 #else 1447 x = mrb_to_flo(mrb, v1); 1448 #endif 1449 switch (mrb_type(v2)) { 1450 case MRB_TT_FIXNUM: 1451 #ifdef MRB_WITHOUT_FLOAT 1452 y = mrb_fixnum(v2); 1453 #else 1454 y = (mrb_float)mrb_fixnum(v2); 1455 #endif 1456 break; 1457 #ifndef MRB_WITHOUT_FLOAT 1458 case MRB_TT_FLOAT: 1459 y = mrb_float(v2); 1460 break; 1461 #endif 1462 default: 1463 return -2; 1464 } 1465 if (x > y) 1466 return 1; 1467 else { 1468 if (x < y) 1469 return -1; 1470 return 0; 1471 } 1234 1472 } 1235 1473 … … 1246 1484 */ 1247 1485 static mrb_value 1248 num_cmp(mrb_state *mrb, mrb_value self)1486 integral_cmp(mrb_state *mrb, mrb_value self) 1249 1487 { 1250 1488 mrb_value other; 1251 mrb_ float x, y;1489 mrb_int n; 1252 1490 1253 1491 mrb_get_args(mrb, "o", &other); 1254 1255 x = mrb_to_flo(mrb, self); 1256 switch (mrb_type(other)) { 1492 n = cmpnum(mrb, self, other); 1493 if (n == -2) return mrb_nil_value(); 1494 return mrb_fixnum_value(n); 1495 } 1496 1497 static mrb_noreturn void 1498 cmperr(mrb_state *mrb, mrb_value v1, mrb_value v2) 1499 { 1500 mrb_raisef(mrb, E_ARGUMENT_ERROR, "comparison of %t with %t failed", v1, v2); 1501 } 1502 1503 static mrb_value 1504 integral_lt(mrb_state *mrb, mrb_value self) 1505 { 1506 mrb_value other; 1507 mrb_int n; 1508 1509 mrb_get_args(mrb, "o", &other); 1510 n = cmpnum(mrb, self, other); 1511 if (n == -2) cmperr(mrb, self, other); 1512 if (n < 0) return mrb_true_value(); 1513 return mrb_false_value(); 1514 } 1515 1516 static mrb_value 1517 integral_le(mrb_state *mrb, mrb_value self) 1518 { 1519 mrb_value other; 1520 mrb_int n; 1521 1522 mrb_get_args(mrb, "o", &other); 1523 n = cmpnum(mrb, self, other); 1524 if (n == -2) cmperr(mrb, self, other); 1525 if (n <= 0) return mrb_true_value(); 1526 return mrb_false_value(); 1527 } 1528 1529 static mrb_value 1530 integral_gt(mrb_state *mrb, mrb_value self) 1531 { 1532 mrb_value other; 1533 mrb_int n; 1534 1535 mrb_get_args(mrb, "o", &other); 1536 n = cmpnum(mrb, self, other); 1537 if (n == -2) cmperr(mrb, self, other); 1538 if (n > 0) return mrb_true_value(); 1539 return mrb_false_value(); 1540 } 1541 1542 static mrb_value 1543 integral_ge(mrb_state *mrb, mrb_value self) 1544 { 1545 mrb_value other; 1546 mrb_int n; 1547 1548 mrb_get_args(mrb, "o", &other); 1549 n = cmpnum(mrb, self, other); 1550 if (n == -2) cmperr(mrb, self, other); 1551 if (n >= 0) return mrb_true_value(); 1552 return mrb_false_value(); 1553 } 1554 1555 MRB_API mrb_int 1556 mrb_cmp(mrb_state *mrb, mrb_value obj1, mrb_value obj2) 1557 { 1558 mrb_value v; 1559 1560 switch (mrb_type(obj1)) { 1257 1561 case MRB_TT_FIXNUM: 1258 y = (mrb_float)mrb_fixnum(other);1259 break;1260 1562 case MRB_TT_FLOAT: 1261 y = mrb_float(other); 1262 break; 1563 return cmpnum(mrb, obj1, obj2); 1564 case MRB_TT_STRING: 1565 if (!mrb_string_p(obj2)) 1566 return -2; 1567 return mrb_str_cmp(mrb, obj1, obj2); 1263 1568 default: 1264 return mrb_nil_value(); 1265 } 1266 if (x > y) 1267 return mrb_fixnum_value(1); 1268 else { 1269 if (x < y) 1270 return mrb_fixnum_value(-1); 1271 return mrb_fixnum_value(0); 1272 } 1569 v = mrb_funcall(mrb, obj1, "<=>", 1, obj2); 1570 if (mrb_nil_p(v) || !mrb_fixnum_p(v)) 1571 return -2; 1572 return mrb_fixnum(v); 1573 } 1574 } 1575 1576 static mrb_value 1577 num_finite_p(mrb_state *mrb, mrb_value self) 1578 { 1579 return mrb_true_value(); 1580 } 1581 1582 static mrb_value 1583 num_infinite_p(mrb_state *mrb, mrb_value self) 1584 { 1585 return mrb_false_value(); 1273 1586 } 1274 1587 … … 1281 1594 * and <code>other</code>. 1282 1595 */ 1596 #ifndef MRB_WITHOUT_FLOAT 1283 1597 static mrb_value 1284 1598 flo_plus(mrb_state *mrb, mrb_value x) … … 1289 1603 return mrb_float_value(mrb, mrb_float(x) + mrb_to_flo(mrb, y)); 1290 1604 } 1605 #endif 1291 1606 1292 1607 /* ------------------------------------------------------------------------*/ … … 1294 1609 mrb_init_numeric(mrb_state *mrb) 1295 1610 { 1296 struct RClass *numeric, *integer, *fixnum, *fl; 1611 struct RClass *numeric, *integer, *fixnum, *integral; 1612 #ifndef MRB_WITHOUT_FLOAT 1613 struct RClass *fl; 1614 #endif 1615 1616 integral = mrb_define_module(mrb, "Integral"); 1617 mrb_define_method(mrb, integral,"**", integral_pow, MRB_ARGS_REQ(1)); 1618 mrb_define_method(mrb, integral,"/", integral_div, MRB_ARGS_REQ(1)); /* 15.2.{8,9}.3.6 */ 1619 mrb_define_method(mrb, integral,"quo", integral_div, MRB_ARGS_REQ(1)); /* 15.2.7.4.5 (x) */ 1620 mrb_define_method(mrb, integral,"div", integral_idiv, MRB_ARGS_REQ(1)); 1621 mrb_define_method(mrb, integral,"<=>", integral_cmp, MRB_ARGS_REQ(1)); /* 15.2.{8,9}.3.1 */ 1622 mrb_define_method(mrb, integral,"<", integral_lt, MRB_ARGS_REQ(1)); 1623 mrb_define_method(mrb, integral,"<=", integral_le, MRB_ARGS_REQ(1)); 1624 mrb_define_method(mrb, integral,">", integral_gt, MRB_ARGS_REQ(1)); 1625 mrb_define_method(mrb, integral,">=", integral_ge, MRB_ARGS_REQ(1)); 1626 mrb_define_method(mrb, integral,"__coerce_step_counter", integral_coerce_step_counter, MRB_ARGS_REQ(2)); 1297 1627 1298 1628 /* Numeric Class */ 1299 1629 numeric = mrb_define_class(mrb, "Numeric", mrb->object_class); /* 15.2.7 */ 1300 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 */ 1630 mrb_define_method(mrb, numeric, "finite?", num_finite_p, MRB_ARGS_NONE()); 1631 mrb_define_method(mrb, numeric, "infinite?",num_infinite_p, MRB_ARGS_NONE()); 1305 1632 1306 1633 /* Integer Class */ … … 1310 1637 mrb_define_method(mrb, integer, "to_i", int_to_i, MRB_ARGS_NONE()); /* 15.2.8.3.24 */ 1311 1638 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) */ 1639 #ifndef MRB_WITHOUT_FLOAT 1640 mrb_define_method(mrb, integer, "ceil", int_to_i, MRB_ARGS_NONE()); /* 15.2.8.3.8 (x) */ 1641 mrb_define_method(mrb, integer, "floor", int_to_i, MRB_ARGS_NONE()); /* 15.2.8.3.10 (x) */ 1642 mrb_define_method(mrb, integer, "round", int_to_i, MRB_ARGS_NONE()); /* 15.2.8.3.12 (x) */ 1643 mrb_define_method(mrb, integer, "truncate", int_to_i, MRB_ARGS_NONE()); /* 15.2.8.3.15 (x) */ 1644 #endif 1316 1645 1317 1646 /* Fixnum Class */ … … 1329 1658 mrb_define_method(mrb, fixnum, ">>", fix_rshift, MRB_ARGS_REQ(1)); /* 15.2.8.3.13 */ 1330 1659 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 */ 1660 #ifndef MRB_WITHOUT_FLOAT 1332 1661 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()); 1662 #endif 1663 mrb_define_method(mrb, fixnum, "to_s", fix_to_s, MRB_ARGS_OPT(1)); /* 15.2.8.3.25 */ 1664 mrb_define_method(mrb, fixnum, "inspect", fix_to_s, MRB_ARGS_OPT(1)); 1335 1665 mrb_define_method(mrb, fixnum, "divmod", fix_divmod, MRB_ARGS_REQ(1)); /* 15.2.8.3.30 (x) */ 1336 1666 1667 #ifndef MRB_WITHOUT_FLOAT 1337 1668 /* Float Class */ 1338 1669 mrb->float_class = fl = mrb_define_class(mrb, "Float", numeric); /* 15.2.9 */ … … 1348 1679 mrb_define_method(mrb, fl, "|", flo_or, MRB_ARGS_REQ(1)); 1349 1680 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));1681 mrb_define_method(mrb, fl, ">>", flo_rshift, MRB_ARGS_REQ(1)); 1682 mrb_define_method(mrb, fl, "<<", flo_lshift, MRB_ARGS_REQ(1)); 1352 1683 mrb_define_method(mrb, fl, "ceil", flo_ceil, MRB_ARGS_NONE()); /* 15.2.9.3.8 */ 1353 1684 mrb_define_method(mrb, fl, "finite?", flo_finite_p, MRB_ARGS_NONE()); /* 15.2.9.3.9 */ … … 1372 1703 mrb_define_const(mrb, fl, "NAN", mrb_float_value(mrb, NAN)); 1373 1704 #endif 1374 } 1705 1706 mrb_include_module(mrb, fl, integral); 1707 #endif 1708 } -
EcnlProtoTool/trunk/mruby-2.1.1/src/object.c
r331 r439 25 25 return (mrb_symbol(v1) == mrb_symbol(v2)); 26 26 27 #ifndef MRB_WITHOUT_FLOAT 27 28 case MRB_TT_FLOAT: 28 29 return (mrb_float(v1) == mrb_float(v2)); 30 #endif 29 31 30 32 default: … … 82 84 nil_to_s(mrb_state *mrb, mrb_value obj) 83 85 { 84 return mrb_str_new (mrb, 0, 0);86 return mrb_str_new_frozen(mrb, 0, 0); 85 87 } 86 88 … … 88 90 nil_inspect(mrb_state *mrb, mrb_value obj) 89 91 { 90 return mrb_str_new_lit (mrb, "nil");92 return mrb_str_new_lit_frozen(mrb, "nil"); 91 93 } 92 94 … … 149 151 true_to_s(mrb_state *mrb, mrb_value obj) 150 152 { 151 return mrb_str_new_lit (mrb, "true");153 return mrb_str_new_lit_frozen(mrb, "true"); 152 154 } 153 155 … … 256 258 false_to_s(mrb_state *mrb, mrb_value obj) 257 259 { 258 return mrb_str_new_lit (mrb, "false");260 return mrb_str_new_lit_frozen(mrb, "false"); 259 261 } 260 262 … … 296 298 297 299 static mrb_value 298 inspect_type(mrb_state *mrb, mrb_value val)299 {300 if (mrb_type(val) == MRB_TT_FALSE || mrb_type(val) == MRB_TT_TRUE) {301 return mrb_inspect(mrb, val);302 }303 else {304 return mrb_str_new_cstr(mrb, mrb_obj_classname(mrb, val));305 }306 }307 308 static mrb_value309 300 convert_type(mrb_state *mrb, mrb_value val, const char *tname, const char *method, mrb_bool raise) 310 301 { … … 314 305 if (!mrb_respond_to(mrb, val, m)) { 315 306 if (raise) { 316 mrb_raisef(mrb, E_TYPE_ERROR, "can't convert % S into %S", inspect_type(mrb, val), mrb_str_new_cstr(mrb, tname));307 mrb_raisef(mrb, E_TYPE_ERROR, "can't convert %Y into %s", val, tname); 317 308 } 318 309 return mrb_nil_value(); 319 310 } 320 311 return mrb_funcall_argv(mrb, val, m, 0, 0); 321 }322 323 MRB_API mrb_value324 mrb_check_to_integer(mrb_state *mrb, mrb_value val, const char *method)325 {326 mrb_value v;327 328 if (mrb_fixnum_p(val)) return val;329 v = convert_type(mrb, val, "Integer", method, FALSE);330 if (mrb_nil_p(v) || !mrb_fixnum_p(v)) {331 return mrb_nil_value();332 }333 return v;334 312 } 335 313 … … 342 320 v = convert_type(mrb, val, tname, method, TRUE); 343 321 if (mrb_type(v) != type) { 344 mrb_raisef(mrb, E_TYPE_ERROR, "%S cannot be converted to %S by #%S", val, 345 mrb_str_new_cstr(mrb, tname), mrb_str_new_cstr(mrb, method)); 322 mrb_raisef(mrb, E_TYPE_ERROR, "%v cannot be converted to %s by #%s", val, tname, method); 346 323 } 347 324 return v; … … 374 351 {MRB_TT_SCLASS, "SClass"}, 375 352 {MRB_TT_PROC, "Proc"}, 353 #ifndef MRB_WITHOUT_FLOAT 376 354 {MRB_TT_FLOAT, "Float"}, 355 #endif 377 356 {MRB_TT_ARRAY, "Array"}, 378 357 {MRB_TT_HASH, "Hash"}, … … 406 385 etype = "Fixnum"; 407 386 } 408 else if (mrb_ type(x) == MRB_TT_SYMBOL) {387 else if (mrb_symbol_p(x)) { 409 388 etype = "Symbol"; 410 389 } … … 415 394 etype = mrb_obj_classname(mrb, x); 416 395 } 417 mrb_raisef(mrb, E_TYPE_ERROR, "wrong argument type % S (expected %S)",418 mrb_str_new_cstr(mrb, etype), mrb_str_new_cstr(mrb, type->name));396 mrb_raisef(mrb, E_TYPE_ERROR, "wrong argument type %s (expected %s)", 397 etype, type->name); 419 398 } 420 399 type++; 421 400 } 422 mrb_raisef(mrb, E_TYPE_ERROR, "unknown type %S (%S given)", 423 mrb_fixnum_value(t), mrb_fixnum_value(mrb_type(x))); 401 mrb_raisef(mrb, E_TYPE_ERROR, "unknown type %d (%d given)", t, mrb_type(x)); 424 402 } 425 403 } … … 439 417 mrb_any_to_s(mrb_state *mrb, mrb_value obj) 440 418 { 441 mrb_value str = mrb_str_ buf_new(mrb, 20);419 mrb_value str = mrb_str_new_capa(mrb, 20); 442 420 const char *cname = mrb_obj_classname(mrb, obj); 443 421 444 422 mrb_str_cat_lit(mrb, str, "#<"); 445 423 mrb_str_cat_cstr(mrb, str, cname); 446 mrb_str_cat_lit(mrb, str, ":"); 447 mrb_str_concat(mrb, str, mrb_ptr_to_str(mrb, mrb_ptr(obj))); 424 if (!mrb_immediate_p(obj)) { 425 mrb_str_cat_lit(mrb, str, ":"); 426 mrb_str_cat_str(mrb, str, mrb_ptr_to_str(mrb, mrb_ptr(obj))); 427 } 448 428 mrb_str_cat_lit(mrb, str, ">"); 449 429 … … 502 482 } 503 483 504 static mrb_value505 mrb_to_integer(mrb_state *mrb, mrb_value val, const char *method)506 {507 mrb_value v;508 509 if (mrb_fixnum_p(val)) return val;510 v = convert_type(mrb, val, "Integer", method, TRUE);511 if (!mrb_obj_is_kind_of(mrb, v, mrb->fixnum_class)) {512 mrb_value type = inspect_type(mrb, val);513 mrb_raisef(mrb, E_TYPE_ERROR, "can't convert %S to Integer (%S#%S gives %S)",514 type, type, mrb_str_new_cstr(mrb, method), inspect_type(mrb, v));515 }516 return v;517 }518 519 484 MRB_API mrb_value 520 485 mrb_to_int(mrb_state *mrb, mrb_value val) 521 486 { 522 return mrb_to_integer(mrb, val, "to_int"); 523 } 524 525 MRB_API mrb_value 526 mrb_convert_to_integer(mrb_state *mrb, mrb_value val, int base) 487 488 if (!mrb_fixnum_p(val)) { 489 #ifndef MRB_WITHOUT_FLOAT 490 if (mrb_float_p(val)) { 491 return mrb_flo_to_fixnum(mrb, val); 492 } 493 #endif 494 mrb_raisef(mrb, E_TYPE_ERROR, "can't convert %Y to Integer", val); 495 } 496 return val; 497 } 498 499 MRB_API mrb_value 500 mrb_convert_to_integer(mrb_state *mrb, mrb_value val, mrb_int base) 527 501 { 528 502 mrb_value tmp; … … 530 504 if (mrb_nil_p(val)) { 531 505 if (base != 0) goto arg_error; 532 506 mrb_raise(mrb, E_TYPE_ERROR, "can't convert nil into Integer"); 533 507 } 534 508 switch (mrb_type(val)) { 509 #ifndef MRB_WITHOUT_FLOAT 535 510 case MRB_TT_FLOAT: 536 511 if (base != 0) goto arg_error; 537 else {538 mrb_float f = mrb_float(val);539 if (FIXABLE_FLOAT(f)) {540 break;541 }542 }543 512 return mrb_flo_to_fixnum(mrb, val); 513 #endif 544 514 545 515 case MRB_TT_FIXNUM: … … 563 533 mrb_raise(mrb, E_ARGUMENT_ERROR, "base specified for non string value"); 564 534 } 565 tmp = convert_type(mrb, val, "Integer", "to_int", FALSE); 566 if (mrb_nil_p(tmp)) { 567 return mrb_to_integer(mrb, val, "to_i"); 568 } 569 return tmp; 535 /* to raise TypeError */ 536 return mrb_to_int(mrb, val); 570 537 } 571 538 … … 576 543 } 577 544 545 #ifndef MRB_WITHOUT_FLOAT 578 546 MRB_API mrb_value 579 547 mrb_Float(mrb_state *mrb, mrb_value val) … … 596 564 } 597 565 } 566 #endif 567 568 MRB_API mrb_value 569 mrb_to_str(mrb_state *mrb, mrb_value val) 570 { 571 return mrb_ensure_string_type(mrb, val); 572 } 573 574 /* obsolete: use mrb_ensure_string_type() instead */ 575 MRB_API mrb_value 576 mrb_string_type(mrb_state *mrb, mrb_value str) 577 { 578 return mrb_ensure_string_type(mrb, str); 579 } 580 581 MRB_API mrb_value 582 mrb_ensure_string_type(mrb_state *mrb, mrb_value str) 583 { 584 if (!mrb_string_p(str)) { 585 mrb_raisef(mrb, E_TYPE_ERROR, "%Y cannot be converted to String", str); 586 } 587 return str; 588 } 589 590 MRB_API mrb_value 591 mrb_check_string_type(mrb_state *mrb, mrb_value str) 592 { 593 if (!mrb_string_p(str)) return mrb_nil_value(); 594 return str; 595 } 596 597 MRB_API mrb_value 598 mrb_ensure_array_type(mrb_state *mrb, mrb_value ary) 599 { 600 if (!mrb_array_p(ary)) { 601 mrb_raisef(mrb, E_TYPE_ERROR, "%Y cannot be converted to Array", ary); 602 } 603 return ary; 604 } 605 606 MRB_API mrb_value 607 mrb_check_array_type(mrb_state *mrb, mrb_value ary) 608 { 609 if (!mrb_array_p(ary)) return mrb_nil_value(); 610 return ary; 611 } 612 613 MRB_API mrb_value 614 mrb_ensure_hash_type(mrb_state *mrb, mrb_value hash) 615 { 616 if (!mrb_hash_p(hash)) { 617 mrb_raisef(mrb, E_TYPE_ERROR, "%Y cannot be converted to Hash", hash); 618 } 619 return hash; 620 } 621 622 MRB_API mrb_value 623 mrb_check_hash_type(mrb_state *mrb, mrb_value hash) 624 { 625 if (!mrb_hash_p(hash)) return mrb_nil_value(); 626 return hash; 627 } 598 628 599 629 MRB_API mrb_value -
EcnlProtoTool/trunk/mruby-2.1.1/src/pool.c
r331 r439 5 5 */ 6 6 7 #include <stddef.h>8 #include <stdint.h>9 7 #include <string.h> 10 8 #include <mruby.h> … … 26 24 /* end of configuration section */ 27 25 26 /* Disable MSVC warning "C4200: nonstandard extension used: zero-sized array 27 * in struct/union" when in C++ mode */ 28 #ifdef _MSC_VER 29 #pragma warning(push) 30 #pragma warning(disable : 4200) 31 #endif 32 28 33 struct mrb_pool_page { 29 34 struct mrb_pool_page *next; … … 33 38 char page[]; 34 39 }; 40 41 #ifdef _MSC_VER 42 #pragma warning(pop) 43 #endif 35 44 36 45 struct mrb_pool { -
EcnlProtoTool/trunk/mruby-2.1.1/src/print.c
r331 r439 32 32 { 33 33 mrb_print_backtrace(mrb); 34 printstr(mrb_funcall(mrb, mrb_obj_value(mrb->exc), "inspect", 0), stderr);35 34 } 36 35 -
EcnlProtoTool/trunk/mruby-2.1.1/src/proc.c
r331 r439 10 10 #include <mruby/opcode.h> 11 11 12 static mrb_code call_iseq[] = {13 MKOP_A(OP_CALL, 0),12 static const mrb_code call_iseq[] = { 13 OP_CALL, 14 14 }; 15 15 16 struct RProc 16 struct RProc* 17 17 mrb_proc_new(mrb_state *mrb, mrb_irep *irep) 18 18 { … … 21 21 22 22 p = (struct RProc*)mrb_obj_alloc(mrb, MRB_TT_PROC, mrb->proc_class); 23 p->target_class = 0;24 23 if (ci) { 25 if (ci->proc) 26 p->target_class = ci->proc->target_class; 27 if (!p->target_class) 28 p->target_class = ci->target_class; 24 struct RClass *tc = NULL; 25 26 if (ci->proc) { 27 tc = MRB_PROC_TARGET_CLASS(ci->proc); 28 } 29 if (tc == NULL) { 30 tc = ci->target_class; 31 } 32 p->upper = ci->proc; 33 p->e.target_class = tc; 29 34 } 30 35 p->body.irep = irep; 31 p->env = 0;32 36 mrb_irep_incref(mrb, irep); 33 37 … … 36 40 37 41 static struct REnv* 38 env_new(mrb_state *mrb, int nlocals)42 env_new(mrb_state *mrb, mrb_int nlocals) 39 43 { 40 44 struct REnv *e; 41 42 e = (struct REnv*)mrb_obj_alloc(mrb, MRB_TT_ENV, (struct RClass*)mrb->c->ci->proc->env); 43 MRB_SET_ENV_STACK_LEN(e, nlocals); 44 e->cxt.c = mrb->c; 45 e->cioff = mrb->c->ci - mrb->c->cibase; 45 mrb_callinfo *ci = mrb->c->ci; 46 int bidx; 47 48 e = (struct REnv*)mrb_obj_alloc(mrb, MRB_TT_ENV, NULL); 49 MRB_ENV_SET_STACK_LEN(e, nlocals); 50 bidx = ci->argc; 51 if (ci->argc < 0) bidx = 2; 52 else bidx += 1; 53 MRB_ENV_SET_BIDX(e, bidx); 54 e->mid = ci->mid; 46 55 e->stack = mrb->c->stack; 56 e->cxt = mrb->c; 47 57 48 58 return e; … … 50 60 51 61 static void 52 closure_setup(mrb_state *mrb, struct RProc *p, int nlocals) 53 { 54 struct REnv *e; 55 56 if (!mrb->c->ci->env) { 57 e = env_new(mrb, nlocals); 58 mrb->c->ci->env = e; 59 } 60 else { 61 e = mrb->c->ci->env; 62 } 63 p->env = e; 64 mrb_field_write_barrier(mrb, (struct RBasic *)p, (struct RBasic *)p->env); 65 } 66 67 struct RProc * 62 closure_setup(mrb_state *mrb, struct RProc *p) 63 { 64 mrb_callinfo *ci = mrb->c->ci; 65 struct RProc *up = p->upper; 66 struct REnv *e = NULL; 67 68 if (ci && ci->env) { 69 e = ci->env; 70 } 71 else if (up) { 72 struct RClass *tc = MRB_PROC_TARGET_CLASS(p); 73 74 e = env_new(mrb, up->body.irep->nlocals); 75 ci->env = e; 76 if (tc) { 77 e->c = tc; 78 mrb_field_write_barrier(mrb, (struct RBasic*)e, (struct RBasic*)tc); 79 } 80 if (MRB_PROC_ENV_P(up) && MRB_PROC_ENV(up)->cxt == NULL) { 81 e->mid = MRB_PROC_ENV(up)->mid; 82 } 83 } 84 if (e) { 85 p->e.env = e; 86 p->flags |= MRB_PROC_ENVSET; 87 mrb_field_write_barrier(mrb, (struct RBasic*)p, (struct RBasic*)e); 88 } 89 } 90 91 struct RProc* 68 92 mrb_closure_new(mrb_state *mrb, mrb_irep *irep) 69 93 { 70 94 struct RProc *p = mrb_proc_new(mrb, irep); 71 95 72 closure_setup(mrb, p , mrb->c->ci->proc->body.irep->nlocals);96 closure_setup(mrb, p); 73 97 return p; 74 98 } 75 99 76 MRB_API struct RProc 100 MRB_API struct RProc* 77 101 mrb_proc_new_cfunc(mrb_state *mrb, mrb_func_t func) 78 102 { … … 81 105 p = (struct RProc*)mrb_obj_alloc(mrb, MRB_TT_PROC, mrb->proc_class); 82 106 p->body.func = func; 83 p->flags |= MRB_PROC_CFUNC; 84 p->env = 0; 107 p->flags |= MRB_PROC_CFUNC_FL; 108 p->upper = 0; 109 p->e.target_class = 0; 85 110 86 111 return p; 87 112 } 88 113 89 MRB_API struct RProc 114 MRB_API struct RProc* 90 115 mrb_proc_new_cfunc_with_env(mrb_state *mrb, mrb_func_t func, mrb_int argc, const mrb_value *argv) 91 116 { … … 94 119 int i; 95 120 96 p->env = e = env_new(mrb, argc); 97 mrb_field_write_barrier(mrb, (struct RBasic *)p, (struct RBasic *)p->env); 121 p->e.env = e = env_new(mrb, argc); 122 p->flags |= MRB_PROC_ENVSET; 123 mrb_field_write_barrier(mrb, (struct RBasic*)p, (struct RBasic*)e); 98 124 MRB_ENV_UNSHARE_STACK(e); 99 125 e->stack = (mrb_value*)mrb_malloc(mrb, sizeof(mrb_value) * argc); … … 111 137 } 112 138 113 MRB_API struct RProc 139 MRB_API struct RProc* 114 140 mrb_closure_new_cfunc(mrb_state *mrb, mrb_func_t func, int nlocals) 115 141 { … … 121 147 { 122 148 struct RProc *p = mrb->c->ci->proc; 123 struct REnv *e = p->env;124 125 if (! MRB_PROC_CFUNC_P(p)) {149 struct REnv *e; 150 151 if (!p || !MRB_PROC_CFUNC_P(p)) { 126 152 mrb_raise(mrb, E_TYPE_ERROR, "Can't get cfunc env from non-cfunc proc."); 127 153 } 154 e = MRB_PROC_ENV(p); 128 155 if (!e) { 129 156 mrb_raise(mrb, E_TYPE_ERROR, "Can't get cfunc env from cfunc Proc without REnv."); 130 157 } 131 158 if (idx < 0 || MRB_ENV_STACK_LEN(e) <= idx) { 132 mrb_raisef(mrb, E_INDEX_ERROR, "Env index out of range: % S (expected: 0 <= index < %S)",133 mrb_fixnum_value(idx), mrb_fixnum_value(MRB_ENV_STACK_LEN(e)));159 mrb_raisef(mrb, E_INDEX_ERROR, "Env index out of range: %i (expected: 0 <= index < %i)", 160 idx, MRB_ENV_STACK_LEN(e)); 134 161 } 135 162 … … 140 167 mrb_proc_copy(struct RProc *a, struct RProc *b) 141 168 { 169 if (a->body.irep) { 170 /* already initialized proc */ 171 return; 172 } 142 173 a->flags = b->flags; 143 174 a->body = b->body; … … 145 176 a->body.irep->refcnt++; 146 177 } 147 a->target_class = b->target_class; 148 a->env = b->env; 178 a->upper = b->upper; 179 a->e.env = b->e.env; 180 /* a->e.target_class = a->e.target_class; */ 149 181 } 150 182 … … 156 188 struct RProc *p; 157 189 158 mrb_get_args(mrb, "&", &blk); 159 if (mrb_nil_p(blk)) { 160 /* Calling Proc.new without a block is not implemented yet */ 161 mrb_raise(mrb, E_ARGUMENT_ERROR, "tried to create Proc object without a block"); 162 } 190 /* Calling Proc.new without a block is not implemented yet */ 191 mrb_get_args(mrb, "&!", &blk); 163 192 p = (struct RProc *)mrb_obj_alloc(mrb, MRB_TT_PROC, mrb_class_ptr(proc_class)); 164 193 mrb_proc_copy(p, mrb_proc_ptr(blk)); 165 194 proc = mrb_obj_value(p); 166 mrb_funcall_with_block(mrb, proc, mrb_intern_lit(mrb, "initialize"), 0, NULL, blk); 195 mrb_funcall_with_block(mrb, proc, mrb_intern_lit(mrb, "initialize"), 0, NULL, proc); 196 if (!MRB_PROC_STRICT_P(p) && 197 mrb->c->ci > mrb->c->cibase && MRB_PROC_ENV(p) == mrb->c->ci[-1].env) { 198 p->flags |= MRB_PROC_ORPHAN; 199 } 167 200 return proc; 168 201 } … … 174 207 175 208 mrb_get_args(mrb, "o", &proc); 176 if ( mrb_type(proc) != MRB_TT_PROC) {209 if (!mrb_proc_p(proc)) { 177 210 mrb_raise(mrb, E_ARGUMENT_ERROR, "not a proc"); 178 211 } … … 181 214 } 182 215 183 int184 mrb_proc_cfunc_p(struct RProc *p)185 {186 return MRB_PROC_CFUNC_P(p);187 }188 189 mrb_value190 mrb_proc_call_cfunc(mrb_state *mrb, struct RProc *p, mrb_value self)191 {192 return (p->body.func)(mrb, self);193 }194 195 216 /* 15.2.17.4.2 */ 196 217 static mrb_value 197 mrb_proc_arity(mrb_state *mrb, mrb_value self) 198 { 199 struct RProc *p = mrb_proc_ptr(self); 200 struct mrb_irep *irep; 201 mrb_code *iseq; 202 mrb_aspec aspec; 203 int ma, op, ra, pa, arity; 204 205 if (MRB_PROC_CFUNC_P(p)) { 206 /* TODO cfunc aspec not implemented yet */ 207 return mrb_fixnum_value(-1); 208 } 209 210 irep = p->body.irep; 211 if (!irep) { 212 return mrb_fixnum_value(0); 213 } 214 215 iseq = irep->iseq; 216 /* arity is depend on OP_ENTER */ 217 if (GET_OPCODE(*iseq) != OP_ENTER) { 218 return mrb_fixnum_value(0); 219 } 220 221 aspec = GETARG_Ax(*iseq); 222 ma = MRB_ASPEC_REQ(aspec); 223 op = MRB_ASPEC_OPT(aspec); 224 ra = MRB_ASPEC_REST(aspec); 225 pa = MRB_ASPEC_POST(aspec); 226 arity = ra || (MRB_PROC_STRICT_P(p) && op) ? -(ma + pa + 1) : ma + pa; 227 228 return mrb_fixnum_value(arity); 218 proc_arity(mrb_state *mrb, mrb_value self) 219 { 220 return mrb_fixnum_value(mrb_proc_arity(mrb_proc_ptr(self))); 229 221 } 230 222 … … 248 240 mrb_raise(mrb, E_ARGUMENT_ERROR, "tried to create Proc object without a block"); 249 241 } 250 if ( mrb_type(blk) != MRB_TT_PROC) {242 if (!mrb_proc_p(blk)) { 251 243 mrb_raise(mrb, E_ARGUMENT_ERROR, "not a proc"); 252 244 } … … 261 253 } 262 254 255 mrb_int 256 mrb_proc_arity(const struct RProc *p) 257 { 258 struct mrb_irep *irep; 259 const mrb_code *pc; 260 mrb_aspec aspec; 261 int ma, op, ra, pa, arity; 262 263 if (MRB_PROC_CFUNC_P(p)) { 264 /* TODO cfunc aspec not implemented yet */ 265 return -1; 266 } 267 268 irep = p->body.irep; 269 if (!irep) { 270 return 0; 271 } 272 273 pc = irep->iseq; 274 /* arity is depend on OP_ENTER */ 275 if (*pc != OP_ENTER) { 276 return 0; 277 } 278 279 aspec = PEEK_W(pc+1); 280 ma = MRB_ASPEC_REQ(aspec); 281 op = MRB_ASPEC_OPT(aspec); 282 ra = MRB_ASPEC_REST(aspec); 283 pa = MRB_ASPEC_POST(aspec); 284 arity = ra || (MRB_PROC_STRICT_P(p) && op) ? -(ma + pa + 1) : ma + pa; 285 286 return arity; 287 } 288 263 289 void 264 290 mrb_init_proc(mrb_state *mrb) 265 291 { 266 struct RProc *m; 292 struct RProc *p; 293 mrb_method_t m; 267 294 mrb_irep *call_irep = (mrb_irep *)mrb_malloc(mrb, sizeof(mrb_irep)); 268 295 static const mrb_irep mrb_irep_zero = { 0 }; … … 274 301 call_irep->nregs = 2; /* receiver and block */ 275 302 276 mrb_define_class_method(mrb, mrb->proc_class, "new", mrb_proc_s_new, MRB_ARGS_ ANY());303 mrb_define_class_method(mrb, mrb->proc_class, "new", mrb_proc_s_new, MRB_ARGS_NONE()|MRB_ARGS_BLOCK()); 277 304 mrb_define_method(mrb, mrb->proc_class, "initialize_copy", mrb_proc_init_copy, MRB_ARGS_REQ(1)); 278 mrb_define_method(mrb, mrb->proc_class, "arity", mrb_proc_arity, MRB_ARGS_NONE()); 279 280 m = mrb_proc_new(mrb, call_irep); 305 mrb_define_method(mrb, mrb->proc_class, "arity", proc_arity, MRB_ARGS_NONE()); 306 307 p = mrb_proc_new(mrb, call_irep); 308 MRB_METHOD_FROM_PROC(m, p); 281 309 mrb_define_method_raw(mrb, mrb->proc_class, mrb_intern_lit(mrb, "call"), m); 282 310 mrb_define_method_raw(mrb, mrb->proc_class, mrb_intern_lit(mrb, "[]"), m); 283 311 284 mrb_define_class_method(mrb, mrb->kernel_module, "lambda", proc_lambda, MRB_ARGS_NONE() ); /* 15.3.1.2.6 */285 mrb_define_method(mrb, mrb->kernel_module, "lambda", proc_lambda, MRB_ARGS_NONE() ); /* 15.3.1.3.27 */286 } 312 mrb_define_class_method(mrb, mrb->kernel_module, "lambda", proc_lambda, MRB_ARGS_NONE()|MRB_ARGS_BLOCK()); /* 15.3.1.2.6 */ 313 mrb_define_method(mrb, mrb->kernel_module, "lambda", proc_lambda, MRB_ARGS_NONE()|MRB_ARGS_BLOCK()); /* 15.3.1.3.27 */ 314 } -
EcnlProtoTool/trunk/mruby-2.1.1/src/range.c
r331 r439 11 11 #include <mruby/array.h> 12 12 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 } 13 #define RANGE_INITIALIZED_MASK 1 14 #define RANGE_INITIALIZED(p) ((p)->flags |= RANGE_INITIALIZED_MASK) 15 #define RANGE_INITIALIZED_P(p) ((p)->flags & RANGE_INITIALIZED_MASK) 25 16 26 17 static void 27 range_check(mrb_state *mrb, mrb_value a, mrb_value b) 28 { 29 mrb_value ans; 18 r_check(mrb_state *mrb, mrb_value a, mrb_value b) 19 { 30 20 enum mrb_vtype ta; 31 21 enum mrb_vtype tb; 22 mrb_int n; 32 23 33 24 ta = mrb_type(a); 34 25 tb = mrb_type(b); 26 #ifdef MRB_WITHOUT_FLOAT 27 if (ta == MRB_TT_FIXNUM && tb == MRB_TT_FIXNUM ) { 28 #else 35 29 if ((ta == MRB_TT_FIXNUM || ta == MRB_TT_FLOAT) && 36 30 (tb == MRB_TT_FIXNUM || tb == MRB_TT_FLOAT)) { 31 #endif 37 32 return; 38 33 } 39 34 40 ans = mrb_funcall(mrb, a, "<=>", 1, b); 41 if (mrb_nil_p(ans)) { 42 /* can not be compared */ 35 n = mrb_cmp(mrb, a, b); 36 if (n == -2) { /* can not be compared */ 43 37 mrb_raise(mrb, E_ARGUMENT_ERROR, "bad value for range"); 44 38 } 45 39 } 46 40 47 MRB_API mrb_value 48 mrb_range_new(mrb_state *mrb, mrb_value beg, mrb_value end, mrb_bool excl) 49 { 50 struct RRange *r; 51 52 range_check(mrb, beg, end); 53 r = (struct RRange*)mrb_obj_alloc(mrb, MRB_TT_RANGE, RANGE_CLASS); 41 static mrb_bool 42 r_le(mrb_state *mrb, mrb_value a, mrb_value b) 43 { 44 mrb_int n = mrb_cmp(mrb, a, b); 45 46 if (n == 0 || n == -1) return TRUE; 47 return FALSE; 48 } 49 50 static mrb_bool 51 r_gt(mrb_state *mrb, mrb_value a, mrb_value b) 52 { 53 return mrb_cmp(mrb, a, b) == 1; 54 } 55 56 static mrb_bool 57 r_ge(mrb_state *mrb, mrb_value a, mrb_value b) 58 { 59 mrb_int n = mrb_cmp(mrb, a, b); 60 61 if (n == 0 || n == 1) return TRUE; 62 return FALSE; 63 } 64 65 static void 66 range_ptr_alloc_edges(mrb_state *mrb, struct RRange *r) 67 { 68 #ifndef MRB_RANGE_EMBED 54 69 r->edges = (mrb_range_edges *)mrb_malloc(mrb, sizeof(mrb_range_edges)); 55 r->edges->beg = beg; 56 r->edges->end = end; 57 r->excl = excl; 58 return mrb_range_value(r); 70 #endif 71 } 72 73 static struct RRange * 74 range_ptr_init(mrb_state *mrb, struct RRange *r, mrb_value beg, mrb_value end, mrb_bool excl) 75 { 76 r_check(mrb, beg, end); 77 78 if (r) { 79 if (RANGE_INITIALIZED_P(r)) { 80 /* Ranges are immutable, so that they should be initialized only once. */ 81 mrb_name_error(mrb, mrb_intern_lit(mrb, "initialize"), "'initialize' called twice"); 82 } 83 else { 84 range_ptr_alloc_edges(mrb, r); 85 } 86 } 87 else { 88 r = (struct RRange*)mrb_obj_alloc(mrb, MRB_TT_RANGE, mrb->range_class); 89 range_ptr_alloc_edges(mrb, r); 90 } 91 92 RANGE_BEG(r) = beg; 93 RANGE_END(r) = end; 94 RANGE_EXCL(r) = excl; 95 RANGE_INITIALIZED(r); 96 97 return r; 98 } 99 100 static void 101 range_ptr_replace(mrb_state *mrb, struct RRange *r, mrb_value beg, mrb_value end, mrb_bool excl) 102 { 103 range_ptr_init(mrb, r, beg, end, excl); 104 mrb_write_barrier(mrb, (struct RBasic*)r); 59 105 } 60 106 … … 66 112 * Returns the first object in <i>rng</i>. 67 113 */ 68 mrb_value 69 mrb_range_beg(mrb_state *mrb, mrb_value range) 70 { 71 struct RRange *r = mrb_range_ptr(mrb, range); 72 73 return r->edges->beg; 114 static mrb_value 115 range_beg(mrb_state *mrb, mrb_value range) 116 { 117 return mrb_range_beg(mrb, range); 74 118 } 75 119 … … 84 128 * (1...10).end #=> 10 85 129 */ 86 87 mrb_value 88 mrb_range_end(mrb_state *mrb, mrb_value range) 89 { 90 struct RRange *r = mrb_range_ptr(mrb, range); 91 92 return r->edges->end; 130 static mrb_value 131 range_end(mrb_state *mrb, mrb_value range) 132 { 133 return mrb_range_end(mrb, range); 93 134 } 94 135 … … 99 140 * Returns <code>true</code> if <i>range</i> excludes its end value. 100 141 */ 101 mrb_value 102 mrb_range_excl(mrb_state *mrb, mrb_value range) 103 { 104 struct RRange *r = mrb_range_ptr(mrb, range); 105 106 return mrb_bool_value(r->excl); 107 } 108 109 static void 110 range_init(mrb_state *mrb, mrb_value range, mrb_value beg, mrb_value end, mrb_bool exclude_end) 111 { 112 struct RRange *r = mrb_range_raw_ptr(range); 113 114 range_check(mrb, beg, end); 115 r->excl = exclude_end; 116 if (!r->edges) { 117 r->edges = (mrb_range_edges *)mrb_malloc(mrb, sizeof(mrb_range_edges)); 118 } 119 r->edges->beg = beg; 120 r->edges->end = end; 121 } 142 static mrb_value 143 range_excl(mrb_state *mrb, mrb_value range) 144 { 145 return mrb_bool_value(mrb_range_excl_p(mrb, range)); 146 } 147 122 148 /* 123 149 * call-seq: … … 128 154 * the end object; otherwise, it will be excluded. 129 155 */ 130 131 mrb_value 132 mrb_range_initialize(mrb_state *mrb, mrb_value range) 156 static mrb_value 157 range_initialize(mrb_state *mrb, mrb_value range) 133 158 { 134 159 mrb_value beg, end; 135 mrb_bool exclusive; 136 int n; 137 138 n = mrb_get_args(mrb, "oo|b", &beg, &end, &exclusive); 139 if (n != 3) { 140 exclusive = FALSE; 141 } 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 } 146 range_init(mrb, range, beg, end, exclusive); 160 mrb_bool exclusive = FALSE; 161 162 mrb_get_args(mrb, "oo|b", &beg, &end, &exclusive); 163 range_ptr_replace(mrb, mrb_range_raw_ptr(range), beg, end, exclusive); 147 164 return range; 148 165 } 166 149 167 /* 150 168 * call-seq: … … 159 177 * (0..2) == Range.new(0,2) #=> true 160 178 * (0..2) == (0...2) #=> false 161 * 162 */ 163 164 mrb_value 165 mrb_range_eq(mrb_state *mrb, mrb_value range) 179 */ 180 static mrb_value 181 range_eq(mrb_state *mrb, mrb_value range) 166 182 { 167 183 struct RRange *rr; 168 184 struct RRange *ro; 169 mrb_value obj, v1, v2; 185 mrb_value obj; 186 mrb_bool v1, v2; 170 187 171 188 mrb_get_args(mrb, "o", &obj); … … 178 195 rr = mrb_range_ptr(mrb, range); 179 196 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) {197 v1 = mrb_equal(mrb, RANGE_BEG(rr), RANGE_BEG(ro)); 198 v2 = mrb_equal(mrb, RANGE_END(rr), RANGE_END(ro)); 199 if (!v1 || !v2 || RANGE_EXCL(rr) != RANGE_EXCL(ro)) { 183 200 return mrb_false_value(); 184 201 } 185 202 return mrb_true_value(); 186 }187 188 static mrb_bool189 r_le(mrb_state *mrb, mrb_value a, mrb_value b)190 {191 mrb_value r = mrb_funcall(mrb, a, "<=>", 1, b); /* compare result */192 /* output :a < b => -1, a = b => 0, a > b => +1 */193 194 if (mrb_fixnum_p(r)) {195 mrb_int c = mrb_fixnum(r);196 if (c == 0 || c == -1) return TRUE;197 }198 199 return FALSE;200 }201 202 static mrb_bool203 r_gt(mrb_state *mrb, mrb_value a, mrb_value b)204 {205 mrb_value r = mrb_funcall(mrb, a, "<=>", 1, b);206 /* output :a < b => -1, a = b => 0, a > b => +1 */207 208 return mrb_fixnum_p(r) && mrb_fixnum(r) == 1;209 }210 211 static mrb_bool212 r_ge(mrb_state *mrb, mrb_value a, mrb_value b)213 {214 mrb_value r = mrb_funcall(mrb, a, "<=>", 1, b); /* compare result */215 /* output :a < b => -1, a = b => 0, a > b => +1 */216 217 if (mrb_fixnum_p(r)) {218 mrb_int c = mrb_fixnum(r);219 if (c == 0 || c == 1) return TRUE;220 }221 222 return FALSE;223 203 } 224 204 … … 228 208 * range.member?(val) => true or false 229 209 * range.include?(val) => true or false 230 * 231 */ 232 mrb_value 233 mrb_range_include(mrb_state *mrb, mrb_value range) 210 */ 211 static mrb_value 212 range_include(mrb_state *mrb, mrb_value range) 234 213 { 235 214 mrb_value val; … … 240 219 mrb_get_args(mrb, "o", &val); 241 220 242 beg = r->edges->beg;243 end = r->edges->end;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 */221 beg = RANGE_BEG(r); 222 end = RANGE_END(r); 223 include_p = r_le(mrb, beg, val) && /* beg <= val */ 224 (RANGE_EXCL(r) ? r_gt(mrb, end, val) /* end > val */ 225 : r_ge(mrb, end, val)); /* end >= val */ 247 226 248 227 return mrb_bool_value(include_p); 249 }250 251 MRB_API mrb_int252 mrb_range_beg_len(mrb_state *mrb, mrb_value range, mrb_int *begp, mrb_int *lenp, mrb_int len, mrb_bool trunc)253 {254 mrb_int beg, end;255 struct RRange *r;256 257 if (mrb_type(range) != MRB_TT_RANGE) return 0;258 r = mrb_range_ptr(mrb, range);259 260 beg = mrb_int(mrb, r->edges->beg);261 end = mrb_int(mrb, r->edges->end);262 263 if (beg < 0) {264 beg += len;265 if (beg < 0) return 2;266 }267 268 if (trunc) {269 if (beg > len) return 2;270 if (end > len) end = len;271 }272 273 if (end < 0) end += len;274 if (!r->excl && (!trunc || end < len))275 end++; /* include end point */276 len = end - beg;277 if (len < 0) len = 0;278 279 *begp = beg;280 *lenp = len;281 return 1;282 228 } 283 229 … … 289 235 * Convert this range object to a printable form. 290 236 */ 291 292 237 static mrb_value 293 238 range_to_s(mrb_state *mrb, mrb_value range) … … 296 241 struct RRange *r = mrb_range_ptr(mrb, range); 297 242 298 str = mrb_obj_as_string(mrb, r->edges->beg);299 str2 = mrb_obj_as_string(mrb, r->edges->end);243 str = mrb_obj_as_string(mrb, RANGE_BEG(r)); 244 str2 = mrb_obj_as_string(mrb, RANGE_END(r)); 300 245 str = mrb_str_dup(mrb, str); 301 mrb_str_cat(mrb, str, "...", r->excl? 3 : 2);246 mrb_str_cat(mrb, str, "...", RANGE_EXCL(r) ? 3 : 2); 302 247 mrb_str_cat_str(mrb, str, str2); 303 248 … … 314 259 * objects). 315 260 */ 316 317 261 static mrb_value 318 262 range_inspect(mrb_state *mrb, mrb_value range) … … 321 265 struct RRange *r = mrb_range_ptr(mrb, range); 322 266 323 str = mrb_inspect(mrb, r->edges->beg);324 str2 = mrb_inspect(mrb, r->edges->end);267 str = mrb_inspect(mrb, RANGE_BEG(r)); 268 str2 = mrb_inspect(mrb, RANGE_END(r)); 325 269 str = mrb_str_dup(mrb, str); 326 mrb_str_cat(mrb, str, "...", r->excl? 3 : 2);270 mrb_str_cat(mrb, str, "...", RANGE_EXCL(r) ? 3 : 2); 327 271 mrb_str_cat_str(mrb, str, str2); 328 272 … … 342 286 * (0..2).eql?(Range.new(0,2)) #=> true 343 287 * (0..2).eql?(0...2) #=> false 344 * 345 */ 346 288 */ 347 289 static mrb_value 348 290 range_eql(mrb_state *mrb, mrb_value range) … … 354 296 355 297 if (mrb_obj_equal(mrb, range, obj)) return mrb_true_value(); 356 if (!mrb_obj_is_kind_of(mrb, obj, RANGE_CLASS)) { 357 return mrb_false_value(); 358 } 359 if (mrb_type(obj) != MRB_TT_RANGE) return mrb_false_value(); 298 if (!mrb_obj_is_kind_of(mrb, obj, mrb->range_class)) return mrb_false_value(); 299 if (!mrb_range_p(obj)) return mrb_false_value(); 360 300 361 301 r = mrb_range_ptr(mrb, range); 362 302 o = mrb_range_ptr(mrb, obj); 363 if (!mrb_eql(mrb, r->edges->beg, o->edges->beg) ||364 !mrb_eql(mrb, r->edges->end, o->edges->end) ||365 ( r->excl != o->excl)) {303 if (!mrb_eql(mrb, RANGE_BEG(r), RANGE_BEG(o)) || 304 !mrb_eql(mrb, RANGE_END(r), RANGE_END(o)) || 305 (RANGE_EXCL(r) != RANGE_EXCL(o))) { 366 306 return mrb_false_value(); 367 307 } … … 384 324 385 325 r = mrb_range_ptr(mrb, src); 386 range_ init(mrb, copy, r->edges->beg, r->edges->end, r->excl);326 range_ptr_replace(mrb, mrb_range_raw_ptr(copy), RANGE_BEG(r), RANGE_END(r), RANGE_EXCL(r)); 387 327 388 328 return copy; … … 400 340 mrb_ary_push(mrb, result, func(mrb, obj, mrb_fixnum(argv[i]))); 401 341 } 402 else if (mrb_range_beg_len(mrb, argv[i], &beg, &len, olen, FALSE) == 1) {342 else if (mrb_range_beg_len(mrb, argv[i], &beg, &len, olen, FALSE) == MRB_RANGE_OK) { 403 343 mrb_int const end = olen < beg + len ? olen : beg + len; 404 344 for (j = beg; j < end; ++j) { … … 411 351 } 412 352 else { 413 mrb_raisef(mrb, E_TYPE_ERROR, "invalid values selector: % S", argv[i]);353 mrb_raisef(mrb, E_TYPE_ERROR, "invalid values selector: %v", argv[i]); 414 354 } 415 355 } 416 356 417 357 return result; 358 } 359 360 void 361 mrb_gc_mark_range(mrb_state *mrb, struct RRange *r) 362 { 363 if (RANGE_INITIALIZED_P(r)) { 364 mrb_gc_mark_value(mrb, RANGE_BEG(r)); 365 mrb_gc_mark_value(mrb, RANGE_END(r)); 366 } 367 } 368 369 MRB_API struct RRange* 370 mrb_range_ptr(mrb_state *mrb, mrb_value range) 371 { 372 struct RRange *r = mrb_range_raw_ptr(range); 373 374 /* check for if #initialize_copy was removed [#3320] */ 375 if (!RANGE_INITIALIZED_P(r)) { 376 mrb_raise(mrb, E_ARGUMENT_ERROR, "uninitialized range"); 377 } 378 return r; 379 } 380 381 MRB_API mrb_value 382 mrb_range_new(mrb_state *mrb, mrb_value beg, mrb_value end, mrb_bool excl) 383 { 384 struct RRange *r = range_ptr_init(mrb, NULL, beg, end, excl); 385 return mrb_range_value(r); 386 } 387 388 MRB_API enum mrb_range_beg_len 389 mrb_range_beg_len(mrb_state *mrb, mrb_value range, mrb_int *begp, mrb_int *lenp, mrb_int len, mrb_bool trunc) 390 { 391 mrb_int beg, end; 392 struct RRange *r; 393 394 if (!mrb_range_p(range)) return MRB_RANGE_TYPE_MISMATCH; 395 r = mrb_range_ptr(mrb, range); 396 397 beg = mrb_int(mrb, RANGE_BEG(r)); 398 end = mrb_int(mrb, RANGE_END(r)); 399 400 if (beg < 0) { 401 beg += len; 402 if (beg < 0) return MRB_RANGE_OUT; 403 } 404 405 if (trunc) { 406 if (beg > len) return MRB_RANGE_OUT; 407 if (end > len) end = len; 408 } 409 410 if (end < 0) end += len; 411 if (!RANGE_EXCL(r) && (!trunc || end < len)) end++; /* include end point */ 412 len = end - beg; 413 if (len < 0) len = 0; 414 415 *begp = beg; 416 *lenp = len; 417 return MRB_RANGE_OK; 418 418 } 419 419 … … 424 424 425 425 r = mrb_define_class(mrb, "Range", mrb->object_class); /* 15.2.14 */ 426 mrb->range_class = r; 426 427 MRB_SET_INSTANCE_TT(r, MRB_TT_RANGE); 427 428 428 mrb_define_method(mrb, r, "begin", mrb_range_beg, MRB_ARGS_NONE()); /* 15.2.14.4.3 */ 429 mrb_define_method(mrb, r, "end", mrb_range_end, MRB_ARGS_NONE()); /* 15.2.14.4.5 */ 430 mrb_define_method(mrb, r, "==", mrb_range_eq, MRB_ARGS_REQ(1)); /* 15.2.14.4.1 */ 431 mrb_define_method(mrb, r, "===", mrb_range_include, MRB_ARGS_REQ(1)); /* 15.2.14.4.2 */ 432 mrb_define_method(mrb, r, "exclude_end?", mrb_range_excl, MRB_ARGS_NONE()); /* 15.2.14.4.6 */ 433 mrb_define_method(mrb, r, "first", mrb_range_beg, MRB_ARGS_NONE()); /* 15.2.14.4.7 */ 434 mrb_define_method(mrb, r, "include?", mrb_range_include, MRB_ARGS_REQ(1)); /* 15.2.14.4.8 */ 435 mrb_define_method(mrb, r, "initialize", mrb_range_initialize, MRB_ARGS_ANY()); /* 15.2.14.4.9 */ 436 mrb_define_method(mrb, r, "last", mrb_range_end, MRB_ARGS_NONE()); /* 15.2.14.4.10 */ 437 mrb_define_method(mrb, r, "member?", mrb_range_include, MRB_ARGS_REQ(1)); /* 15.2.14.4.11 */ 438 429 mrb_define_method(mrb, r, "begin", range_beg, MRB_ARGS_NONE()); /* 15.2.14.4.3 */ 430 mrb_define_method(mrb, r, "end", range_end, MRB_ARGS_NONE()); /* 15.2.14.4.5 */ 431 mrb_define_method(mrb, r, "==", range_eq, MRB_ARGS_REQ(1)); /* 15.2.14.4.1 */ 432 mrb_define_method(mrb, r, "===", range_include, MRB_ARGS_REQ(1)); /* 15.2.14.4.2 */ 433 mrb_define_method(mrb, r, "exclude_end?", range_excl, MRB_ARGS_NONE()); /* 15.2.14.4.6 */ 434 mrb_define_method(mrb, r, "first", range_beg, MRB_ARGS_NONE()); /* 15.2.14.4.7 */ 435 mrb_define_method(mrb, r, "include?", range_include, MRB_ARGS_REQ(1)); /* 15.2.14.4.8 */ 436 mrb_define_method(mrb, r, "initialize", range_initialize, MRB_ARGS_ANY()); /* 15.2.14.4.9 */ 437 mrb_define_method(mrb, r, "last", range_end, MRB_ARGS_NONE()); /* 15.2.14.4.10 */ 438 mrb_define_method(mrb, r, "member?", range_include, MRB_ARGS_REQ(1)); /* 15.2.14.4.11 */ 439 439 mrb_define_method(mrb, r, "to_s", range_to_s, MRB_ARGS_NONE()); /* 15.2.14.4.12(x) */ 440 440 mrb_define_method(mrb, r, "inspect", range_inspect, MRB_ARGS_NONE()); /* 15.2.14.4.13(x) */ -
EcnlProtoTool/trunk/mruby-2.1.1/src/state.c
r331 r439 12 12 #include <mruby/debug.h> 13 13 #include <mruby/string.h> 14 #include <mruby/class.h> 14 15 15 16 void mrb_init_core(mrb_state*); … … 18 19 void mrb_gc_init(mrb_state*, mrb_gc *gc); 19 20 void mrb_gc_destroy(mrb_state*, mrb_gc *gc); 20 21 static mrb_value22 inspect_main(mrb_state *mrb, mrb_value mod)23 {24 return mrb_str_new_lit(mrb, "main");25 }26 21 27 22 MRB_API mrb_state* … … 32 27 mrb_state *mrb; 33 28 29 if (f == NULL) f = mrb_default_allocf; 34 30 mrb = (mrb_state *)(f)(NULL, NULL, sizeof(mrb_state), ud); 35 31 if (mrb == NULL) return NULL; … … 62 58 } 63 59 64 struct alloca_header {65 struct alloca_header *next;66 char buf[];67 };68 69 MRB_API void*70 mrb_alloca(mrb_state *mrb, size_t size)71 {72 struct alloca_header *p;73 74 p = (struct alloca_header*) mrb_malloc(mrb, sizeof(struct alloca_header)+size);75 p->next = mrb->mems;76 mrb->mems = p;77 return (void*)p->buf;78 }79 80 static void81 mrb_alloca_free(mrb_state *mrb)82 {83 struct alloca_header *p;84 struct alloca_header *tmp;85 86 if (mrb == NULL) return;87 p = mrb->mems;88 89 while (p) {90 tmp = p;91 p = p->next;92 mrb_free(mrb, tmp);93 }94 }95 96 60 MRB_API mrb_state* 97 61 mrb_open(void) … … 112 76 113 77 if (!disable_gems) { 78 #ifndef DISABLE_GEMS 114 79 mrb_init_mrbgems(mrb); 115 80 mrb_gc_arena_restore(mrb, 0); 81 #endif 116 82 } 117 83 return mrb; … … 136 102 137 103 void 104 mrb_irep_cutref(mrb_state *mrb, mrb_irep *irep) 105 { 106 mrb_irep *tmp; 107 int i; 108 109 for (i=0; i<irep->rlen; i++) { 110 tmp = irep->reps[i]; 111 irep->reps[i] = NULL; 112 if (tmp) mrb_irep_decref(mrb, tmp); 113 } 114 } 115 116 void 138 117 mrb_irep_free(mrb_state *mrb, mrb_irep *irep) 139 118 { 140 size_t i;119 int i; 141 120 142 121 if (!(irep->flags & MRB_ISEQ_NO_FREE)) 143 mrb_free(mrb, irep->iseq);122 mrb_free(mrb, (void*)irep->iseq); 144 123 if (irep->pool) for (i=0; i<irep->plen; i++) { 145 if (mrb_ type(irep->pool[i]) == MRB_TT_STRING) {124 if (mrb_string_p(irep->pool[i])) { 146 125 mrb_gc_free_str(mrb, RSTRING(irep->pool[i])); 147 126 mrb_free(mrb, mrb_obj_ptr(irep->pool[i])); 148 127 } 149 #if def MRB_WORD_BOXING150 else if (mrb_ type(irep->pool[i]) == MRB_TT_FLOAT) {128 #if defined(MRB_WORD_BOXING) && !defined(MRB_WITHOUT_FLOAT) 129 else if (mrb_float_p(irep->pool[i])) { 151 130 mrb_free(mrb, mrb_obj_ptr(irep->pool[i])); 152 131 } … … 156 135 mrb_free(mrb, irep->syms); 157 136 for (i=0; i<irep->rlen; i++) { 158 mrb_irep_decref(mrb, irep->reps[i]); 137 if (irep->reps[i]) 138 mrb_irep_decref(mrb, irep->reps[i]); 159 139 } 160 140 mrb_free(mrb, irep->reps); 161 141 mrb_free(mrb, irep->lv); 162 if (irep->own_filename) {163 mrb_free(mrb, (void *)irep->filename);164 }165 mrb_free(mrb, irep->lines);166 142 mrb_debug_info_free(mrb, irep->debug_info); 167 143 mrb_free(mrb, irep); 168 }169 170 mrb_value171 mrb_str_pool(mrb_state *mrb, mrb_value str)172 {173 struct RString *s = mrb_str_ptr(str);174 struct RString *ns;175 char *ptr;176 mrb_int len;177 178 ns = (struct RString *)mrb_malloc(mrb, sizeof(struct RString));179 ns->tt = MRB_TT_STRING;180 ns->c = mrb->string_class;181 182 if (RSTR_NOFREE_P(s)) {183 ns->flags = MRB_STR_NOFREE;184 ns->as.heap.ptr = s->as.heap.ptr;185 ns->as.heap.len = s->as.heap.len;186 ns->as.heap.aux.capa = 0;187 }188 else {189 ns->flags = 0;190 if (RSTR_EMBED_P(s)) {191 ptr = s->as.ary;192 len = RSTR_EMBED_LEN(s);193 }194 else {195 ptr = s->as.heap.ptr;196 len = s->as.heap.len;197 }198 199 if (len < RSTRING_EMBED_LEN_MAX) {200 RSTR_SET_EMBED_FLAG(ns);201 RSTR_SET_EMBED_LEN(ns, len);202 if (ptr) {203 memcpy(ns->as.ary, ptr, len);204 }205 ns->as.ary[len] = '\0';206 }207 else {208 ns->as.heap.ptr = (char *)mrb_malloc(mrb, (size_t)len+1);209 ns->as.heap.len = len;210 ns->as.heap.aux.capa = len;211 if (ptr) {212 memcpy(ns->as.heap.ptr, ptr, len);213 }214 ns->as.heap.ptr[len] = '\0';215 }216 }217 return mrb_obj_value(ns);218 144 } 219 145 … … 246 172 247 173 /* free */ 174 mrb_gc_destroy(mrb, &mrb->gc); 175 mrb_free_context(mrb, mrb->root_c); 248 176 mrb_gc_free_gv(mrb); 249 mrb_free_context(mrb, mrb->root_c);250 177 mrb_free_symtbl(mrb); 251 mrb_alloca_free(mrb);252 mrb_gc_destroy(mrb, &mrb->gc);253 178 mrb_free(mrb, mrb); 254 179 } … … 263 188 *irep = mrb_irep_zero; 264 189 irep->refcnt = 1; 265 irep->own_filename = FALSE;266 190 267 191 return irep; … … 271 195 mrb_top_self(mrb_state *mrb) 272 196 { 273 if (!mrb->top_self) {274 mrb->top_self = (struct RObject*)mrb_obj_alloc(mrb, MRB_TT_OBJECT, mrb->object_class);275 mrb_define_singleton_method(mrb, mrb->top_self, "inspect", inspect_main, MRB_ARGS_NONE());276 mrb_define_singleton_method(mrb, mrb->top_self, "to_s", inspect_main, MRB_ARGS_NONE());277 }278 197 return mrb_obj_value(mrb->top_self); 279 198 } -
EcnlProtoTool/trunk/mruby-2.1.1/src/string.c
r331 r439 9 9 #endif 10 10 11 #ifndef MRB_WITHOUT_FLOAT 11 12 #include <float.h> 13 #include <math.h> 14 #endif 12 15 #include <limits.h> 13 16 #include <stddef.h> … … 19 22 #include <mruby/range.h> 20 23 #include <mruby/string.h> 21 #include <mruby/ re.h>24 #include <mruby/numeric.h> 22 25 23 26 typedef struct mrb_shared_string { 24 mrb_bool nofree : 1;25 27 int refcnt; 28 mrb_ssize capa; 26 29 char *ptr; 27 mrb_int len;28 30 } mrb_shared_string; 29 31 … … 31 33 32 34 #define mrb_obj_alloc_string(mrb) ((struct RString*)mrb_obj_alloc((mrb), MRB_TT_STRING, (mrb)->string_class)) 35 36 static struct RString* 37 str_init_normal_capa(mrb_state *mrb, struct RString *s, 38 const char *p, size_t len, size_t capa) 39 { 40 char *dst = (char *)mrb_malloc(mrb, capa + 1); 41 if (p) memcpy(dst, p, len); 42 dst[len] = '\0'; 43 s->as.heap.ptr = dst; 44 s->as.heap.len = (mrb_ssize)len; 45 s->as.heap.aux.capa = (mrb_ssize)capa; 46 RSTR_UNSET_TYPE_FLAG(s); 47 return s; 48 } 49 50 static struct RString* 51 str_init_normal(mrb_state *mrb, struct RString *s, const char *p, size_t len) 52 { 53 return str_init_normal_capa(mrb, s, p, len, len); 54 } 55 56 static struct RString* 57 str_init_embed(struct RString *s, const char *p, size_t len) 58 { 59 if (p) memcpy(RSTR_EMBED_PTR(s), p, len); 60 RSTR_EMBED_PTR(s)[len] = '\0'; 61 RSTR_SET_TYPE_FLAG(s, EMBED); 62 RSTR_SET_EMBED_LEN(s, len); 63 return s; 64 } 65 66 static struct RString* 67 str_init_nofree(struct RString *s, const char *p, size_t len) 68 { 69 s->as.heap.ptr = (char *)p; 70 s->as.heap.len = (mrb_ssize)len; 71 s->as.heap.aux.capa = 0; /* nofree */ 72 RSTR_SET_TYPE_FLAG(s, NOFREE); 73 return s; 74 } 75 76 static struct RString* 77 str_init_shared(mrb_state *mrb, const struct RString *orig, struct RString *s, mrb_shared_string *shared) 78 { 79 if (shared) { 80 shared->refcnt++; 81 } 82 else { 83 shared = (mrb_shared_string *)mrb_malloc(mrb, sizeof(mrb_shared_string)); 84 shared->refcnt = 1; 85 shared->ptr = orig->as.heap.ptr; 86 shared->capa = orig->as.heap.aux.capa; 87 } 88 s->as.heap.ptr = orig->as.heap.ptr; 89 s->as.heap.len = orig->as.heap.len; 90 s->as.heap.aux.shared = shared; 91 RSTR_SET_TYPE_FLAG(s, SHARED); 92 return s; 93 } 94 95 static struct RString* 96 str_init_fshared(const struct RString *orig, struct RString *s, struct RString *fshared) 97 { 98 s->as.heap.ptr = orig->as.heap.ptr; 99 s->as.heap.len = orig->as.heap.len; 100 s->as.heap.aux.fshared = fshared; 101 RSTR_SET_TYPE_FLAG(s, FSHARED); 102 return s; 103 } 104 105 static struct RString* 106 str_init_modifiable(mrb_state *mrb, struct RString *s, const char *p, size_t len) 107 { 108 if (RSTR_EMBEDDABLE_P(len)) { 109 return str_init_embed(s, p, len); 110 } 111 else { 112 return str_init_normal(mrb, s, p, len); 113 } 114 } 33 115 34 116 static struct RString* 35 117 str_new_static(mrb_state *mrb, const char *p, size_t len) 36 118 { 37 struct RString *s; 38 39 if (len >= MRB_INT_MAX) { 119 if (RSTR_EMBEDDABLE_P(len)) { 120 return str_init_embed(mrb_obj_alloc_string(mrb), p, len); 121 } 122 if (len >= MRB_SSIZE_MAX) { 40 123 mrb_raise(mrb, E_ARGUMENT_ERROR, "string size too big"); 41 124 } 42 s = mrb_obj_alloc_string(mrb); 43 s->as.heap.len = len; 44 s->as.heap.aux.capa = 0; /* nofree */ 45 s->as.heap.ptr = (char *)p; 46 s->flags = MRB_STR_NOFREE; 47 48 return s; 125 return str_init_nofree(mrb_obj_alloc_string(mrb), p, len); 49 126 } 50 127 … … 52 129 str_new(mrb_state *mrb, const char *p, size_t len) 53 130 { 131 if (RSTR_EMBEDDABLE_P(len)) { 132 return str_init_embed(mrb_obj_alloc_string(mrb), p, len); 133 } 134 if (len >= MRB_SSIZE_MAX) { 135 mrb_raise(mrb, E_ARGUMENT_ERROR, "string size too big"); 136 } 137 if (p && mrb_ro_data_p(p)) { 138 return str_init_nofree(mrb_obj_alloc_string(mrb), p, len); 139 } 140 return str_init_normal(mrb, mrb_obj_alloc_string(mrb), p, len); 141 } 142 143 static inline void 144 str_with_class(struct RString *s, mrb_value obj) 145 { 146 s->c = mrb_str_ptr(obj)->c; 147 } 148 149 static mrb_value 150 mrb_str_new_empty(mrb_state *mrb, mrb_value str) 151 { 152 struct RString *s = str_new(mrb, 0, 0); 153 154 str_with_class(s, str); 155 return mrb_obj_value(s); 156 } 157 158 MRB_API mrb_value 159 mrb_str_new_capa(mrb_state *mrb, size_t capa) 160 { 54 161 struct RString *s; 55 162 56 if (p && mrb_ro_data_p(p)) { 57 return str_new_static(mrb, p, len); 58 } 59 s = mrb_obj_alloc_string(mrb); 60 if (len < RSTRING_EMBED_LEN_MAX) { 61 RSTR_SET_EMBED_FLAG(s); 62 RSTR_SET_EMBED_LEN(s, len); 63 if (p) { 64 memcpy(s->as.ary, p, len); 65 } 163 if (RSTR_EMBEDDABLE_P(capa)) { 164 s = str_init_embed(mrb_obj_alloc_string(mrb), NULL, 0); 165 } 166 else if (capa >= MRB_SSIZE_MAX) { 167 mrb_raise(mrb, E_ARGUMENT_ERROR, "string capacity size too big"); 168 /* not reached */ 169 s = NULL; 66 170 } 67 171 else { 68 if (len >= MRB_INT_MAX) { 69 mrb_raise(mrb, E_ARGUMENT_ERROR, "string size too big"); 70 } 71 s->as.heap.len = len; 72 s->as.heap.aux.capa = len; 73 s->as.heap.ptr = (char *)mrb_malloc(mrb, len+1); 74 if (p) { 75 memcpy(s->as.heap.ptr, p, len); 76 } 77 } 78 RSTR_PTR(s)[len] = '\0'; 79 return s; 80 } 81 82 static inline void 83 str_with_class(mrb_state *mrb, struct RString *s, mrb_value obj) 84 { 85 s->c = mrb_str_ptr(obj)->c; 86 } 87 88 static mrb_value 89 mrb_str_new_empty(mrb_state *mrb, mrb_value str) 90 { 91 struct RString *s = str_new(mrb, 0, 0); 92 93 str_with_class(mrb, s, str); 172 s = str_init_normal_capa(mrb, mrb_obj_alloc_string(mrb), NULL, 0, capa); 173 } 174 94 175 return mrb_obj_value(s); 95 176 } … … 102 183 mrb_str_buf_new(mrb_state *mrb, size_t capa) 103 184 { 104 struct RString *s;105 106 s = mrb_obj_alloc_string(mrb);107 108 if (capa >= MRB_INT_MAX) {109 mrb_raise(mrb, E_ARGUMENT_ERROR, "string capacity size too big");110 }111 185 if (capa < MRB_STR_BUF_MIN_SIZE) { 112 186 capa = MRB_STR_BUF_MIN_SIZE; 113 187 } 114 s->as.heap.len = 0; 115 s->as.heap.aux.capa = capa; 116 s->as.heap.ptr = (char *)mrb_malloc(mrb, capa+1); 117 RSTR_PTR(s)[0] = '\0'; 118 119 return mrb_obj_value(s); 188 return mrb_str_new_capa(mrb, capa); 120 189 } 121 190 … … 123 192 resize_capa(mrb_state *mrb, struct RString *s, size_t capacity) 124 193 { 125 #if SIZE_MAX > MRB_ INT_MAX126 mrb_assert(capacity < MRB_ INT_MAX);194 #if SIZE_MAX > MRB_SSIZE_MAX 195 mrb_assert(capacity < MRB_SSIZE_MAX); 127 196 #endif 128 197 if (RSTR_EMBED_P(s)) { 129 if (RSTRING_EMBED_LEN_MAX < capacity) { 130 char *const tmp = (char *)mrb_malloc(mrb, capacity+1); 131 const mrb_int len = RSTR_EMBED_LEN(s); 132 memcpy(tmp, s->as.ary, len); 133 RSTR_UNSET_EMBED_FLAG(s); 134 s->as.heap.ptr = tmp; 135 s->as.heap.len = len; 136 s->as.heap.aux.capa = (mrb_int)capacity; 198 if (!RSTR_EMBEDDABLE_P(capacity)) { 199 str_init_normal_capa(mrb, s, RSTR_EMBED_PTR(s), RSTR_EMBED_LEN(s), capacity); 137 200 } 138 201 } 139 202 else { 140 203 s->as.heap.ptr = (char*)mrb_realloc(mrb, RSTR_PTR(s), capacity+1); 141 s->as.heap.aux.capa = (mrb_int)capacity; 142 } 143 } 144 145 static void 146 str_buf_cat(mrb_state *mrb, struct RString *s, const char *ptr, size_t len) 147 { 148 size_t capa; 149 size_t total; 150 ptrdiff_t off = -1; 151 152 if (len == 0) return; 153 mrb_str_modify(mrb, s); 154 if (ptr >= RSTR_PTR(s) && ptr <= RSTR_PTR(s) + (size_t)RSTR_LEN(s)) { 155 off = ptr - RSTR_PTR(s); 156 } 157 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: 165 mrb_raise(mrb, E_ARGUMENT_ERROR, "string size too big"); 166 } 167 if (capa <= total) { 168 while (total > capa) { 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; 178 } 179 resize_capa(mrb, s, capa); 180 } 181 if (off != -1) { 182 ptr = RSTR_PTR(s) + off; 183 } 184 memcpy(RSTR_PTR(s) + RSTR_LEN(s), ptr, len); 185 mrb_assert_int_fit(size_t, total, mrb_int, MRB_INT_MAX); 186 RSTR_SET_LEN(s, total); 187 RSTR_PTR(s)[total] = '\0'; /* sentinel */ 204 s->as.heap.aux.capa = (mrb_ssize)capacity; 205 } 188 206 } 189 207 … … 194 212 } 195 213 196 /*197 * call-seq: (Caution! NULL string)198 * String.new(str="") => new_str199 *200 * Returns a new string object containing a copy of <i>str</i>.201 */202 203 214 MRB_API mrb_value 204 215 mrb_str_new_cstr(mrb_state *mrb, const char *p) … … 231 242 shared->refcnt--; 232 243 if (shared->refcnt == 0) { 233 if (!shared->nofree) { 234 mrb_free(mrb, shared->ptr); 235 } 244 mrb_free(mrb, shared->ptr); 236 245 mrb_free(mrb, shared); 246 } 247 } 248 249 static void 250 str_modify_keep_ascii(mrb_state *mrb, struct RString *s) 251 { 252 if (RSTR_SHARED_P(s)) { 253 mrb_shared_string *shared = s->as.heap.aux.shared; 254 255 if (shared->refcnt == 1 && s->as.heap.ptr == shared->ptr) { 256 s->as.heap.aux.capa = shared->capa; 257 s->as.heap.ptr[s->as.heap.len] = '\0'; 258 RSTR_UNSET_SHARED_FLAG(s); 259 mrb_free(mrb, shared); 260 } 261 else { 262 str_init_modifiable(mrb, s, s->as.heap.ptr, (size_t)s->as.heap.len); 263 str_decref(mrb, shared); 264 } 265 } 266 else if (RSTR_NOFREE_P(s) || RSTR_FSHARED_P(s)) { 267 str_init_modifiable(mrb, s, s->as.heap.ptr, (size_t)s->as.heap.len); 268 } 269 } 270 271 static void 272 check_null_byte(mrb_state *mrb, mrb_value str) 273 { 274 mrb_to_str(mrb, str); 275 if (memchr(RSTRING_PTR(str), '\0', RSTRING_LEN(str))) { 276 mrb_raise(mrb, E_ARGUMENT_ERROR, "string contains null byte"); 237 277 } 238 278 } … … 245 285 else if (RSTR_SHARED_P(str)) 246 286 str_decref(mrb, str->as.heap.aux.shared); 247 else if (!RSTR_NOFREE_P(str) )287 else if (!RSTR_NOFREE_P(str) && !RSTR_FSHARED_P(str)) 248 288 mrb_free(mrb, str->as.heap.ptr); 249 289 } … … 262 302 }; 263 303 264 staticmrb_int265 utf8len(const char* p, const char* e)304 mrb_int 305 mrb_utf8len(const char* p, const char* e) 266 306 { 267 307 mrb_int len; 268 308 mrb_int i; 269 309 310 if ((unsigned char)*p < 0x80) return 1; 270 311 len = utf8len_codepage[(unsigned char)*p]; 271 if (p + len > e) return 1; 312 if (len == 1) return 1; 313 if (len > e - p) return 1; 272 314 for (i = 1; i < len; ++i) 273 315 if ((p[i] & 0xc0) != 0x80) … … 276 318 } 277 319 320 mrb_int 321 mrb_utf8_strlen(const char *str, mrb_int byte_len) 322 { 323 mrb_int total = 0; 324 const char *p = str; 325 const char *e = p + byte_len; 326 327 while (p < e) { 328 p += mrb_utf8len(p, e); 329 total++; 330 } 331 return total; 332 } 333 278 334 static mrb_int 279 utf8_strlen(mrb_value str, mrb_int len) 280 { 281 mrb_int total = 0; 282 char* p = RSTRING_PTR(str); 283 char* e = p; 284 if (RSTRING(str)->flags & MRB_STR_NO_UTF) { 285 return RSTRING_LEN(str); 286 } 287 e += len < 0 ? RSTRING_LEN(str) : len; 288 while (p<e) { 289 p += utf8len(p, e); 290 total++; 291 } 292 if (RSTRING_LEN(str) == total) { 293 RSTRING(str)->flags |= MRB_STR_NO_UTF; 294 } 295 return total; 296 } 297 298 #define RSTRING_CHAR_LEN(s) utf8_strlen(s, -1) 335 utf8_strlen(mrb_value str) 336 { 337 struct RString *s = mrb_str_ptr(str); 338 mrb_int byte_len = RSTR_LEN(s); 339 340 if (RSTR_ASCII_P(s)) { 341 return byte_len; 342 } 343 else { 344 mrb_int utf8_len = mrb_utf8_strlen(RSTR_PTR(s), byte_len); 345 if (byte_len == utf8_len) RSTR_SET_ASCII_FLAG(s); 346 return utf8_len; 347 } 348 } 349 350 #define RSTRING_CHAR_LEN(s) utf8_strlen(s) 299 351 300 352 /* map character index to byte offset index */ … … 302 354 chars2bytes(mrb_value s, mrb_int off, mrb_int idx) 303 355 { 304 mrb_int i, b, n; 305 const char *p = RSTRING_PTR(s) + off; 306 const char *e = RSTRING_END(s); 307 308 for (b=i=0; p<e && i<idx; i++) { 309 n = utf8len(p, e); 310 b += n; 311 p += n; 312 } 313 return b; 356 if (RSTR_ASCII_P(mrb_str_ptr(s))) { 357 return idx; 358 } 359 else { 360 mrb_int i, b, n; 361 const char *p = RSTRING_PTR(s) + off; 362 const char *e = RSTRING_END(s); 363 364 for (b=i=0; p<e && i<idx; i++) { 365 n = mrb_utf8len(p, e); 366 b += n; 367 p += n; 368 } 369 return b; 370 } 314 371 } 315 372 316 373 /* map byte offset to character index */ 317 374 static mrb_int 318 bytes2chars(char *p, mrb_int bi)319 { 320 mrb_int i, b,n;321 322 for (b=i=0; b<bi; i++) {323 n = utf8len_codepage[(unsigned char)*p]; 324 b += n;325 p += n;326 } 327 if ( b != bi) return -1;375 bytes2chars(char *p, mrb_int len, mrb_int bi) 376 { 377 const char *e = p + (size_t)len; 378 const char *pivot = p + bi; 379 mrb_int i; 380 381 for (i = 0; p < pivot; i ++) { 382 p += mrb_utf8len(p, e); 383 } 384 if (p != pivot) return -1; 328 385 return i; 386 } 387 388 static const char * 389 char_adjust(const char *beg, const char *end, const char *ptr) 390 { 391 if ((ptr > beg || ptr < end) && (*ptr & 0xc0) == 0x80) { 392 const int utf8_adjust_max = 3; 393 const char *p; 394 395 if (ptr - beg > utf8_adjust_max) { 396 beg = ptr - utf8_adjust_max; 397 } 398 399 p = ptr; 400 while (p > beg) { 401 p --; 402 if ((*p & 0xc0) != 0x80) { 403 int clen = mrb_utf8len(p, end); 404 if (clen > ptr - p) return p; 405 break; 406 } 407 } 408 } 409 410 return ptr; 411 } 412 413 static const char * 414 char_backtrack(const char *ptr, const char *end) 415 { 416 if (ptr < end) { 417 const int utf8_bytelen_max = 4; 418 const char *p; 419 420 if (end - ptr > utf8_bytelen_max) { 421 ptr = end - utf8_bytelen_max; 422 } 423 424 p = end; 425 while (p > ptr) { 426 p --; 427 if ((*p & 0xc0) != 0x80) { 428 int clen = utf8len_codepage[(unsigned char)*p]; 429 if (clen == end - p) { return p; } 430 break; 431 } 432 } 433 } 434 435 return end - 1; 436 } 437 438 static mrb_int 439 str_index_str_by_char_search(mrb_state *mrb, const char *p, const char *pend, const char *s, const mrb_int slen, mrb_int off) 440 { 441 /* Based on Quick Search algorithm (Boyer-Moore-Horspool algorithm) */ 442 443 ptrdiff_t qstable[1 << CHAR_BIT]; 444 445 /* Preprocessing */ 446 { 447 mrb_int i; 448 449 for (i = 0; i < 1 << CHAR_BIT; i ++) { 450 qstable[i] = slen; 451 } 452 for (i = 0; i < slen; i ++) { 453 qstable[(unsigned char)s[i]] = slen - (i + 1); 454 } 455 } 456 457 /* Searching */ 458 while (p < pend && pend - p >= slen) { 459 const char *pivot; 460 461 if (memcmp(p, s, slen) == 0) { 462 return off; 463 } 464 465 pivot = p + qstable[(unsigned char)p[slen - 1]]; 466 if (pivot >= pend || pivot < p /* overflowed */) { return -1; } 467 468 do { 469 p += mrb_utf8len(p, pend); 470 off ++; 471 } while (p < pivot); 472 } 473 474 return -1; 475 } 476 477 static mrb_int 478 str_index_str_by_char(mrb_state *mrb, mrb_value str, mrb_value sub, mrb_int pos) 479 { 480 const char *p = RSTRING_PTR(str); 481 const char *pend = p + RSTRING_LEN(str); 482 const char *s = RSTRING_PTR(sub); 483 const mrb_int slen = RSTRING_LEN(sub); 484 mrb_int off = pos; 485 486 for (; pos > 0; pos --) { 487 if (pend - p < 1) { return -1; } 488 p += mrb_utf8len(p, pend); 489 } 490 491 if (slen < 1) { return off; } 492 493 return str_index_str_by_char_search(mrb, p, pend, s, slen, off); 329 494 } 330 495 … … 333 498 #define RSTRING_CHAR_LEN(s) RSTRING_LEN(s) 334 499 #define chars2bytes(p, off, ci) (ci) 335 #define bytes2chars(p, bi) (bi) 500 #define bytes2chars(p, end, bi) (bi) 501 #define char_adjust(beg, end, ptr) (ptr) 502 #define char_backtrack(ptr, end) ((end) - 1) 336 503 #define BYTES_ALIGN_CHECK(pos) 504 #define str_index_str_by_char(mrb, str, sub, pos) str_index_str(mrb, str, sub, pos) 505 #endif 506 507 #ifndef MRB_QS_SHORT_STRING_LENGTH 508 #define MRB_QS_SHORT_STRING_LENGTH 2048 337 509 #endif 338 510 … … 340 512 mrb_memsearch_qs(const unsigned char *xs, mrb_int m, const unsigned char *ys, mrb_int n) 341 513 { 342 const unsigned char *x = xs, *xe = xs + m; 343 const unsigned char *y = ys; 344 int i, qstable[256]; 345 346 /* Preprocessing */ 347 for (i = 0; i < 256; ++i) 348 qstable[i] = m + 1; 349 for (; x < xe; ++x) 350 qstable[*x] = xe - x; 351 /* Searching */ 352 for (; y + m <= ys + n; y += *(qstable + y[m])) { 353 if (*xs == *y && memcmp(xs, y, m) == 0) 354 return y - ys; 355 } 356 return -1; 514 if (n + m < MRB_QS_SHORT_STRING_LENGTH) { 515 const unsigned char *y = ys; 516 const unsigned char *ye = ys+n-m+1; 517 518 for (;;) { 519 y = (const unsigned char*)memchr(y, xs[0], (size_t)(ye-y)); 520 if (y == NULL) return -1; 521 if (memcmp(xs, y, m) == 0) { 522 return (mrb_int)(y - ys); 523 } 524 y++; 525 } 526 return -1; 527 } 528 else { 529 const unsigned char *x = xs, *xe = xs + m; 530 const unsigned char *y = ys; 531 int i; 532 ptrdiff_t qstable[256]; 533 534 /* Preprocessing */ 535 for (i = 0; i < 256; ++i) 536 qstable[i] = m + 1; 537 for (; x < xe; ++x) 538 qstable[*x] = xe - x; 539 /* Searching */ 540 for (; y + m <= ys + n; y += *(qstable + y[m])) { 541 if (*xs == *y && memcmp(xs, y, m) == 0) 542 return (mrb_int)(y - ys); 543 } 544 return -1; 545 } 357 546 } 358 547 … … 373 562 374 563 if (ys) 375 return ys - y;564 return (mrb_int)(ys - y); 376 565 else 377 566 return -1; … … 381 570 382 571 static void 383 str_make_shared(mrb_state *mrb, struct RString *s) 384 { 385 if (!RSTR_SHARED_P(s)) { 386 mrb_shared_string *shared = (mrb_shared_string *)mrb_malloc(mrb, sizeof(mrb_shared_string)); 387 388 shared->refcnt = 1; 389 if (RSTR_EMBED_P(s)) { 390 const mrb_int len = RSTR_EMBED_LEN(s); 391 char *const tmp = (char *)mrb_malloc(mrb, len+1); 392 memcpy(tmp, s->as.ary, len); 393 tmp[len] = '\0'; 394 RSTR_UNSET_EMBED_FLAG(s); 395 s->as.heap.ptr = tmp; 396 s->as.heap.len = len; 397 shared->nofree = FALSE; 398 shared->ptr = s->as.heap.ptr; 399 } 400 else if (RSTR_NOFREE_P(s)) { 401 shared->nofree = TRUE; 402 shared->ptr = s->as.heap.ptr; 403 RSTR_UNSET_NOFREE_FLAG(s); 404 } 405 else { 406 shared->nofree = FALSE; 407 if (s->as.heap.aux.capa > s->as.heap.len) { 408 s->as.heap.ptr = shared->ptr = (char *)mrb_realloc(mrb, s->as.heap.ptr, s->as.heap.len+1); 409 } 410 else { 411 shared->ptr = s->as.heap.ptr; 412 } 413 } 414 shared->len = s->as.heap.len; 415 s->as.heap.aux.shared = shared; 416 RSTR_SET_SHARED_FLAG(s); 417 } 418 } 419 420 static mrb_value 421 byte_subseq(mrb_state *mrb, mrb_value str, mrb_int beg, mrb_int len) 572 str_share(mrb_state *mrb, struct RString *orig, struct RString *s) 573 { 574 size_t len = (size_t)orig->as.heap.len; 575 576 mrb_assert(!RSTR_EMBED_P(orig)); 577 if (RSTR_NOFREE_P(orig)) { 578 str_init_nofree(s, orig->as.heap.ptr, len); 579 } 580 else if (RSTR_SHARED_P(orig)) { 581 str_init_shared(mrb, orig, s, orig->as.heap.aux.shared); 582 } 583 else if (RSTR_FSHARED_P(orig)) { 584 str_init_fshared(orig, s, orig->as.heap.aux.fshared); 585 } 586 else if (mrb_frozen_p(orig) && !RSTR_POOL_P(orig)) { 587 str_init_fshared(orig, s, orig); 588 } 589 else { 590 if (orig->as.heap.aux.capa > orig->as.heap.len) { 591 orig->as.heap.ptr = (char *)mrb_realloc(mrb, orig->as.heap.ptr, len+1); 592 orig->as.heap.aux.capa = (mrb_ssize)len; 593 } 594 str_init_shared(mrb, orig, s, NULL); 595 str_init_shared(mrb, orig, orig, s->as.heap.aux.shared); 596 } 597 } 598 599 mrb_value 600 mrb_str_pool(mrb_state *mrb, const char *p, mrb_int len, mrb_bool nofree) 601 { 602 struct RString *s = (struct RString *)mrb_malloc(mrb, sizeof(struct RString)); 603 604 s->tt = MRB_TT_STRING; 605 s->c = mrb->string_class; 606 s->flags = 0; 607 608 if (RSTR_EMBEDDABLE_P(len)) { 609 str_init_embed(s, p, len); 610 } 611 else if (nofree) { 612 str_init_nofree(s, p, len); 613 } 614 else { 615 str_init_normal(mrb, s, p, len); 616 } 617 RSTR_SET_POOL_FLAG(s); 618 MRB_SET_FROZEN_FLAG(s); 619 return mrb_obj_value(s); 620 } 621 622 mrb_value 623 mrb_str_byte_subseq(mrb_state *mrb, mrb_value str, mrb_int beg, mrb_int len) 422 624 { 423 625 struct RString *orig, *s; 424 mrb_shared_string *shared;425 626 426 627 orig = mrb_str_ptr(str); 427 if (RSTR_EMBED_P(orig) || RSTR_LEN(orig) == 0) { 428 s = str_new(mrb, orig->as.ary+beg, len); 628 s = mrb_obj_alloc_string(mrb); 629 if (RSTR_EMBEDDABLE_P(len)) { 630 str_init_embed(s, RSTR_PTR(orig)+beg, len); 429 631 } 430 632 else { 431 str_make_shared(mrb, orig); 432 shared = orig->as.heap.aux.shared; 433 s = mrb_obj_alloc_string(mrb); 434 s->as.heap.ptr = orig->as.heap.ptr + beg; 435 s->as.heap.len = len; 436 s->as.heap.aux.shared = shared; 437 RSTR_SET_SHARED_FLAG(s); 438 shared->refcnt++; 439 } 440 633 str_share(mrb, orig, s); 634 s->as.heap.ptr += (mrb_ssize)beg; 635 s->as.heap.len = (mrb_ssize)len; 636 } 637 RSTR_COPY_ASCII_FLAG(s, orig); 441 638 return mrb_obj_value(s); 639 } 640 641 static void 642 str_range_to_bytes(mrb_value str, mrb_int *pos, mrb_int *len) 643 { 644 *pos = chars2bytes(str, 0, *pos); 645 *len = chars2bytes(str, *pos, *len); 442 646 } 443 647 #ifdef MRB_UTF8_STRING … … 445 649 str_subseq(mrb_state *mrb, mrb_value str, mrb_int beg, mrb_int len) 446 650 { 447 beg = chars2bytes(str, 0, beg); 448 len = chars2bytes(str, beg, len); 449 450 return byte_subseq(mrb, str, beg, len); 651 str_range_to_bytes(str, &beg, &len); 652 return mrb_str_byte_subseq(mrb, str, beg, len); 451 653 } 452 654 #else 453 #define str_subseq(mrb, str, beg, len) byte_subseq(mrb, str, beg, len)655 #define str_subseq(mrb, str, beg, len) mrb_str_byte_subseq(mrb, str, beg, len) 454 656 #endif 455 657 658 mrb_bool 659 mrb_str_beg_len(mrb_int str_len, mrb_int *begp, mrb_int *lenp) 660 { 661 if (str_len < *begp || *lenp < 0) return FALSE; 662 if (*begp < 0) { 663 *begp += str_len; 664 if (*begp < 0) return FALSE; 665 } 666 if (*lenp > str_len - *begp) 667 *lenp = str_len - *begp; 668 if (*lenp <= 0) { 669 *lenp = 0; 670 } 671 return TRUE; 672 } 673 456 674 static mrb_value 457 675 str_substr(mrb_state *mrb, mrb_value str, mrb_int beg, mrb_int len) 458 676 { 459 mrb_int clen = RSTRING_CHAR_LEN(str); 460 461 if (len < 0) return mrb_nil_value(); 462 if (clen == 0) { 463 len = 0; 464 } 465 else if (beg < 0) { 466 beg = clen + beg; 467 } 468 if (beg > clen) return mrb_nil_value(); 469 if (beg < 0) { 470 beg += clen; 471 if (beg < 0) return mrb_nil_value(); 472 } 473 if (len > clen - beg) 474 len = clen - beg; 475 if (len <= 0) { 476 len = 0; 477 } 478 return str_subseq(mrb, str, beg, len); 479 } 480 481 static mrb_int 482 str_index(mrb_state *mrb, mrb_value str, mrb_value sub, mrb_int offset) 677 return mrb_str_beg_len(RSTRING_CHAR_LEN(str), &beg, &len) ? 678 str_subseq(mrb, str, beg, len) : mrb_nil_value(); 679 } 680 681 MRB_API mrb_int 682 mrb_str_index(mrb_state *mrb, mrb_value str, const char *sptr, mrb_int slen, mrb_int offset) 483 683 { 484 684 mrb_int pos; 485 char *s , *sptr;486 mrb_int len , slen;685 char *s; 686 mrb_int len; 487 687 488 688 len = RSTRING_LEN(str); 489 slen = RSTRING_LEN(sub);490 689 if (offset < 0) { 491 690 offset += len; … … 499 698 if (slen == 0) return offset; 500 699 /* need proceed one character at a time */ 501 sptr = RSTRING_PTR(sub);502 slen = RSTRING_LEN(sub);503 700 len = RSTRING_LEN(str) - offset; 504 701 pos = mrb_memsearch(sptr, slen, s, len); … … 507 704 } 508 705 509 static void 510 check_frozen(mrb_state *mrb, struct RString *s) 511 { 512 if (MRB_FROZEN_P(s)) { 513 mrb_raise(mrb, E_RUNTIME_ERROR, "can't modify frozen string"); 514 } 706 static mrb_int 707 str_index_str(mrb_state *mrb, mrb_value str, mrb_value str2, mrb_int offset) 708 { 709 const char *ptr; 710 mrb_int len; 711 712 ptr = RSTRING_PTR(str2); 713 len = RSTRING_LEN(str2); 714 715 return mrb_str_index(mrb, str, ptr, len, offset); 515 716 } 516 717 … … 518 719 str_replace(mrb_state *mrb, struct RString *s1, struct RString *s2) 519 720 { 520 longlen;521 522 check_frozen(mrb, s1);721 size_t len; 722 723 mrb_check_frozen(mrb, s1); 523 724 if (s1 == s2) return mrb_obj_value(s1); 524 s1->flags &= ~MRB_STR_NO_UTF; 525 s1->flags |= s2->flags&MRB_STR_NO_UTF; 526 len = RSTR_LEN(s2); 725 RSTR_COPY_ASCII_FLAG(s1, s2); 527 726 if (RSTR_SHARED_P(s1)) { 528 727 str_decref(mrb, s1->as.heap.aux.shared); 529 728 } 530 else if (!RSTR_EMBED_P(s1) && !RSTR_NOFREE_P(s1)) { 729 else if (!RSTR_EMBED_P(s1) && !RSTR_NOFREE_P(s1) && !RSTR_FSHARED_P(s1) 730 && s1->as.heap.ptr) { 531 731 mrb_free(mrb, s1->as.heap.ptr); 532 732 } 533 733 534 RSTR_UNSET_NOFREE_FLAG(s1); 535 536 if (RSTR_SHARED_P(s2)) { 537 L_SHARE: 538 RSTR_UNSET_EMBED_FLAG(s1); 539 s1->as.heap.ptr = s2->as.heap.ptr; 540 s1->as.heap.len = len; 541 s1->as.heap.aux.shared = s2->as.heap.aux.shared; 542 RSTR_SET_SHARED_FLAG(s1); 543 s1->as.heap.aux.shared->refcnt++; 734 len = (size_t)RSTR_LEN(s2); 735 if (RSTR_EMBEDDABLE_P(len)) { 736 str_init_embed(s1, RSTR_PTR(s2), len); 544 737 } 545 738 else { 546 if (len <= RSTRING_EMBED_LEN_MAX) { 547 RSTR_UNSET_SHARED_FLAG(s1); 548 RSTR_SET_EMBED_FLAG(s1); 549 memcpy(s1->as.ary, RSTR_PTR(s2), len); 550 RSTR_SET_EMBED_LEN(s1, len); 551 } 552 else { 553 str_make_shared(mrb, s2); 554 goto L_SHARE; 555 } 739 str_share(mrb, s2, s1); 556 740 } 557 741 … … 562 746 str_rindex(mrb_state *mrb, mrb_value str, mrb_value sub, mrb_int pos) 563 747 { 564 c har *s, *sbeg, *t;748 const char *s, *sbeg, *t; 565 749 struct RString *ps = mrb_str_ptr(str); 566 750 mrb_int len = RSTRING_LEN(sub); … … 575 759 t = RSTRING_PTR(sub); 576 760 if (len) { 761 s = char_adjust(sbeg, sbeg + RSTR_LEN(ps), s); 577 762 while (sbeg <= s) { 578 763 if (memcmp(s, t, len) == 0) { 579 return s - RSTR_PTR(ps);580 } 581 s --;764 return (mrb_int)(s - RSTR_PTR(ps)); 765 } 766 s = char_backtrack(sbeg, s); 582 767 } 583 768 return -1; … … 607 792 608 793 char* 609 mrb_utf8_from_locale(const char *str, size_t len)794 mrb_utf8_from_locale(const char *str, int len) 610 795 { 611 796 wchar_t* wcsp; 612 797 char* mbsp; 613 size_t mbssize, wcssize;798 int mbssize, wcssize; 614 799 615 800 if (len == 0) 616 801 return strdup(""); 617 802 if (len == -1) 618 len = strlen(str);803 len = (int)strlen(str); 619 804 wcssize = MultiByteToWideChar(GetACP(), 0, str, len, NULL, 0); 620 805 wcsp = (wchar_t*) malloc((wcssize + 1) * sizeof(wchar_t)); … … 637 822 638 823 char* 639 mrb_locale_from_utf8(const char *utf8, size_t len)824 mrb_locale_from_utf8(const char *utf8, int len) 640 825 { 641 826 wchar_t* wcsp; 642 827 char* mbsp; 643 size_t mbssize, wcssize;828 int mbssize, wcssize; 644 829 645 830 if (len == 0) 646 831 return strdup(""); 647 832 if (len == -1) 648 len = strlen(utf8);833 len = (int)strlen(utf8); 649 834 wcssize = MultiByteToWideChar(CP_UTF8, 0, utf8, len, NULL, 0); 650 835 wcsp = (wchar_t*) malloc((wcssize + 1) * sizeof(wchar_t)); … … 667 852 668 853 MRB_API void 854 mrb_str_modify_keep_ascii(mrb_state *mrb, struct RString *s) 855 { 856 mrb_check_frozen(mrb, s); 857 str_modify_keep_ascii(mrb, s); 858 } 859 860 MRB_API void 669 861 mrb_str_modify(mrb_state *mrb, struct RString *s) 670 862 { 671 check_frozen(mrb, s); 672 s->flags &= ~MRB_STR_NO_UTF; 673 if (RSTR_SHARED_P(s)) { 674 mrb_shared_string *shared = s->as.heap.aux.shared; 675 676 if (shared->nofree == 0 && shared->refcnt == 1 && s->as.heap.ptr == shared->ptr) { 677 s->as.heap.ptr = shared->ptr; 678 s->as.heap.aux.capa = shared->len; 679 RSTR_PTR(s)[s->as.heap.len] = '\0'; 680 mrb_free(mrb, shared); 681 } 682 else { 683 char *ptr, *p; 684 mrb_int len; 685 686 p = RSTR_PTR(s); 687 len = s->as.heap.len; 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 } 698 if (p) { 699 memcpy(ptr, p, len); 700 } 701 ptr[len] = '\0'; 702 str_decref(mrb, shared); 703 } 704 RSTR_UNSET_SHARED_FLAG(s); 705 return; 706 } 707 if (RSTR_NOFREE_P(s)) { 708 char *p = s->as.heap.ptr; 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 } 720 if (p) { 721 memcpy(RSTR_PTR(s), p, len); 722 } 723 RSTR_PTR(s)[len] = '\0'; 724 return; 725 } 863 mrb_str_modify_keep_ascii(mrb, s); 864 RSTR_UNSET_ASCII_FLAG(s); 726 865 } 727 866 … … 732 871 struct RString *s = mrb_str_ptr(str); 733 872 873 if (len < 0) { 874 mrb_raise(mrb, E_ARGUMENT_ERROR, "negative (or overflowed) string size"); 875 } 734 876 mrb_str_modify(mrb, s); 735 877 slen = RSTR_LEN(s); … … 749 891 struct RString *s; 750 892 751 if (!mrb_string_p(str0)) { 752 mrb_raise(mrb, E_TYPE_ERROR, "expected String"); 753 } 754 893 check_null_byte(mrb, str0); 755 894 s = str_new(mrb, RSTRING_PTR(str0), RSTRING_LEN(str0)); 756 if ((strlen(RSTR_PTR(s)) ^ RSTR_LEN(s)) != 0) {757 mrb_raise(mrb, E_ARGUMENT_ERROR, "string contains null byte");758 }759 895 return RSTR_PTR(s); 760 896 } 761 897 762 /*763 * call-seq: (Caution! String("abcd") change)764 * String("abcdefg") = String("abcd") + String("efg")765 *766 * Returns a new string object containing a copy of <i>str</i>.767 */768 898 MRB_API void 769 899 mrb_str_concat(mrb_state *mrb, mrb_value self, mrb_value other) 770 900 { 771 struct RString *s1 = mrb_str_ptr(self), *s2; 772 mrb_int len; 773 774 mrb_str_modify(mrb, s1); 775 if (!mrb_string_p(other)) { 776 other = mrb_str_to_str(mrb, other); 777 } 778 s2 = mrb_str_ptr(other); 779 if (RSTR_LEN(s2) == 0) { 780 return; 781 } 782 len = RSTR_LEN(s1) + RSTR_LEN(s2); 783 784 if (len < 0 || len >= MRB_INT_MAX) { 785 mrb_raise(mrb, E_ARGUMENT_ERROR, "string size too big"); 786 } 787 if (RSTRING_CAPA(self) < len) { 788 resize_capa(mrb, s1, len); 789 } 790 memcpy(RSTR_PTR(s1)+RSTR_LEN(s1), RSTR_PTR(s2), RSTR_LEN(s2)); 791 RSTR_SET_LEN(s1, len); 792 RSTR_PTR(s1)[len] = '\0'; 793 } 794 795 /* 796 * call-seq: (Caution! String("abcd") remain) 797 * String("abcdefg") = String("abcd") + String("efg") 798 * 799 * Returns a new string object containing a copy of <i>str</i>. 800 */ 901 other = mrb_str_to_str(mrb, other); 902 mrb_str_cat_str(mrb, self, other); 903 } 904 801 905 MRB_API mrb_value 802 906 mrb_str_plus(mrb_state *mrb, mrb_value a, mrb_value b) … … 816 920 817 921 /* 818 * call-seq: (Caution! String("abcd") remain) for stack_argument 819 * String("abcdefg") = String("abcd") + String("efg") 820 * 821 * Returns a new string object containing a copy of <i>str</i>. 922 * call-seq: 923 * str + other_str -> new_str 924 * 925 * Concatenation---Returns a new <code>String</code> containing 926 * <i>other_str</i> concatenated to <i>str</i>. 927 * 928 * "Hello from " + self.to_s #=> "Hello from main" 822 929 */ 823 930 static mrb_value … … 873 980 mrb_raise(mrb, E_ARGUMENT_ERROR, "negative argument"); 874 981 } 875 if (times && MRB_ INT_MAX / times < RSTRING_LEN(self)) {982 if (times && MRB_SSIZE_MAX / times < RSTRING_LEN(self)) { 876 983 mrb_raise(mrb, E_ARGUMENT_ERROR, "argument too big"); 877 984 } … … 879 986 len = RSTRING_LEN(self)*times; 880 987 str2 = str_new(mrb, 0, len); 881 str_with_class( mrb,str2, self);988 str_with_class(str2, self); 882 989 p = RSTR_PTR(str2); 883 990 if (len > 0) { … … 891 998 } 892 999 p[RSTR_LEN(str2)] = '\0'; 1000 RSTR_COPY_ASCII_FLAG(str2, mrb_str_ptr(self)); 893 1001 894 1002 return mrb_obj_value(str2); … … 959 1067 mrb_get_args(mrb, "o", &str2); 960 1068 if (!mrb_string_p(str2)) { 961 if (!mrb_respond_to(mrb, str2, mrb_intern_lit(mrb, "to_s"))) { 962 return mrb_nil_value(); 963 } 964 else if (!mrb_respond_to(mrb, str2, mrb_intern_lit(mrb, "<=>"))) { 965 return mrb_nil_value(); 966 } 967 else { 968 mrb_value tmp = mrb_funcall(mrb, str2, "<=>", 1, str1); 969 970 if (!mrb_nil_p(tmp)) return mrb_nil_value(); 971 if (!mrb_fixnum_p(tmp)) { 972 return mrb_funcall(mrb, mrb_fixnum_value(0), "-", 1, tmp); 973 } 974 result = -mrb_fixnum(tmp); 975 } 1069 return mrb_nil_value(); 976 1070 } 977 1071 else { … … 995 1089 mrb_str_equal(mrb_state *mrb, mrb_value str1, mrb_value str2) 996 1090 { 997 if (mrb_immediate_p(str2)) return FALSE; 998 if (!mrb_string_p(str2)) { 999 if (mrb_nil_p(str2)) return FALSE; 1000 if (!mrb_respond_to(mrb, str2, mrb_intern_lit(mrb, "to_str"))) { 1001 return FALSE; 1002 } 1003 str2 = mrb_funcall(mrb, str2, "to_str", 0); 1004 return mrb_equal(mrb, str2, str1); 1005 } 1091 if (!mrb_string_p(str2)) return FALSE; 1006 1092 return str_eql(mrb, str1, str2); 1007 1093 } … … 1028 1114 } 1029 1115 /* ---------------------------------- */ 1116 1030 1117 MRB_API mrb_value 1031 1118 mrb_str_to_str(mrb_state *mrb, mrb_value str) 1032 1119 { 1033 mrb_value s; 1034 1035 if (!mrb_string_p(str)) { 1036 s = mrb_check_convert_type(mrb, str, MRB_TT_STRING, "String", "to_str"); 1037 if (mrb_nil_p(s)) { 1038 s = mrb_convert_type(mrb, str, MRB_TT_STRING, "String", "to_s"); 1039 } 1040 return s; 1041 } 1042 return str; 1043 } 1044 1120 switch (mrb_type(str)) { 1121 case MRB_TT_STRING: 1122 return str; 1123 case MRB_TT_SYMBOL: 1124 return mrb_sym_str(mrb, mrb_symbol(str)); 1125 case MRB_TT_FIXNUM: 1126 return mrb_fixnum_to_str(mrb, str, 10); 1127 case MRB_TT_CLASS: 1128 case MRB_TT_MODULE: 1129 return mrb_mod_to_s(mrb, str); 1130 default: 1131 return mrb_convert_type(mrb, str, MRB_TT_STRING, "String", "to_s"); 1132 } 1133 } 1134 1135 /* obslete: use RSTRING_PTR() */ 1045 1136 MRB_API const char* 1046 mrb_string_value_ptr(mrb_state *mrb, mrb_value ptr)1047 { 1048 mrb_value str = mrb_str_to_str(mrb, ptr);1137 mrb_string_value_ptr(mrb_state *mrb, mrb_value str) 1138 { 1139 str = mrb_str_to_str(mrb, str); 1049 1140 return RSTRING_PTR(str); 1050 1141 } 1051 1142 1143 /* obslete: use RSTRING_LEN() */ 1052 1144 MRB_API mrb_int 1053 1145 mrb_string_value_len(mrb_state *mrb, mrb_value ptr) 1054 1146 { 1055 mrb_value str = mrb_str_to_str(mrb, ptr); 1056 return RSTRING_LEN(str); 1057 } 1058 1059 void 1060 mrb_noregexp(mrb_state *mrb, mrb_value self) 1061 { 1062 mrb_raise(mrb, E_NOTIMP_ERROR, "Regexp class not implemented"); 1063 } 1064 1065 void 1066 mrb_regexp_check(mrb_state *mrb, mrb_value obj) 1067 { 1068 if (mrb_regexp_p(mrb, obj)) { 1069 mrb_noregexp(mrb, obj); 1070 } 1147 mrb_to_str(mrb, ptr); 1148 return RSTRING_LEN(ptr); 1071 1149 } 1072 1150 … … 1077 1155 struct RString *dup = str_new(mrb, 0, 0); 1078 1156 1079 str_with_class( mrb,dup, str);1157 str_with_class(dup, str); 1080 1158 return str_replace(mrb, dup, s); 1081 1159 } 1082 1160 1083 static mrb_value 1084 mrb_str_aref(mrb_state *mrb, mrb_value str, mrb_value indx) 1085 { 1086 mrb_int idx; 1087 1088 mrb_regexp_check(mrb, indx); 1089 switch (mrb_type(indx)) { 1090 case MRB_TT_FIXNUM: 1091 idx = mrb_fixnum(indx); 1092 1093 num_index: 1094 str = str_substr(mrb, str, idx, 1); 1095 if (!mrb_nil_p(str) && RSTRING_LEN(str) == 0) return mrb_nil_value(); 1096 return str; 1097 1098 case MRB_TT_STRING: 1099 if (str_index(mrb, str, indx, 0) != -1) 1100 return mrb_str_dup(mrb, indx); 1101 return mrb_nil_value(); 1102 1103 case MRB_TT_RANGE: 1104 goto range_arg; 1105 1106 default: 1107 indx = mrb_Integer(mrb, indx); 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(); 1161 enum str_convert_range { 1162 /* `beg` and `len` are byte unit in `0 ... str.bytesize` */ 1163 STR_BYTE_RANGE_CORRECTED = 1, 1164 1165 /* `beg` and `len` are char unit in any range */ 1166 STR_CHAR_RANGE = 2, 1167 1168 /* `beg` and `len` are char unit in `0 ... str.size` */ 1169 STR_CHAR_RANGE_CORRECTED = 3, 1170 1171 /* `beg` is out of range */ 1172 STR_OUT_OF_RANGE = -1 1173 }; 1174 1175 static enum str_convert_range 1176 str_convert_range(mrb_state *mrb, mrb_value str, mrb_value indx, mrb_value alen, mrb_int *beg, mrb_int *len) 1177 { 1178 if (!mrb_undef_p(alen)) { 1179 *beg = mrb_int(mrb, indx); 1180 *len = mrb_int(mrb, alen); 1181 return STR_CHAR_RANGE; 1182 } 1183 else { 1184 switch (mrb_type(indx)) { 1185 case MRB_TT_FIXNUM: 1186 *beg = mrb_fixnum(indx); 1187 *len = 1; 1188 return STR_CHAR_RANGE; 1189 1190 case MRB_TT_STRING: 1191 *beg = str_index_str(mrb, str, indx, 0); 1192 if (*beg < 0) { break; } 1193 *len = RSTRING_LEN(indx); 1194 return STR_BYTE_RANGE_CORRECTED; 1195 1196 case MRB_TT_RANGE: 1197 goto range_arg; 1198 1199 default: 1200 indx = mrb_to_int(mrb, indx); 1201 if (mrb_fixnum_p(indx)) { 1202 *beg = mrb_fixnum(indx); 1203 *len = 1; 1204 return STR_CHAR_RANGE; 1205 } 1206 range_arg: 1207 *len = RSTRING_CHAR_LEN(str); 1208 switch (mrb_range_beg_len(mrb, indx, beg, len, *len, TRUE)) { 1209 case MRB_RANGE_OK: 1210 return STR_CHAR_RANGE_CORRECTED; 1211 case MRB_RANGE_OUT: 1212 return STR_OUT_OF_RANGE; 1119 1213 default: 1120 1214 break; 1121 }1122 1215 } 1216 1123 1217 mrb_raise(mrb, E_TYPE_ERROR, "can't convert to Fixnum"); 1124 } 1125 idx = mrb_fixnum(indx); 1126 goto num_index; 1127 } 1128 return mrb_nil_value(); /* not reached */ 1218 } 1219 } 1220 return STR_OUT_OF_RANGE; 1221 } 1222 1223 static mrb_value 1224 mrb_str_aref(mrb_state *mrb, mrb_value str, mrb_value indx, mrb_value alen) 1225 { 1226 mrb_int beg, len; 1227 1228 switch (str_convert_range(mrb, str, indx, alen, &beg, &len)) { 1229 case STR_CHAR_RANGE_CORRECTED: 1230 return str_subseq(mrb, str, beg, len); 1231 case STR_CHAR_RANGE: 1232 str = str_substr(mrb, str, beg, len); 1233 if (mrb_undef_p(alen) && !mrb_nil_p(str) && RSTRING_LEN(str) == 0) return mrb_nil_value(); 1234 return str; 1235 case STR_BYTE_RANGE_CORRECTED: 1236 if (mrb_string_p(indx)) { 1237 return mrb_str_dup(mrb, indx); 1238 } 1239 else { 1240 return mrb_str_byte_subseq(mrb, str, beg, len); 1241 } 1242 case STR_OUT_OF_RANGE: 1243 default: 1244 return mrb_nil_value(); 1245 } 1129 1246 } 1130 1247 … … 1136 1253 * str[fixnum, fixnum] => new_str or nil 1137 1254 * str[range] => new_str or nil 1138 * str[regexp] => new_str or nil1139 * str[regexp, fixnum] => new_str or nil1140 1255 * str[other_str] => new_str or nil 1141 1256 * str.slice(fixnum) => fixnum or nil … … 1173 1288 { 1174 1289 mrb_value a1, a2; 1175 int argc; 1176 1177 argc = mrb_get_args(mrb, "o|o", &a1, &a2); 1178 if (argc == 2) { 1179 mrb_int n1, n2; 1180 1181 mrb_regexp_check(mrb, a1); 1182 mrb_get_args(mrb, "ii", &n1, &n2); 1183 return str_substr(mrb, str, n1, n2); 1184 } 1185 if (argc != 1) { 1186 mrb_raisef(mrb, E_ARGUMENT_ERROR, "wrong number of arguments (%S for 1)", mrb_fixnum_value(argc)); 1187 } 1188 return mrb_str_aref(mrb, str, a1); 1290 1291 if (mrb_get_args(mrb, "o|o", &a1, &a2) == 1) { 1292 a2 = mrb_undef_value(); 1293 } 1294 1295 return mrb_str_aref(mrb, str, a1, a2); 1296 } 1297 1298 static mrb_noreturn void 1299 str_out_of_index(mrb_state *mrb, mrb_value index) 1300 { 1301 mrb_raisef(mrb, E_INDEX_ERROR, "index %v out of string", index); 1302 } 1303 1304 static mrb_value 1305 str_replace_partial(mrb_state *mrb, mrb_value src, mrb_int pos, mrb_int end, mrb_value rep) 1306 { 1307 const mrb_int shrink_threshold = 256; 1308 struct RString *str = mrb_str_ptr(src); 1309 mrb_int len = RSTR_LEN(str); 1310 mrb_int replen, newlen; 1311 char *strp; 1312 1313 if (end > len) { end = len; } 1314 1315 if (pos < 0 || pos > len) { 1316 str_out_of_index(mrb, mrb_fixnum_value(pos)); 1317 } 1318 1319 replen = (mrb_nil_p(rep) ? 0 : RSTRING_LEN(rep)); 1320 newlen = replen + len - (end - pos); 1321 1322 if (newlen >= MRB_SSIZE_MAX || newlen < replen /* overflowed */) { 1323 mrb_raise(mrb, E_RUNTIME_ERROR, "string size too big"); 1324 } 1325 1326 mrb_str_modify(mrb, str); 1327 1328 if (len < newlen) { 1329 resize_capa(mrb, str, newlen); 1330 } 1331 1332 strp = RSTR_PTR(str); 1333 1334 memmove(strp + newlen - (len - end), strp + end, len - end); 1335 if (!mrb_nil_p(rep)) { 1336 memmove(strp + pos, RSTRING_PTR(rep), replen); 1337 } 1338 RSTR_SET_LEN(str, newlen); 1339 strp[newlen] = '\0'; 1340 1341 if (len - newlen >= shrink_threshold) { 1342 resize_capa(mrb, str, newlen); 1343 } 1344 1345 return src; 1346 } 1347 1348 #define IS_EVSTR(p,e) ((p) < (e) && (*(p) == '$' || *(p) == '@' || *(p) == '{')) 1349 1350 static mrb_value 1351 str_escape(mrb_state *mrb, mrb_value str, mrb_bool inspect) 1352 { 1353 const char *p, *pend; 1354 char buf[4]; /* `\x??` or UTF-8 character */ 1355 mrb_value result = mrb_str_new_lit(mrb, "\""); 1356 #ifdef MRB_UTF8_STRING 1357 uint32_t ascii_flag = MRB_STR_ASCII; 1358 #endif 1359 1360 p = RSTRING_PTR(str); pend = RSTRING_END(str); 1361 for (;p < pend; p++) { 1362 unsigned char c, cc; 1363 #ifdef MRB_UTF8_STRING 1364 if (inspect) { 1365 mrb_int clen = mrb_utf8len(p, pend); 1366 if (clen > 1) { 1367 mrb_int i; 1368 1369 for (i=0; i<clen; i++) { 1370 buf[i] = p[i]; 1371 } 1372 mrb_str_cat(mrb, result, buf, clen); 1373 p += clen-1; 1374 ascii_flag = 0; 1375 continue; 1376 } 1377 } 1378 #endif 1379 c = *p; 1380 if (c == '"'|| c == '\\' || (c == '#' && IS_EVSTR(p+1, pend))) { 1381 buf[0] = '\\'; buf[1] = c; 1382 mrb_str_cat(mrb, result, buf, 2); 1383 continue; 1384 } 1385 if (ISPRINT(c)) { 1386 buf[0] = c; 1387 mrb_str_cat(mrb, result, buf, 1); 1388 continue; 1389 } 1390 switch (c) { 1391 case '\n': cc = 'n'; break; 1392 case '\r': cc = 'r'; break; 1393 case '\t': cc = 't'; break; 1394 case '\f': cc = 'f'; break; 1395 case '\013': cc = 'v'; break; 1396 case '\010': cc = 'b'; break; 1397 case '\007': cc = 'a'; break; 1398 case 033: cc = 'e'; break; 1399 default: cc = 0; break; 1400 } 1401 if (cc) { 1402 buf[0] = '\\'; 1403 buf[1] = (char)cc; 1404 mrb_str_cat(mrb, result, buf, 2); 1405 continue; 1406 } 1407 else { 1408 buf[0] = '\\'; 1409 buf[1] = 'x'; 1410 buf[3] = mrb_digitmap[c % 16]; c /= 16; 1411 buf[2] = mrb_digitmap[c % 16]; 1412 mrb_str_cat(mrb, result, buf, 4); 1413 continue; 1414 } 1415 } 1416 mrb_str_cat_lit(mrb, result, "\""); 1417 #ifdef MRB_UTF8_STRING 1418 if (inspect) { 1419 mrb_str_ptr(str)->flags |= ascii_flag; 1420 mrb_str_ptr(result)->flags |= ascii_flag; 1421 } 1422 else { 1423 RSTR_SET_ASCII_FLAG(mrb_str_ptr(result)); 1424 } 1425 #endif 1426 1427 return result; 1428 } 1429 1430 static void 1431 mrb_str_aset(mrb_state *mrb, mrb_value str, mrb_value indx, mrb_value alen, mrb_value replace) 1432 { 1433 mrb_int beg, len, charlen; 1434 1435 mrb_to_str(mrb, replace); 1436 1437 switch (str_convert_range(mrb, str, indx, alen, &beg, &len)) { 1438 case STR_OUT_OF_RANGE: 1439 default: 1440 mrb_raise(mrb, E_INDEX_ERROR, "string not matched"); 1441 case STR_CHAR_RANGE: 1442 if (len < 0) { 1443 mrb_raisef(mrb, E_INDEX_ERROR, "negative length %v", alen); 1444 } 1445 charlen = RSTRING_CHAR_LEN(str); 1446 if (beg < 0) { beg += charlen; } 1447 if (beg < 0 || beg > charlen) { str_out_of_index(mrb, indx); } 1448 /* fall through */ 1449 case STR_CHAR_RANGE_CORRECTED: 1450 str_range_to_bytes(str, &beg, &len); 1451 /* fall through */ 1452 case STR_BYTE_RANGE_CORRECTED: 1453 str_replace_partial(mrb, str, beg, beg + len, replace); 1454 } 1455 } 1456 1457 /* 1458 * call-seq: 1459 * str[fixnum] = replace 1460 * str[fixnum, fixnum] = replace 1461 * str[range] = replace 1462 * str[other_str] = replace 1463 * 1464 * Modify +self+ by replacing the content of +self+. 1465 * The portion of the string affected is determined using the same criteria as +String#[]+. 1466 */ 1467 static mrb_value 1468 mrb_str_aset_m(mrb_state *mrb, mrb_value str) 1469 { 1470 mrb_value indx, alen, replace; 1471 1472 switch (mrb_get_args(mrb, "oo|S!", &indx, &alen, &replace)) { 1473 case 2: 1474 replace = alen; 1475 alen = mrb_undef_value(); 1476 break; 1477 case 3: 1478 break; 1479 } 1480 mrb_str_aset(mrb, str, indx, alen, replace); 1481 return str; 1189 1482 } 1190 1483 … … 1209 1502 struct RString *s = mrb_str_ptr(str); 1210 1503 1211 mrb_str_modify (mrb, s);1504 mrb_str_modify_keep_ascii(mrb, s); 1212 1505 if (RSTR_LEN(s) == 0 || !RSTR_PTR(s)) return mrb_nil_value(); 1213 1506 p = RSTR_PTR(s); pend = RSTR_PTR(s) + RSTR_LEN(s); … … 1267 1560 struct RString *s = mrb_str_ptr(str); 1268 1561 1269 mrb_str_modify(mrb, s);1270 1562 argc = mrb_get_args(mrb, "|S", &rs); 1563 mrb_str_modify_keep_ascii(mrb, s); 1271 1564 len = RSTR_LEN(s); 1272 1565 if (argc == 0) { … … 1330 1623 * 1331 1624 * Returns a new <code>String</code> with the given record separator removed 1332 * from the end of <i>str</i> (if present). If <code>$/</code> has not been 1333 * changed from the default Ruby record separator, then <code>chomp</code> also 1334 * removes carriage return characters (that is it will remove <code>\n</code>, 1625 * from the end of <i>str</i> (if present). <code>chomp</code> also removes 1626 * carriage return characters (that is it will remove <code>\n</code>, 1335 1627 * <code>\r</code>, and <code>\r\n</code>). 1336 1628 * … … 1367 1659 struct RString *s = mrb_str_ptr(str); 1368 1660 1369 mrb_str_modify (mrb, s);1661 mrb_str_modify_keep_ascii(mrb, s); 1370 1662 if (RSTR_LEN(s) > 0) { 1371 1663 mrb_int len; … … 1374 1666 const char* e = p + RSTR_LEN(s); 1375 1667 while (p<e) { 1376 mrb_int clen = utf8len(p, e);1668 mrb_int clen = mrb_utf8len(p, e); 1377 1669 if (p + clen>=e) break; 1378 1670 p += clen; … … 1436 1728 struct RString *s = mrb_str_ptr(str); 1437 1729 1438 mrb_str_modify (mrb, s);1730 mrb_str_modify_keep_ascii(mrb, s); 1439 1731 p = RSTR_PTR(s); 1440 1732 pend = RSTR_PTR(s) + RSTR_LEN(s); … … 1504 1796 1505 1797 mrb_get_args(mrb, "o", &str2); 1506 eql_p = (mrb_ type(str2) == MRB_TT_STRING) && str_eql(mrb, self, str2);1798 eql_p = (mrb_string_p(str2)) && str_eql(mrb, self, str2); 1507 1799 1508 1800 return mrb_bool_value(eql_p); … … 1515 1807 } 1516 1808 1517 mrb_int1809 uint32_t 1518 1810 mrb_str_hash(mrb_state *mrb, mrb_value str) 1519 1811 { … … 1522 1814 mrb_int len = RSTR_LEN(s); 1523 1815 char *p = RSTR_PTR(s); 1524 mrb_int key = 0;1816 uint64_t key = 0; 1525 1817 1526 1818 while (len--) { … … 1528 1820 p++; 1529 1821 } 1530 return key + (key>>5);1822 return (uint32_t)(key + (key>>5)); 1531 1823 } 1532 1824 … … 1564 1856 1565 1857 mrb_get_args(mrb, "S", &str2); 1566 if (str_index (mrb, self, str2, 0) < 0)1858 if (str_index_str(mrb, self, str2, 0) < 0) 1567 1859 return mrb_bool_value(FALSE); 1568 1860 return mrb_bool_value(TRUE); … … 1573 1865 * call-seq: 1574 1866 * str.index(substring [, offset]) => fixnum or nil 1575 * str.index(fixnum [, offset]) => fixnum or nil1576 * str.index(regexp [, offset]) => fixnum or nil1577 1867 * 1578 1868 * Returns the index of the first occurrence of the given 1579 * <i>substring</i>, 1580 * character (<i>fixnum</i>), or pattern (<i>regexp</i>) in <i>str</i>. 1581 * Returns 1582 * <code>nil</code> if not found. 1869 * <i>substring</i>. Returns <code>nil</code> if not found. 1583 1870 * If the second parameter is present, it 1584 1871 * specifies the position in the string to begin the search. 1585 1872 * 1586 * "hello".index(' e') #=> 11873 * "hello".index('l') #=> 2 1587 1874 * "hello".index('lo') #=> 3 1588 1875 * "hello".index('a') #=> nil 1589 * "hello".index(101) #=> 1(101=0x65='e') 1590 * "hello".index(/[aeiou]/, -3) #=> 4 1591 */ 1592 static mrb_value 1593 mrb_str_index(mrb_state *mrb, mrb_value str) 1594 { 1595 mrb_value *argv; 1596 mrb_int argc; 1876 * "hello".index('l', -2) #=> 3 1877 */ 1878 static mrb_value 1879 mrb_str_index_m(mrb_state *mrb, mrb_value str) 1880 { 1597 1881 mrb_value sub; 1598 mrb_int pos, clen; 1599 1600 mrb_get_args(mrb, "*", &argv, &argc); 1601 if (argc == 2) { 1602 mrb_get_args(mrb, "oi", &sub, &pos); 1603 } 1604 else { 1882 mrb_int pos; 1883 1884 if (mrb_get_args(mrb, "S|i", &sub, &pos) == 1) { 1605 1885 pos = 0; 1606 if (argc > 0) 1607 sub = argv[0]; 1608 else 1609 sub = mrb_nil_value(); 1610 } 1611 mrb_regexp_check(mrb, sub); 1612 clen = RSTRING_CHAR_LEN(str); 1613 if (pos < 0) { 1886 } 1887 else if (pos < 0) { 1888 mrb_int clen = RSTRING_CHAR_LEN(str); 1614 1889 pos += clen; 1615 1890 if (pos < 0) { … … 1617 1892 } 1618 1893 } 1619 if (pos > clen) return mrb_nil_value(); 1620 pos = chars2bytes(str, 0, pos); 1621 1622 switch (mrb_type(sub)) { 1623 default: { 1624 mrb_value tmp; 1625 1626 tmp = mrb_check_string_type(mrb, sub); 1627 if (mrb_nil_p(tmp)) { 1628 mrb_raisef(mrb, E_TYPE_ERROR, "type mismatch: %S given", sub); 1629 } 1630 sub = tmp; 1631 } 1632 /* fall through */ 1633 case MRB_TT_STRING: 1634 pos = str_index(mrb, str, sub, pos); 1635 break; 1636 } 1894 pos = str_index_str_by_char(mrb, str, sub, pos); 1637 1895 1638 1896 if (pos == -1) return mrb_nil_value(); 1639 pos = bytes2chars(RSTRING_PTR(str), pos);1640 1897 BYTES_ALIGN_CHECK(pos); 1641 1898 return mrb_fixnum_value(pos); 1642 1899 } 1643 1644 #define STR_REPLACE_SHARED_MIN 101645 1900 1646 1901 /* 15.2.10.5.24 */ … … 1712 1967 mrb_obj_as_string(mrb_state *mrb, mrb_value obj) 1713 1968 { 1714 mrb_value str;1715 1716 1969 if (mrb_string_p(obj)) { 1717 1970 return obj; 1718 1971 } 1719 str = mrb_funcall(mrb, obj, "to_s", 0); 1720 if (!mrb_string_p(str)) 1721 return mrb_any_to_s(mrb, obj); 1722 return str; 1972 return mrb_str_to_str(mrb, obj); 1723 1973 } 1724 1974 … … 1753 2003 } 1754 2004 1755 MRB_API mrb_value 1756 mrb_string_type(mrb_state *mrb, mrb_value str)1757 { 1758 return mrb_convert_type(mrb, str, MRB_TT_STRING, "String", "to_str");1759 } 1760 1761 MRB_API mrb_value 1762 mrb_check_string_type(mrb_state *mrb, mrb_value str) 1763 { 1764 return mrb_check_convert_type(mrb, str, MRB_TT_STRING, "String", "to_str");2005 static inline void 2006 str_reverse(char *p, char *e) 2007 { 2008 char c; 2009 2010 while (p < e) { 2011 c = *p; 2012 *p++ = *e; 2013 *e-- = c; 2014 } 1765 2015 } 1766 2016 … … 1775 2025 mrb_str_reverse_bang(mrb_state *mrb, mrb_value str) 1776 2026 { 2027 struct RString *s = mrb_str_ptr(str); 2028 char *p, *e; 2029 1777 2030 #ifdef MRB_UTF8_STRING 1778 2031 mrb_int utf8_len = RSTRING_CHAR_LEN(str); 1779 mrb_int len = RSTRING_LEN(str); 1780 1781 if (utf8_len == len) goto bytes; 1782 if (utf8_len > 1) { 1783 char *buf; 1784 char *p, *e, *r; 1785 1786 mrb_str_modify(mrb, mrb_str_ptr(str)); 1787 len = RSTRING_LEN(str); 1788 buf = (char*)mrb_malloc(mrb, (size_t)len); 1789 p = buf; 1790 e = buf + len; 1791 1792 memcpy(buf, RSTRING_PTR(str), len); 1793 r = RSTRING_PTR(str) + len; 1794 2032 mrb_int len = RSTR_LEN(s); 2033 2034 if (utf8_len < 2) return str; 2035 if (utf8_len < len) { 2036 mrb_str_modify(mrb, s); 2037 p = RSTR_PTR(s); 2038 e = p + RSTR_LEN(s); 1795 2039 while (p<e) { 1796 mrb_int clen = utf8len(p, e); 1797 r -= clen; 1798 memcpy(r, p, clen); 2040 mrb_int clen = mrb_utf8len(p, e); 2041 str_reverse(p, p + clen - 1); 1799 2042 p += clen; 1800 2043 } 1801 mrb_free(mrb, buf); 2044 goto bytes; 2045 } 2046 #endif 2047 2048 if (RSTR_LEN(s) > 1) { 2049 mrb_str_modify(mrb, s); 2050 goto bytes; 1802 2051 } 1803 2052 return str; 1804 2053 1805 2054 bytes: 1806 #endif 1807 { 1808 struct RString *s = mrb_str_ptr(str); 1809 char *p, *e; 1810 char c; 1811 1812 mrb_str_modify(mrb, s); 1813 if (RSTR_LEN(s) > 1) { 1814 p = RSTR_PTR(s); 1815 e = p + RSTR_LEN(s) - 1; 1816 while (p < e) { 1817 c = *p; 1818 *p++ = *e; 1819 *e-- = c; 1820 } 1821 } 1822 return str; 1823 } 2055 p = RSTR_PTR(s); 2056 e = p + RSTR_LEN(s) - 1; 2057 str_reverse(p, e); 2058 return str; 1824 2059 } 1825 2060 … … 1845 2080 /* 1846 2081 * call-seq: 1847 * str.rindex(substring [, fixnum]) => fixnum or nil 1848 * str.rindex(fixnum [, fixnum]) => fixnum or nil 1849 * str.rindex(regexp [, fixnum]) => fixnum or nil 1850 * 1851 * Returns the index of the last occurrence of the given <i>substring</i>, 1852 * character (<i>fixnum</i>), or pattern (<i>regexp</i>) in <i>str</i>. Returns 1853 * <code>nil</code> if not found. If the second parameter is present, it 1854 * specifies the position in the string to end the search---characters beyond 1855 * this point will not be considered. 2082 * str.rindex(substring [, offset]) => fixnum or nil 2083 * 2084 * Returns the index of the last occurrence of the given <i>substring</i>. 2085 * Returns <code>nil</code> if not found. If the second parameter is 2086 * present, it specifies the position in the string to end the 2087 * search---characters beyond this point will not be considered. 1856 2088 * 1857 2089 * "hello".rindex('e') #=> 1 1858 2090 * "hello".rindex('l') #=> 3 1859 2091 * "hello".rindex('a') #=> nil 1860 * "hello".rindex(101) #=> 1 1861 * "hello".rindex(/[aeiou]/, -2) #=> 1 2092 * "hello".rindex('l', 2) #=> 2 1862 2093 */ 1863 2094 static mrb_value 1864 2095 mrb_str_rindex(mrb_state *mrb, mrb_value str) 1865 2096 { 1866 mrb_value *argv;1867 mrb_int argc;1868 2097 mrb_value sub; 1869 2098 mrb_int pos, len = RSTRING_CHAR_LEN(str); 1870 2099 1871 mrb_get_args(mrb, "*", &argv, &argc); 1872 if (argc == 2) { 1873 mrb_get_args(mrb, "oi", &sub, &pos); 2100 if (mrb_get_args(mrb, "S|i", &sub, &pos) == 1) { 2101 pos = len; 2102 } 2103 else { 1874 2104 if (pos < 0) { 1875 2105 pos += len; 1876 2106 if (pos < 0) { 1877 mrb_regexp_check(mrb, sub);1878 2107 return mrb_nil_value(); 1879 2108 } … … 1881 2110 if (pos > len) pos = len; 1882 2111 } 1883 else {1884 pos = len;1885 if (argc > 0)1886 sub = argv[0];1887 else1888 sub = mrb_nil_value();1889 }1890 2112 pos = chars2bytes(str, 0, pos); 1891 mrb_regexp_check(mrb, sub); 1892 1893 switch (mrb_type(sub)) { 1894 default: { 1895 mrb_value tmp; 1896 1897 tmp = mrb_check_string_type(mrb, sub); 1898 if (mrb_nil_p(tmp)) { 1899 mrb_raisef(mrb, E_TYPE_ERROR, "type mismatch: %S given", sub); 1900 } 1901 sub = tmp; 1902 } 1903 /* fall through */ 1904 case MRB_TT_STRING: 1905 pos = str_rindex(mrb, str, sub, pos); 1906 if (pos >= 0) { 1907 pos = bytes2chars(RSTRING_PTR(str), pos); 1908 BYTES_ALIGN_CHECK(pos); 1909 return mrb_fixnum_value(pos); 1910 } 1911 break; 1912 1913 } /* end of switch (TYPE(sub)) */ 2113 pos = str_rindex(mrb, str, sub, pos); 2114 if (pos >= 0) { 2115 pos = bytes2chars(RSTRING_PTR(str), RSTRING_LEN(str), pos); 2116 BYTES_ALIGN_CHECK(pos); 2117 return mrb_fixnum_value(pos); 2118 } 1914 2119 return mrb_nil_value(); 1915 2120 } … … 1919 2124 /* 1920 2125 * call-seq: 1921 * str.split( pattern="\n", [limit]) => anArray2126 * str.split(separator=nil, [limit]) => anArray 1922 2127 * 1923 2128 * Divides <i>str</i> into substrings based on a delimiter, returning an array 1924 2129 * of these substrings. 1925 2130 * 1926 * If <i> pattern</i> is a <code>String</code>, then its contents are used as1927 * the delimiter when splitting <i>str</i>. If <i> pattern</i> is a single2131 * If <i>separator</i> is a <code>String</code>, then its contents are used as 2132 * the delimiter when splitting <i>str</i>. If <i>separator</i> is a single 1928 2133 * space, <i>str</i> is split on whitespace, with leading whitespace and runs 1929 2134 * of contiguous whitespace characters ignored. 1930 2135 * 1931 * If <i>pattern</i> is a <code>Regexp</code>, <i>str</i> is divided where the 1932 * pattern matches. Whenever the pattern matches a zero-length string, 1933 * <i>str</i> is split into individual characters. 1934 * 1935 * If <i>pattern</i> is omitted, the value of <code>$;</code> is used. If 1936 * <code>$;</code> is <code>nil</code> (which is the default), <i>str</i> is 1937 * split on whitespace as if ' ' were specified. 2136 * If <i>separator</i> is omitted or <code>nil</code> (which is the default), 2137 * <i>str</i> is split on whitespace as if ' ' were specified. 1938 2138 * 1939 2139 * If the <i>limit</i> parameter is omitted, trailing null fields are … … 1946 2146 * " now's the time".split #=> ["now's", "the", "time"] 1947 2147 * " now's the time".split(' ') #=> ["now's", "the", "time"] 1948 * " now's the time".split(/ /) #=> ["", "now's", "", "the", "time"]1949 * "hello".split(//) #=> ["h", "e", "l", "l", "o"]1950 * "hello".split(//, 3) #=> ["h", "e", "llo"]1951 2148 * 1952 2149 * "mellow yellow".split("ello") #=> ["m", "w y", "w"] … … 1959 2156 mrb_str_split_m(mrb_state *mrb, mrb_value str) 1960 2157 { 1961 int argc;2158 mrb_int argc; 1962 2159 mrb_value spat = mrb_nil_value(); 1963 enum {awk, string , regexp} split_type = string;2160 enum {awk, string} split_type = string; 1964 2161 mrb_int i = 0; 1965 2162 mrb_int beg; … … 1983 2180 split_type = awk; 1984 2181 } 1985 else { 1986 if (mrb_string_p(spat)) { 1987 split_type = string; 1988 if (RSTRING_LEN(spat) == 1 && RSTRING_PTR(spat)[0] == ' ') { 1989 split_type = awk; 1990 } 1991 } 1992 else { 1993 mrb_noregexp(mrb, str); 1994 } 2182 else if (!mrb_string_p(spat)) { 2183 mrb_raise(mrb, E_TYPE_ERROR, "expected String"); 2184 } 2185 else if (RSTRING_LEN(spat) == 1 && RSTRING_PTR(spat)[0] == ' ') { 2186 split_type = awk; 1995 2187 } 1996 2188 … … 2018 2210 } 2019 2211 else if (ISSPACE(c)) { 2020 mrb_ary_push(mrb, result, byte_subseq(mrb, str, beg, end-beg));2212 mrb_ary_push(mrb, result, mrb_str_byte_subseq(mrb, str, beg, end-beg)); 2021 2213 mrb_gc_arena_restore(mrb, ai); 2022 2214 skip = TRUE; … … 2029 2221 } 2030 2222 } 2031 else if (split_type == string) {2223 else { /* split_type == string */ 2032 2224 mrb_int str_len = RSTRING_LEN(str); 2033 2225 mrb_int pat_len = RSTRING_LEN(spat); … … 2043 2235 end = chars2bytes(str, idx, 1); 2044 2236 } 2045 mrb_ary_push(mrb, result, byte_subseq(mrb, str, idx, end));2237 mrb_ary_push(mrb, result, mrb_str_byte_subseq(mrb, str, idx, end)); 2046 2238 mrb_gc_arena_restore(mrb, ai); 2047 2239 idx += end + pat_len; … … 2050 2242 beg = idx; 2051 2243 } 2052 else {2053 mrb_noregexp(mrb, str);2054 }2055 2244 if (RSTRING_LEN(str) > 0 && (lim_p || RSTRING_LEN(str) > beg || lim < 0)) { 2056 2245 if (RSTRING_LEN(str) == beg) { … … 2058 2247 } 2059 2248 else { 2060 tmp = byte_subseq(mrb, str, beg, RSTRING_LEN(str)-beg);2249 tmp = mrb_str_byte_subseq(mrb, str, beg, RSTRING_LEN(str)-beg); 2061 2250 } 2062 2251 mrb_ary_push(mrb, result, tmp); … … 2072 2261 } 2073 2262 2074 MRB_APImrb_value2075 mrb_str_len_to_inum(mrb_state *mrb, const char *str, size_t len,int base, int badcheck)2263 mrb_value 2264 mrb_str_len_to_inum(mrb_state *mrb, const char *str, mrb_int len, mrb_int base, int badcheck) 2076 2265 { 2077 2266 const char *p = str; … … 2156 2345 default: 2157 2346 if (base < 2 || 36 < base) { 2158 mrb_raisef(mrb, E_ARGUMENT_ERROR, "illegal radix % S", mrb_fixnum_value(base));2347 mrb_raisef(mrb, E_ARGUMENT_ERROR, "illegal radix %i", base); 2159 2348 } 2160 2349 break; … … 2183 2372 p--; 2184 2373 } 2185 if (p == pend ) {2374 if (p == pend || *p == '_') { 2186 2375 if (badcheck) goto bad; 2187 2376 return mrb_fixnum_value(0); … … 2209 2398 n += c; 2210 2399 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)); 2400 #ifndef MRB_WITHOUT_FLOAT 2401 if (base == 10) { 2402 return mrb_float_value(mrb, mrb_str_to_dbl(mrb, mrb_str_new(mrb, str, len), badcheck)); 2403 } 2404 else 2405 #endif 2406 { 2407 mrb_raisef(mrb, E_RANGE_ERROR, "string (%l) too big for integer", str, pend-str); 2408 } 2213 2409 } 2214 2410 } 2215 2411 val = (mrb_int)n; 2216 2412 if (badcheck) { 2217 if (p == str) goto bad; /* no number */ 2413 if (p == str) goto bad; /* no number */ 2414 if (*(p - 1) == '_') goto bad; /* trailing '_' */ 2218 2415 while (p<pend && ISSPACE(*p)) p++; 2219 if (p<pend) goto bad; /* trailing garbage */2416 if (p<pend) goto bad; /* trailing garbage */ 2220 2417 } 2221 2418 … … 2225 2422 /* not reached */ 2226 2423 bad: 2227 mrb_raisef(mrb, E_ARGUMENT_ERROR, "invalid string for number(%S)", 2228 mrb_inspect(mrb, mrb_str_new(mrb, str, pend-str))); 2424 mrb_raisef(mrb, E_ARGUMENT_ERROR, "invalid string for number(%!l)", str, pend-str); 2229 2425 /* not reached */ 2230 2426 return mrb_fixnum_value(0); … … 2232 2428 2233 2429 MRB_API mrb_value 2234 mrb_cstr_to_inum(mrb_state *mrb, const char *str, int base, intbadcheck)2430 mrb_cstr_to_inum(mrb_state *mrb, const char *str, mrb_int base, mrb_bool badcheck) 2235 2431 { 2236 2432 return mrb_str_len_to_inum(mrb, str, strlen(str), base, badcheck); 2237 2433 } 2238 2434 2435 /* obslete: use RSTRING_CSTR() or mrb_string_cstr() */ 2239 2436 MRB_API const char* 2240 2437 mrb_string_value_cstr(mrb_state *mrb, mrb_value *ptr) 2241 2438 { 2242 mrb_value str = mrb_str_to_str(mrb, *ptr); 2243 struct RString *ps = mrb_str_ptr(str); 2244 mrb_int len = mrb_str_strlen(mrb, ps); 2245 char *p = RSTR_PTR(ps); 2246 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 } 2252 mrb_str_modify(mrb, ps); 2253 return RSTR_PTR(ps); 2254 } 2255 return p; 2439 struct RString *ps; 2440 const char *p; 2441 mrb_int len; 2442 2443 check_null_byte(mrb, *ptr); 2444 ps = mrb_str_ptr(*ptr); 2445 p = RSTR_PTR(ps); 2446 len = RSTR_LEN(ps); 2447 if (p[len] == '\0') { 2448 return p; 2449 } 2450 2451 /* 2452 * Even after str_modify_keep_ascii(), NULL termination is not ensured if 2453 * RSTR_SET_LEN() is used explicitly (e.g. String#delete_suffix!). 2454 */ 2455 str_modify_keep_ascii(mrb, ps); 2456 RSTR_PTR(ps)[len] = '\0'; 2457 return RSTR_PTR(ps); 2458 } 2459 2460 MRB_API const char* 2461 mrb_string_cstr(mrb_state *mrb, mrb_value str) 2462 { 2463 return mrb_string_value_cstr(mrb, &str); 2256 2464 } 2257 2465 … … 2262 2470 mrb_int len; 2263 2471 2264 s = mrb_string_value_ptr(mrb, str); 2472 mrb_to_str(mrb, str); 2473 s = RSTRING_PTR(str); 2265 2474 len = RSTRING_LEN(str); 2266 2475 return mrb_str_len_to_inum(mrb, s, len, base, badcheck); … … 2295 2504 mrb_get_args(mrb, "|i", &base); 2296 2505 if (base < 0) { 2297 mrb_raisef(mrb, E_ARGUMENT_ERROR, "illegal radix % S", mrb_fixnum_value(base));2506 mrb_raisef(mrb, E_ARGUMENT_ERROR, "illegal radix %i", base); 2298 2507 } 2299 2508 return mrb_str_to_inum(mrb, self, base, FALSE); 2300 2509 } 2301 2510 2302 MRB_API double 2303 mrb_cstr_to_dbl(mrb_state *mrb, const char * p, mrb_bool badcheck) 2304 { 2511 #ifndef MRB_WITHOUT_FLOAT 2512 double 2513 mrb_str_len_to_dbl(mrb_state *mrb, const char *s, size_t len, mrb_bool badcheck) 2514 { 2515 char buf[DBL_DIG * 4 + 20]; 2516 const char *p = s, *p2; 2517 const char *pend = p + len; 2305 2518 char *end; 2306 char buf[DBL_DIG * 4 + 10]; 2519 char *n; 2520 char prev = 0; 2307 2521 double d; 2308 2309 enum {max_width = 20}; 2522 mrb_bool dot = FALSE; 2310 2523 2311 2524 if (!p) return 0.0; 2312 while (ISSPACE(*p)) p++; 2313 2314 if (!badcheck && p[0] == '0' && (p[1] == 'x' || p[1] == 'X')) { 2315 return 0.0; 2316 } 2525 while (p<pend && ISSPACE(*p)) p++; 2526 p2 = p; 2527 2528 if (pend - p > 2 && p[0] == '0' && (p[1] == 'x' || p[1] == 'X')) { 2529 mrb_value x; 2530 2531 if (!badcheck) return 0.0; 2532 x = mrb_str_len_to_inum(mrb, p, pend-p, 0, badcheck); 2533 if (mrb_fixnum_p(x)) 2534 d = (double)mrb_fixnum(x); 2535 else /* if (mrb_float_p(x)) */ 2536 d = mrb_float(x); 2537 return d; 2538 } 2539 while (p < pend) { 2540 if (!*p) { 2541 if (badcheck) { 2542 mrb_raise(mrb, E_ARGUMENT_ERROR, "string for Float contains null byte"); 2543 /* not reached */ 2544 } 2545 pend = p; 2546 p = p2; 2547 goto nocopy; 2548 } 2549 if (!badcheck && *p == ' ') { 2550 pend = p; 2551 p = p2; 2552 goto nocopy; 2553 } 2554 if (*p == '_') break; 2555 p++; 2556 } 2557 p = p2; 2558 n = buf; 2559 while (p < pend) { 2560 char c = *p++; 2561 if (c == '.') dot = TRUE; 2562 if (c == '_') { 2563 /* remove an underscore between digits */ 2564 if (n == buf || !ISDIGIT(prev) || p == pend) { 2565 if (badcheck) goto bad; 2566 break; 2567 } 2568 } 2569 else if (badcheck && prev == '_' && !ISDIGIT(c)) goto bad; 2570 else { 2571 const char *bend = buf+sizeof(buf)-1; 2572 if (n==bend) { /* buffer overflow */ 2573 if (dot) break; /* cut off remaining fractions */ 2574 return INFINITY; 2575 } 2576 *n++ = c; 2577 } 2578 prev = c; 2579 } 2580 *n = '\0'; 2581 p = buf; 2582 pend = n; 2583 nocopy: 2317 2584 d = mrb_float_read(p, &end); 2318 2585 if (p == end) { 2319 2586 if (badcheck) { 2320 2587 bad: 2321 mrb_raisef(mrb, E_ARGUMENT_ERROR, "invalid string for float(% S)", mrb_str_new_cstr(mrb, p));2588 mrb_raisef(mrb, E_ARGUMENT_ERROR, "invalid string for float(%!s)", s); 2322 2589 /* not reached */ 2323 2590 } 2324 2591 return d; 2325 2592 } 2326 if (*end) { 2327 char *n = buf; 2328 char *e = buf + sizeof(buf) - 1; 2329 char prev = 0; 2330 2331 while (p < end && n < e) prev = *n++ = *p++; 2332 while (*p) { 2333 if (*p == '_') { 2334 /* remove underscores between digits */ 2335 if (badcheck) { 2336 if (n == buf || !ISDIGIT(prev)) goto bad; 2337 ++p; 2338 if (!ISDIGIT(*p)) goto bad; 2339 } 2340 else { 2341 while (*++p == '_'); 2342 continue; 2343 } 2344 } 2345 prev = *p++; 2346 if (n < e) *n++ = prev; 2347 } 2348 *n = '\0'; 2349 p = buf; 2350 2351 if (!badcheck && p[0] == '0' && (p[1] == 'x' || p[1] == 'X')) { 2352 return 0.0; 2353 } 2354 2355 d = mrb_float_read(p, &end); 2356 if (badcheck) { 2357 if (!end || p == end) goto bad; 2358 while (*end && ISSPACE(*end)) end++; 2359 if (*end) goto bad; 2360 } 2593 if (badcheck) { 2594 if (!end || p == end) goto bad; 2595 while (end<pend && ISSPACE(*end)) end++; 2596 if (end<pend) goto bad; 2361 2597 } 2362 2598 return d; 2599 } 2600 2601 MRB_API double 2602 mrb_cstr_to_dbl(mrb_state *mrb, const char *s, mrb_bool badcheck) 2603 { 2604 return mrb_str_len_to_dbl(mrb, s, strlen(s), badcheck); 2363 2605 } 2364 2606 … … 2366 2608 mrb_str_to_dbl(mrb_state *mrb, mrb_value str, mrb_bool badcheck) 2367 2609 { 2368 char *s; 2369 mrb_int len; 2370 2371 str = mrb_str_to_str(mrb, str); 2372 s = RSTRING_PTR(str); 2373 len = RSTRING_LEN(str); 2374 if (s) { 2375 if (badcheck && memchr(s, '\0', len)) { 2376 mrb_raise(mrb, E_ARGUMENT_ERROR, "string for Float contains null byte"); 2377 } 2378 if (s[len]) { /* no sentinel somehow */ 2379 struct RString *temp_str = str_new(mrb, s, len); 2380 s = RSTR_PTR(temp_str); 2381 } 2382 } 2383 return mrb_cstr_to_dbl(mrb, s, badcheck); 2610 return mrb_str_len_to_dbl(mrb, RSTRING_PTR(str), RSTRING_LEN(str), badcheck); 2384 2611 } 2385 2612 … … 2403 2630 return mrb_float_value(mrb, mrb_str_to_dbl(mrb, self, FALSE)); 2404 2631 } 2632 #endif 2405 2633 2406 2634 /* 15.2.10.5.40 */ … … 2408 2636 * call-seq: 2409 2637 * str.to_s => str 2410 * str.to_str => str2411 2638 * 2412 2639 * Returns the receiver. … … 2436 2663 mrb_bool modify = FALSE; 2437 2664 2438 mrb_str_modify (mrb, s);2665 mrb_str_modify_keep_ascii(mrb, s); 2439 2666 p = RSTRING_PTR(str); 2440 2667 pend = RSTRING_END(str); … … 2472 2699 } 2473 2700 2474 #define IS_EVSTR(p,e) ((p) < (e) && (*(p) == '$' || *(p) == '@' || *(p) == '{'))2475 2476 2701 /* 2477 2702 * call-seq: … … 2484 2709 mrb_str_dump(mrb_state *mrb, mrb_value str) 2485 2710 { 2486 mrb_int len; 2487 const char *p, *pend; 2488 char *q; 2489 struct RString *result; 2490 2491 len = 2; /* "" */ 2492 p = RSTRING_PTR(str); pend = p + RSTRING_LEN(str); 2493 while (p < pend) { 2494 unsigned char c = *p++; 2495 switch (c) { 2496 case '"': case '\\': 2497 case '\n': case '\r': 2498 case '\t': case '\f': 2499 case '\013': case '\010': case '\007': case '\033': 2500 len += 2; 2501 break; 2502 2503 case '#': 2504 len += IS_EVSTR(p, pend) ? 2 : 1; 2505 break; 2506 2507 default: 2508 if (ISPRINT(c)) { 2509 len++; 2510 } 2511 else { 2512 len += 4; /* \NNN */ 2513 } 2514 break; 2515 } 2516 } 2517 2518 result = str_new(mrb, 0, len); 2519 str_with_class(mrb, result, str); 2520 p = RSTRING_PTR(str); pend = p + RSTRING_LEN(str); 2521 q = RSTR_PTR(result); 2522 *q++ = '"'; 2523 while (p < pend) { 2524 unsigned char c = *p++; 2525 2526 switch (c) { 2527 case '"': 2528 case '\\': 2529 *q++ = '\\'; 2530 *q++ = c; 2531 break; 2532 2533 case '\n': 2534 *q++ = '\\'; 2535 *q++ = 'n'; 2536 break; 2537 2538 case '\r': 2539 *q++ = '\\'; 2540 *q++ = 'r'; 2541 break; 2542 2543 case '\t': 2544 *q++ = '\\'; 2545 *q++ = 't'; 2546 break; 2547 2548 case '\f': 2549 *q++ = '\\'; 2550 *q++ = 'f'; 2551 break; 2552 2553 case '\013': 2554 *q++ = '\\'; 2555 *q++ = 'v'; 2556 break; 2557 2558 case '\010': 2559 *q++ = '\\'; 2560 *q++ = 'b'; 2561 break; 2562 2563 case '\007': 2564 *q++ = '\\'; 2565 *q++ = 'a'; 2566 break; 2567 2568 case '\033': 2569 *q++ = '\\'; 2570 *q++ = 'e'; 2571 break; 2572 2573 case '#': 2574 if (IS_EVSTR(p, pend)) *q++ = '\\'; 2575 *q++ = '#'; 2576 break; 2577 2578 default: 2579 if (ISPRINT(c)) { 2580 *q++ = c; 2581 } 2582 else { 2583 *q++ = '\\'; 2584 q[2] = '0' + c % 8; c /= 8; 2585 q[1] = '0' + c % 8; c /= 8; 2586 q[0] = '0' + c % 8; 2587 q += 3; 2588 } 2589 } 2590 } 2591 *q = '"'; 2592 return mrb_obj_value(result); 2711 return str_escape(mrb, str, FALSE); 2593 2712 } 2594 2713 … … 2596 2715 mrb_str_cat(mrb_state *mrb, mrb_value str, const char *ptr, size_t len) 2597 2716 { 2598 str_buf_cat(mrb, mrb_str_ptr(str), ptr, len); 2717 struct RString *s = mrb_str_ptr(str); 2718 size_t capa; 2719 size_t total; 2720 ptrdiff_t off = -1; 2721 2722 if (len == 0) return str; 2723 mrb_str_modify(mrb, s); 2724 if (ptr >= RSTR_PTR(s) && ptr <= RSTR_PTR(s) + (size_t)RSTR_LEN(s)) { 2725 off = ptr - RSTR_PTR(s); 2726 } 2727 2728 capa = RSTR_CAPA(s); 2729 total = RSTR_LEN(s)+len; 2730 if (total >= MRB_SSIZE_MAX) { 2731 size_error: 2732 mrb_raise(mrb, E_ARGUMENT_ERROR, "string size too big"); 2733 } 2734 if (capa <= total) { 2735 if (capa == 0) capa = 1; 2736 while (capa <= total) { 2737 if (capa <= MRB_SSIZE_MAX / 2) { 2738 capa *= 2; 2739 } 2740 else { 2741 capa = total+1; 2742 } 2743 } 2744 if (capa <= total || capa > MRB_SSIZE_MAX) { 2745 goto size_error; 2746 } 2747 resize_capa(mrb, s, capa); 2748 } 2749 if (off != -1) { 2750 ptr = RSTR_PTR(s) + off; 2751 } 2752 memcpy(RSTR_PTR(s) + RSTR_LEN(s), ptr, len); 2753 mrb_assert_int_fit(size_t, total, mrb_ssize, MRB_SSIZE_MAX); 2754 RSTR_SET_LEN(s, total); 2755 RSTR_PTR(s)[total] = '\0'; /* sentinel */ 2599 2756 return str; 2600 2757 } … … 2609 2766 mrb_str_cat_str(mrb_state *mrb, mrb_value str, mrb_value str2) 2610 2767 { 2768 if (mrb_str_ptr(str) == mrb_str_ptr(str2)) { 2769 mrb_str_modify(mrb, mrb_str_ptr(str)); 2770 } 2611 2771 return mrb_str_cat(mrb, str, RSTRING_PTR(str2), RSTRING_LEN(str2)); 2612 2772 } … … 2615 2775 mrb_str_append(mrb_state *mrb, mrb_value str1, mrb_value str2) 2616 2776 { 2617 str2 = mrb_str_to_str(mrb, str2);2777 mrb_to_str(mrb, str2); 2618 2778 return mrb_str_cat_str(mrb, str1, str2); 2619 2779 } 2620 2621 #define CHAR_ESC_LEN 13 /* sizeof(\x{ hex of 32bit unsigned int } \0) */2622 2780 2623 2781 /* … … 2635 2793 mrb_str_inspect(mrb_state *mrb, mrb_value str) 2636 2794 { 2637 const char *p, *pend; 2638 char buf[CHAR_ESC_LEN + 1]; 2639 mrb_value result = mrb_str_new_lit(mrb, "\""); 2640 2641 p = RSTRING_PTR(str); pend = RSTRING_END(str); 2642 for (;p < pend; p++) { 2643 unsigned char c, cc; 2644 #ifdef MRB_UTF8_STRING 2645 mrb_int clen; 2646 2647 clen = utf8len(p, pend); 2648 if (clen > 1) { 2649 mrb_int i; 2650 2651 for (i=0; i<clen; i++) { 2652 buf[i] = p[i]; 2653 } 2654 mrb_str_cat(mrb, result, buf, clen); 2655 p += clen-1; 2656 continue; 2657 } 2658 #endif 2659 c = *p; 2660 if (c == '"'|| c == '\\' || (c == '#' && IS_EVSTR(p+1, pend))) { 2661 buf[0] = '\\'; buf[1] = c; 2662 mrb_str_cat(mrb, result, buf, 2); 2663 continue; 2664 } 2665 if (ISPRINT(c)) { 2666 buf[0] = c; 2667 mrb_str_cat(mrb, result, buf, 1); 2668 continue; 2669 } 2670 switch (c) { 2671 case '\n': cc = 'n'; break; 2672 case '\r': cc = 'r'; break; 2673 case '\t': cc = 't'; break; 2674 case '\f': cc = 'f'; break; 2675 case '\013': cc = 'v'; break; 2676 case '\010': cc = 'b'; break; 2677 case '\007': cc = 'a'; break; 2678 case 033: cc = 'e'; break; 2679 default: cc = 0; break; 2680 } 2681 if (cc) { 2682 buf[0] = '\\'; 2683 buf[1] = (char)cc; 2684 mrb_str_cat(mrb, result, buf, 2); 2685 continue; 2686 } 2687 else { 2688 buf[0] = '\\'; 2689 buf[3] = '0' + c % 8; c /= 8; 2690 buf[2] = '0' + c % 8; c /= 8; 2691 buf[1] = '0' + c % 8; 2692 mrb_str_cat(mrb, result, buf, 4); 2693 continue; 2694 } 2695 } 2696 mrb_str_cat_lit(mrb, result, "\""); 2697 2698 return result; 2795 return str_escape(mrb, str, TRUE); 2699 2796 } 2700 2797 … … 2722 2819 } 2723 2820 2821 /* 2822 * call-seq: 2823 * str.getbyte(index) -> 0 .. 255 2824 * 2825 * returns the <i>index</i>th byte as an integer. 2826 */ 2827 static mrb_value 2828 mrb_str_getbyte(mrb_state *mrb, mrb_value str) 2829 { 2830 mrb_int pos; 2831 mrb_get_args(mrb, "i", &pos); 2832 2833 if (pos < 0) 2834 pos += RSTRING_LEN(str); 2835 if (pos < 0 || RSTRING_LEN(str) <= pos) 2836 return mrb_nil_value(); 2837 2838 return mrb_fixnum_value((unsigned char)RSTRING_PTR(str)[pos]); 2839 } 2840 2841 /* 2842 * call-seq: 2843 * str.setbyte(index, integer) -> integer 2844 * 2845 * modifies the <i>index</i>th byte as <i>integer</i>. 2846 */ 2847 static mrb_value 2848 mrb_str_setbyte(mrb_state *mrb, mrb_value str) 2849 { 2850 mrb_int pos, byte; 2851 mrb_int len; 2852 2853 mrb_get_args(mrb, "ii", &pos, &byte); 2854 2855 len = RSTRING_LEN(str); 2856 if (pos < -len || len <= pos) 2857 mrb_raisef(mrb, E_INDEX_ERROR, "index %i out of string", pos); 2858 if (pos < 0) 2859 pos += len; 2860 2861 mrb_str_modify(mrb, mrb_str_ptr(str)); 2862 byte &= 0xff; 2863 RSTRING_PTR(str)[pos] = (unsigned char)byte; 2864 return mrb_fixnum_value((unsigned char)byte); 2865 } 2866 2867 /* 2868 * call-seq: 2869 * str.byteslice(integer) -> new_str or nil 2870 * str.byteslice(integer, integer) -> new_str or nil 2871 * str.byteslice(range) -> new_str or nil 2872 * 2873 * Byte Reference---If passed a single Integer, returns a 2874 * substring of one byte at that position. If passed two Integer 2875 * objects, returns a substring starting at the offset given by the first, and 2876 * a length given by the second. If given a Range, a substring containing 2877 * bytes at offsets given by the range is returned. In all three cases, if 2878 * an offset is negative, it is counted from the end of <i>str</i>. Returns 2879 * <code>nil</code> if the initial offset falls outside the string, the length 2880 * is negative, or the beginning of the range is greater than the end. 2881 * The encoding of the resulted string keeps original encoding. 2882 * 2883 * "hello".byteslice(1) #=> "e" 2884 * "hello".byteslice(-1) #=> "o" 2885 * "hello".byteslice(1, 2) #=> "el" 2886 * "\x80\u3042".byteslice(1, 3) #=> "\u3042" 2887 * "\x03\u3042\xff".byteslice(1..3) #=> "\u3042" 2888 */ 2889 static mrb_value 2890 mrb_str_byteslice(mrb_state *mrb, mrb_value str) 2891 { 2892 mrb_value a1, a2; 2893 mrb_int str_len = RSTRING_LEN(str), beg, len; 2894 mrb_bool empty = TRUE; 2895 2896 if (mrb_get_args(mrb, "o|o", &a1, &a2) == 2) { 2897 beg = mrb_fixnum(mrb_to_int(mrb, a1)); 2898 len = mrb_fixnum(mrb_to_int(mrb, a2)); 2899 } 2900 else if (mrb_range_p(a1)) { 2901 if (mrb_range_beg_len(mrb, a1, &beg, &len, str_len, TRUE) != MRB_RANGE_OK) { 2902 return mrb_nil_value(); 2903 } 2904 } 2905 else { 2906 beg = mrb_fixnum(mrb_to_int(mrb, a1)); 2907 len = 1; 2908 empty = FALSE; 2909 } 2910 2911 if (mrb_str_beg_len(str_len, &beg, &len) && (empty || len != 0)) { 2912 return mrb_str_byte_subseq(mrb, str, beg, len); 2913 } 2914 else { 2915 return mrb_nil_value(); 2916 } 2917 } 2918 2724 2919 /* ---------------------------*/ 2725 2920 void … … 2728 2923 struct RClass *s; 2729 2924 2730 mrb_static_assert(RSTRING_EMBED_LEN_MAX < (1 << 5), "pointer size too big for embedded string"); 2925 mrb_static_assert(RSTRING_EMBED_LEN_MAX < (1 << MRB_STR_EMBED_LEN_BIT), 2926 "pointer size too big for embedded string"); 2731 2927 2732 2928 mrb->string_class = s = mrb_define_class(mrb, "String", mrb->object_class); /* 15.2.10 */ … … 2740 2936 mrb_define_method(mrb, s, "*", mrb_str_times, MRB_ARGS_REQ(1)); /* 15.2.10.5.5 */ 2741 2937 mrb_define_method(mrb, s, "[]", mrb_str_aref_m, MRB_ARGS_ANY()); /* 15.2.10.5.6 */ 2938 mrb_define_method(mrb, s, "[]=", mrb_str_aset_m, MRB_ARGS_ANY()); 2742 2939 mrb_define_method(mrb, s, "capitalize", mrb_str_capitalize, MRB_ARGS_NONE()); /* 15.2.10.5.7 */ 2743 2940 mrb_define_method(mrb, s, "capitalize!", mrb_str_capitalize_bang, MRB_ARGS_NONE()); /* 15.2.10.5.8 */ … … 2753 2950 mrb_define_method(mrb, s, "hash", mrb_str_hash_m, MRB_ARGS_NONE()); /* 15.2.10.5.20 */ 2754 2951 mrb_define_method(mrb, s, "include?", mrb_str_include, MRB_ARGS_REQ(1)); /* 15.2.10.5.21 */ 2755 mrb_define_method(mrb, s, "index", mrb_str_index , MRB_ARGS_ANY()); /* 15.2.10.5.22 */2952 mrb_define_method(mrb, s, "index", mrb_str_index_m, MRB_ARGS_ARG(1,1)); /* 15.2.10.5.22 */ 2756 2953 mrb_define_method(mrb, s, "initialize", mrb_str_init, MRB_ARGS_REQ(1)); /* 15.2.10.5.23 */ 2757 2954 mrb_define_method(mrb, s, "initialize_copy", mrb_str_replace, MRB_ARGS_REQ(1)); /* 15.2.10.5.24 */ … … 2766 2963 mrb_define_method(mrb, s, "split", mrb_str_split_m, MRB_ARGS_ANY()); /* 15.2.10.5.35 */ 2767 2964 2965 #ifndef MRB_WITHOUT_FLOAT 2768 2966 mrb_define_method(mrb, s, "to_f", mrb_str_to_f, MRB_ARGS_NONE()); /* 15.2.10.5.38 */ 2967 #endif 2769 2968 mrb_define_method(mrb, s, "to_i", mrb_str_to_i, MRB_ARGS_ANY()); /* 15.2.10.5.39 */ 2770 2969 mrb_define_method(mrb, s, "to_s", mrb_str_to_s, MRB_ARGS_NONE()); /* 15.2.10.5.40 */ … … 2775 2974 mrb_define_method(mrb, s, "inspect", mrb_str_inspect, MRB_ARGS_NONE()); /* 15.2.10.5.46(x) */ 2776 2975 mrb_define_method(mrb, s, "bytes", mrb_str_bytes, MRB_ARGS_NONE()); 2777 } 2778 2779 /* 2780 * Source code for the "strtod" library procedure. 2976 2977 mrb_define_method(mrb, s, "getbyte", mrb_str_getbyte, MRB_ARGS_REQ(1)); 2978 mrb_define_method(mrb, s, "setbyte", mrb_str_setbyte, MRB_ARGS_REQ(2)); 2979 mrb_define_method(mrb, s, "byteslice", mrb_str_byteslice, MRB_ARGS_ARG(1,1)); 2980 } 2981 2982 #ifndef MRB_WITHOUT_FLOAT 2983 /* 2984 * Source code for the "strtod" library procedure. 2781 2985 * 2782 2986 * Copyright (c) 1988-1993 The Regents of the University of California. … … 2804 3008 static const double powersOf10[] = {/* Table giving binary powers of 10. Entry */ 2805 3009 10., /* is 10^2^i. Used to convert decimal */ 2806 100., 3010 100., /* exponents into floating-point numbers. */ 2807 3011 1.0e4, 2808 3012 1.0e8, … … 2816 3020 MRB_API double 2817 3021 mrb_float_read(const char *string, char **endPtr) 2818 /* const char *string; 2819 2820 2821 2822 2823 2824 2825 2826 2827 2828 2829 2830 /* char **endPtr; 2831 3022 /* const char *string; A decimal ASCII floating-point number, 3023 * optionally preceded by white space. 3024 * Must have form "-I.FE-X", where I is the 3025 * integer part of the mantissa, F is the 3026 * fractional part of the mantissa, and X 3027 * is the exponent. Either of the signs 3028 * may be "+", "-", or omitted. Either I 3029 * or F may be omitted, or both. The decimal 3030 * point isn't necessary unless F is present. 3031 * The "E" may actually be an "e". E and X 3032 * may both be omitted (but not just one). 3033 */ 3034 /* char **endPtr; If non-NULL, store terminating character's 3035 * address here. */ 2832 3036 { 2833 3037 int sign, expSign = FALSE; 2834 3038 double fraction, dblExp; 2835 3039 const double *d; 2836 registerconst char *p;2837 registerint c;2838 int exp = 0; 2839 int fracExp = 0; 2840 2841 2842 2843 2844 2845 2846 2847 2848 int mantSize; 2849 int decPt; 2850 2851 const char *pExp; 2852 3040 const char *p; 3041 int c; 3042 int exp = 0; /* Exponent read from "EX" field. */ 3043 int fracExp = 0; /* Exponent that derives from the fractional 3044 * part. Under normal circumstatnces, it is 3045 * the negative of the number of digits in F. 3046 * However, if I is very long, the last digits 3047 * of I get dropped (otherwise a long I with a 3048 * large negative exponent could cause an 3049 * unnecessary overflow on I alone). In this 3050 * case, fracExp is incremented one for each 3051 * dropped digit. */ 3052 int mantSize; /* Number of digits in mantissa. */ 3053 int decPt; /* Number of mantissa digits BEFORE decimal 3054 * point. */ 3055 const char *pExp; /* Temporarily holds location of exponent 3056 * in string. */ 2853 3057 2854 3058 /* … … 2857 3061 2858 3062 p = string; 2859 while ( isspace(*p)) {2860 3063 while (ISSPACE(*p)) { 3064 p += 1; 2861 3065 } 2862 3066 if (*p == '-') { 2863 2864 3067 sign = TRUE; 3068 p += 1; 2865 3069 } 2866 3070 else { 2867 2868 2869 2870 3071 if (*p == '+') { 3072 p += 1; 3073 } 3074 sign = FALSE; 2871 3075 } 2872 3076 … … 2879 3083 for (mantSize = 0; ; mantSize += 1) 2880 3084 { 2881 2882 if (!isdigit(c)) {2883 2884 2885 2886 2887 2888 3085 c = *p; 3086 if (!ISDIGIT(c)) { 3087 if ((c != '.') || (decPt >= 0)) { 3088 break; 3089 } 3090 decPt = mantSize; 3091 } 3092 p += 1; 2889 3093 } 2890 3094 … … 2899 3103 p -= mantSize; 2900 3104 if (decPt < 0) { 2901 3105 decPt = mantSize; 2902 3106 } 2903 3107 else { 2904 mantSize -= 1;/* One of the digits was the point. */3108 mantSize -= 1; /* One of the digits was the point. */ 2905 3109 } 2906 3110 if (mantSize > 18) { 2907 2908 2909 2910 2911 2912 2913 3111 if (decPt - 18 > 29999) { 3112 fracExp = 29999; 3113 } 3114 else { 3115 fracExp = decPt - 18; 3116 } 3117 mantSize = 18; 2914 3118 } 2915 3119 else { 2916 3120 fracExp = decPt - mantSize; 2917 3121 } 2918 3122 if (mantSize == 0) { 2919 2920 2921 3123 fraction = 0.0; 3124 p = string; 3125 goto done; 2922 3126 } 2923 3127 else { 2924 2925 2926 2927 2928 2929 2930 2931 2932 2933 2934 2935 2936 2937 2938 2939 2940 2941 2942 2943 2944 2945 2946 2947 3128 int frac1, frac2; 3129 frac1 = 0; 3130 for ( ; mantSize > 9; mantSize -= 1) 3131 { 3132 c = *p; 3133 p += 1; 3134 if (c == '.') { 3135 c = *p; 3136 p += 1; 3137 } 3138 frac1 = 10*frac1 + (c - '0'); 3139 } 3140 frac2 = 0; 3141 for (; mantSize > 0; mantSize -= 1) 3142 { 3143 c = *p; 3144 p += 1; 3145 if (c == '.') { 3146 c = *p; 3147 p += 1; 3148 } 3149 frac2 = 10*frac2 + (c - '0'); 3150 } 3151 fraction = (1.0e9 * frac1) + frac2; 2948 3152 } 2949 3153 … … 2954 3158 p = pExp; 2955 3159 if ((*p == 'E') || (*p == 'e')) { 2956 2957 2958 2959 2960 2961 2962 2963 2964 2965 2966 2967 while (isdigit(*p)) {2968 2969 2970 2971 2972 2973 3160 p += 1; 3161 if (*p == '-') { 3162 expSign = TRUE; 3163 p += 1; 3164 } 3165 else { 3166 if (*p == '+') { 3167 p += 1; 3168 } 3169 expSign = FALSE; 3170 } 3171 while (ISDIGIT(*p)) { 3172 exp = exp * 10 + (*p - '0'); 3173 if (exp > 19999) { 3174 exp = 19999; 3175 } 3176 p += 1; 3177 } 2974 3178 } 2975 3179 if (expSign) { 2976 3180 exp = fracExp - exp; 2977 3181 } 2978 3182 else { 2979 3183 exp = fracExp + exp; 2980 3184 } 2981 3185 … … 2988 3192 2989 3193 if (exp < 0) { 2990 2991 3194 expSign = TRUE; 3195 exp = -exp; 2992 3196 } 2993 3197 else { 2994 3198 expSign = FALSE; 2995 3199 } 2996 3200 if (exp > maxExponent) { 2997 2998 3201 exp = maxExponent; 3202 errno = ERANGE; 2999 3203 } 3000 3204 dblExp = 1.0; 3001 3205 for (d = powersOf10; exp != 0; exp >>= 1, d += 1) { 3002 3003 3004 3206 if (exp & 01) { 3207 dblExp *= *d; 3208 } 3005 3209 } 3006 3210 if (expSign) { 3007 3211 fraction /= dblExp; 3008 3212 } 3009 3213 else { 3010 3214 fraction *= dblExp; 3011 3215 } 3012 3216 3013 3217 done: 3014 3218 if (endPtr != NULL) { 3015 3219 *endPtr = (char *) p; 3016 3220 } 3017 3221 3018 3222 if (sign) { 3019 3223 return -fraction; 3020 3224 } 3021 3225 return fraction; 3022 3226 } 3227 #endif -
EcnlProtoTool/trunk/mruby-2.1.1/src/symbol.c
r331 r439 16 16 typedef struct symbol_name { 17 17 mrb_bool lit : 1; 18 uint8_t prev; 18 19 uint16_t len; 19 20 const char *name; 20 21 } symbol_name; 21 22 22 static inline khint_t 23 sym_hash_func(mrb_state *mrb, mrb_sym s) 24 { 25 khint_t h = 0; 26 size_t i, len = mrb->symtbl[s].len; 27 const char *p = mrb->symtbl[s].name; 28 29 for (i=0; i<len; i++) { 30 h = (h << 5) - h + *p++; 31 } 32 return h; 33 } 34 #define sym_hash_equal(mrb,a, b) (mrb->symtbl[a].len == mrb->symtbl[b].len && memcmp(mrb->symtbl[a].name, mrb->symtbl[b].name, mrb->symtbl[a].len) == 0) 35 36 KHASH_DECLARE(n2s, mrb_sym, mrb_sym, FALSE) 37 KHASH_DEFINE (n2s, mrb_sym, mrb_sym, FALSE, sym_hash_func, sym_hash_equal) 38 /* ------------------------------------------------------ */ 23 #define SYMBOL_INLINE_BIT_POS 1 24 #define SYMBOL_INLINE_LOWER_BIT_POS 2 25 #define SYMBOL_INLINE (1 << (SYMBOL_INLINE_BIT_POS - 1)) 26 #define SYMBOL_INLINE_LOWER (1 << (SYMBOL_INLINE_LOWER_BIT_POS - 1)) 27 #define SYMBOL_NORMAL_SHIFT SYMBOL_INLINE_BIT_POS 28 #define SYMBOL_INLINE_SHIFT SYMBOL_INLINE_LOWER_BIT_POS 29 #ifdef MRB_ENABLE_ALL_SYMBOLS 30 # define SYMBOL_INLINE_P(sym) FALSE 31 # define SYMBOL_INLINE_LOWER_P(sym) FALSE 32 # define sym_inline_pack(name, len) 0 33 # define sym_inline_unpack(sym, buf, lenp) NULL 34 #else 35 # define SYMBOL_INLINE_P(sym) ((sym) & SYMBOL_INLINE) 36 # define SYMBOL_INLINE_LOWER_P(sym) ((sym) & SYMBOL_INLINE_LOWER) 37 #endif 39 38 40 39 static void … … 46 45 } 47 46 47 #ifndef MRB_ENABLE_ALL_SYMBOLS 48 static const char pack_table[] = "_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; 49 50 static mrb_sym 51 sym_inline_pack(const char *name, size_t len) 52 { 53 const size_t lower_length_max = (MRB_SYMBOL_BIT - 2) / 5; 54 const size_t mix_length_max = (MRB_SYMBOL_BIT - 2) / 6; 55 56 char c; 57 const char *p; 58 size_t i; 59 mrb_sym sym = 0; 60 mrb_bool lower = TRUE; 61 62 if (len > lower_length_max) return 0; /* too long */ 63 for (i=0; i<len; i++) { 64 uint32_t bits; 65 66 c = name[i]; 67 if (c == 0) return 0; /* NUL in name */ 68 p = strchr(pack_table, (int)c); 69 if (p == 0) return 0; /* non alnum char */ 70 bits = (uint32_t)(p - pack_table)+1; 71 if (bits > 27) lower = FALSE; 72 if (i >= mix_length_max) break; 73 sym |= bits<<(i*6+SYMBOL_INLINE_SHIFT); 74 } 75 if (lower) { 76 sym = 0; 77 for (i=0; i<len; i++) { 78 uint32_t bits; 79 80 c = name[i]; 81 p = strchr(pack_table, (int)c); 82 bits = (uint32_t)(p - pack_table)+1; 83 sym |= bits<<(i*5+SYMBOL_INLINE_SHIFT); 84 } 85 return sym | SYMBOL_INLINE | SYMBOL_INLINE_LOWER; 86 } 87 if (len > mix_length_max) return 0; 88 return sym | SYMBOL_INLINE; 89 } 90 91 static const char* 92 sym_inline_unpack(mrb_sym sym, char *buf, mrb_int *lenp) 93 { 94 int bit_per_char = SYMBOL_INLINE_LOWER_P(sym) ? 5 : 6; 95 int i; 96 97 mrb_assert(SYMBOL_INLINE_P(sym)); 98 99 for (i=0; i<30/bit_per_char; i++) { 100 uint32_t bits = sym>>(i*bit_per_char+SYMBOL_INLINE_SHIFT) & ((1<<bit_per_char)-1); 101 if (bits == 0) break; 102 buf[i] = pack_table[bits-1];; 103 } 104 buf[i] = '\0'; 105 if (lenp) *lenp = i; 106 return buf; 107 } 108 #endif 109 110 static uint8_t 111 symhash(const char *key, size_t len) 112 { 113 uint32_t hash, i; 114 115 for(hash = i = 0; i < len; ++i) { 116 hash += key[i]; 117 hash += (hash << 10); 118 hash ^= (hash >> 6); 119 } 120 hash += (hash << 3); 121 hash ^= (hash >> 11); 122 hash += (hash << 15); 123 return hash & 0xff; 124 } 125 126 static mrb_sym 127 find_symbol(mrb_state *mrb, const char *name, size_t len, uint8_t *hashp) 128 { 129 mrb_sym i; 130 symbol_name *sname; 131 uint8_t hash; 132 133 /* inline symbol */ 134 i = sym_inline_pack(name, len); 135 if (i > 0) return i; 136 137 hash = symhash(name, len); 138 if (hashp) *hashp = hash; 139 140 i = mrb->symhash[hash]; 141 if (i == 0) return 0; 142 do { 143 sname = &mrb->symtbl[i]; 144 if (sname->len == len && memcmp(sname->name, name, len) == 0) { 145 return i<<SYMBOL_NORMAL_SHIFT; 146 } 147 if (sname->prev == 0xff) { 148 i -= 0xff; 149 sname = &mrb->symtbl[i]; 150 while (mrb->symtbl < sname) { 151 if (sname->len == len && memcmp(sname->name, name, len) == 0) { 152 return (mrb_sym)(sname - mrb->symtbl)<<SYMBOL_NORMAL_SHIFT; 153 } 154 sname--; 155 } 156 return 0; 157 } 158 i -= sname->prev; 159 } while (sname->prev > 0); 160 return 0; 161 } 162 48 163 static mrb_sym 49 164 sym_intern(mrb_state *mrb, const char *name, size_t len, mrb_bool lit) 50 165 { 51 khash_t(n2s) *h = mrb->name2sym;52 symbol_name *sname = mrb->symtbl; /* symtbl[0] for working memory */53 khiter_t k;54 166 mrb_sym sym; 55 char *p; 167 symbol_name *sname; 168 uint8_t hash; 56 169 57 170 sym_validate_len(mrb, len); 58 if (sname) { 59 sname->lit = lit; 60 sname->len = (uint16_t)len; 61 sname->name = name; 62 k = kh_get(n2s, mrb, h, 0); 63 if (k != kh_end(h)) 64 return kh_key(h, k); 65 } 171 sym = find_symbol(mrb, name, len, &hash); 172 if (sym > 0) return sym; 66 173 67 174 /* registering a new symbol */ … … 69 176 if (mrb->symcapa < sym) { 70 177 if (mrb->symcapa == 0) mrb->symcapa = 100; 71 else mrb->symcapa = (size_t)(mrb->symcapa * 1.2);178 else mrb->symcapa = (size_t)(mrb->symcapa * 6 / 5); 72 179 mrb->symtbl = (symbol_name*)mrb_realloc(mrb, mrb->symtbl, sizeof(symbol_name)*(mrb->symcapa+1)); 73 180 } … … 79 186 } 80 187 else { 81 p = (char *)mrb_malloc(mrb, len+1);188 char *p = (char *)mrb_malloc(mrb, len+1); 82 189 memcpy(p, name, len); 83 190 p[len] = 0; … … 85 192 sname->lit = FALSE; 86 193 } 87 kh_put(n2s, mrb, h, sym); 88 89 return sym; 194 if (mrb->symhash[hash]) { 195 mrb_sym i = sym - mrb->symhash[hash]; 196 if (i > 0xff) 197 sname->prev = 0xff; 198 else 199 sname->prev = i; 200 } 201 else { 202 sname->prev = 0; 203 } 204 mrb->symhash[hash] = sym; 205 206 return sym<<SYMBOL_NORMAL_SHIFT; 90 207 } 91 208 … … 117 234 mrb_check_intern(mrb_state *mrb, const char *name, size_t len) 118 235 { 119 khash_t(n2s) *h = mrb->name2sym; 120 symbol_name *sname = mrb->symtbl; 121 khiter_t k; 236 mrb_sym sym; 122 237 123 238 sym_validate_len(mrb, len); 124 sname->len = (uint16_t)len; 125 sname->name = name; 126 127 k = kh_get(n2s, mrb, h, 0); 128 if (k != kh_end(h)) { 129 return mrb_symbol_value(kh_key(h, k)); 130 } 239 sym = find_symbol(mrb, name, len, NULL); 240 if (sym > 0) return mrb_symbol_value(sym); 131 241 return mrb_nil_value(); 132 242 } … … 135 245 mrb_check_intern_cstr(mrb_state *mrb, const char *name) 136 246 { 137 return mrb_check_intern(mrb, name, (mrb_int)strlen(name));247 return mrb_check_intern(mrb, name, strlen(name)); 138 248 } 139 249 … … 144 254 } 145 255 146 /* lenp must be a pointer to a size_t variable */ 147 MRB_API const char* 148 mrb_sym2name_len(mrb_state *mrb, mrb_sym sym, mrb_int *lenp) 149 { 256 static const char* 257 sym2name_len(mrb_state *mrb, mrb_sym sym, char *buf, mrb_int *lenp) 258 { 259 if (SYMBOL_INLINE_P(sym)) return sym_inline_unpack(sym, buf, lenp); 260 261 sym >>= SYMBOL_NORMAL_SHIFT; 150 262 if (sym == 0 || mrb->symidx < sym) { 151 263 if (lenp) *lenp = 0; … … 155 267 if (lenp) *lenp = mrb->symtbl[sym].len; 156 268 return mrb->symtbl[sym].name; 269 } 270 271 MRB_API const char* 272 mrb_sym_name_len(mrb_state *mrb, mrb_sym sym, mrb_int *lenp) 273 { 274 return sym2name_len(mrb, sym, mrb->symbuf, lenp); 157 275 } 158 276 … … 168 286 } 169 287 mrb_free(mrb, mrb->symtbl); 170 kh_destroy(n2s, mrb, mrb->name2sym);171 288 } 172 289 … … 174 291 mrb_init_symtbl(mrb_state *mrb) 175 292 { 176 mrb->name2sym = kh_init(n2s, mrb);177 293 } 178 294 … … 210 326 */ 211 327 212 213 /* 15.2.11.3.1 */214 /*215 * call-seq:216 * sym == obj -> true or false217 *218 * Equality---If <i>sym</i> and <i>obj</i> are exactly the same219 * symbol, returns <code>true</code>.220 */221 222 static mrb_value223 sym_equal(mrb_state *mrb, mrb_value sym1)224 {225 mrb_value sym2;226 227 mrb_get_args(mrb, "o", &sym2);228 229 return mrb_bool_value(mrb_obj_equal(mrb, sym1, sym2));230 }231 232 328 /* 15.2.11.3.2 */ 233 329 /* 15.2.11.3.3 */ … … 242 338 */ 243 339 static mrb_value 244 mrb_sym_to_s(mrb_state *mrb, mrb_value sym) 245 { 246 mrb_sym id = mrb_symbol(sym); 247 const char *p; 248 mrb_int len; 249 250 p = mrb_sym2name_len(mrb, id, &len); 251 return mrb_str_new_static(mrb, p, len); 340 sym_to_s(mrb_state *mrb, mrb_value sym) 341 { 342 return mrb_sym_str(mrb, mrb_symbol(sym)); 252 343 } 253 344 … … 388 479 case '!': case '?': case '=': ++m; 389 480 default: break; 390 }391 481 } 482 } 392 483 break; 393 484 } … … 404 495 char *sp; 405 496 406 name = mrb_sym 2name_len(mrb, id, &len);497 name = mrb_sym_name_len(mrb, id, &len); 407 498 str = mrb_str_new(mrb, 0, len+1); 408 499 sp = RSTRING_PTR(str); 409 RSTRING_PTR(str)[0] = ':';500 sp[0] = ':'; 410 501 memcpy(sp+1, name, len); 411 502 mrb_assert_int_fit(mrb_int, len, size_t, SIZE_MAX); 412 503 if (!symname_p(name) || strlen(name) != (size_t)len) { 413 str = mrb_str_ dump(mrb, str);504 str = mrb_str_inspect(mrb, str); 414 505 sp = RSTRING_PTR(str); 415 506 sp[0] = ':'; 416 507 sp[1] = '"'; 417 508 } 509 #ifdef MRB_UTF8_STRING 510 if (SYMBOL_INLINE_P(id)) RSTR_SET_ASCII_FLAG(mrb_str_ptr(str)); 511 #endif 418 512 return str; 419 513 } 420 514 421 515 MRB_API mrb_value 422 mrb_sym 2str(mrb_state *mrb, mrb_sym sym)516 mrb_sym_str(mrb_state *mrb, mrb_sym sym) 423 517 { 424 518 mrb_int len; 425 const char *name = mrb_sym 2name_len(mrb, sym, &len);519 const char *name = mrb_sym_name_len(mrb, sym, &len); 426 520 427 521 if (!name) return mrb_undef_value(); /* can't happen */ 522 if (SYMBOL_INLINE_P(sym)) { 523 mrb_value str = mrb_str_new(mrb, name, len); 524 RSTR_SET_ASCII_FLAG(mrb_str_ptr(str)); 525 return str; 526 } 428 527 return mrb_str_new_static(mrb, name, len); 429 528 } 430 529 530 static const char* 531 sym_name(mrb_state *mrb, mrb_sym sym, mrb_bool dump) 532 { 533 mrb_int len; 534 const char *name = mrb_sym_name_len(mrb, sym, &len); 535 536 if (!name) return NULL; 537 if (strlen(name) == (size_t)len && (!dump || symname_p(name))) { 538 return name; 539 } 540 else { 541 mrb_value str = SYMBOL_INLINE_P(sym) ? 542 mrb_str_new(mrb, name, len) : mrb_str_new_static(mrb, name, len); 543 str = mrb_str_dump(mrb, str); 544 return RSTRING_PTR(str); 545 } 546 } 547 431 548 MRB_API const char* 432 mrb_sym2name(mrb_state *mrb, mrb_sym sym) 433 { 434 mrb_int len; 435 const char *name = mrb_sym2name_len(mrb, sym, &len); 436 437 if (!name) return NULL; 438 if (symname_p(name) && strlen(name) == (size_t)len) { 439 return name; 440 } 441 else { 442 mrb_value str = mrb_str_dump(mrb, mrb_str_new_static(mrb, name, len)); 443 return RSTRING_PTR(str); 444 } 549 mrb_sym_name(mrb_state *mrb, mrb_sym sym) 550 { 551 return sym_name(mrb, sym, FALSE); 552 } 553 554 MRB_API const char* 555 mrb_sym_dump(mrb_state *mrb, mrb_sym sym) 556 { 557 return sym_name(mrb, sym, TRUE); 445 558 } 446 559 … … 454 567 455 568 mrb_get_args(mrb, "o", &s2); 456 if ( mrb_type(s2) != MRB_TT_SYMBOL) return mrb_nil_value();569 if (!mrb_symbol_p(s2)) return mrb_nil_value(); 457 570 sym1 = mrb_symbol(s1); 458 571 sym2 = mrb_symbol(s2); … … 462 575 int retval; 463 576 mrb_int len, len1, len2; 464 465 p1 = mrb_sym2name_len(mrb, sym1, &len1); 466 p2 = mrb_sym2name_len(mrb, sym2, &len2); 577 char buf1[8], buf2[8]; 578 579 p1 = sym2name_len(mrb, sym1, buf1, &len1); 580 p2 = sym2name_len(mrb, sym2, buf2, &len2); 467 581 len = lesser(len1, len2); 468 582 retval = memcmp(p1, p2, len); … … 482 596 struct RClass *sym; 483 597 484 mrb->symbol_class = sym = mrb_define_class(mrb, "Symbol", mrb->object_class); 598 mrb->symbol_class = sym = mrb_define_class(mrb, "Symbol", mrb->object_class); /* 15.2.11 */ 485 599 MRB_SET_INSTANCE_TT(sym, MRB_TT_SYMBOL); 486 600 mrb_undef_class_method(mrb, sym, "new"); 487 601 488 mrb_define_method(mrb, sym, "===", sym_equal, MRB_ARGS_REQ(1)); /* 15.2.11.3.1 */ 489 mrb_define_method(mrb, sym, "id2name", mrb_sym_to_s, MRB_ARGS_NONE()); /* 15.2.11.3.2 */ 490 mrb_define_method(mrb, sym, "to_s", mrb_sym_to_s, MRB_ARGS_NONE()); /* 15.2.11.3.3 */ 491 mrb_define_method(mrb, sym, "to_sym", sym_to_sym, MRB_ARGS_NONE()); /* 15.2.11.3.4 */ 492 mrb_define_method(mrb, sym, "inspect", sym_inspect, MRB_ARGS_NONE()); /* 15.2.11.3.5(x) */ 493 mrb_define_method(mrb, sym, "<=>", sym_cmp, MRB_ARGS_REQ(1)); 494 } 602 mrb_define_method(mrb, sym, "id2name", sym_to_s, MRB_ARGS_NONE()); /* 15.2.11.3.2 */ 603 mrb_define_method(mrb, sym, "to_s", sym_to_s, MRB_ARGS_NONE()); /* 15.2.11.3.3 */ 604 mrb_define_method(mrb, sym, "to_sym", sym_to_sym, MRB_ARGS_NONE()); /* 15.2.11.3.4 */ 605 mrb_define_method(mrb, sym, "inspect", sym_inspect, MRB_ARGS_NONE()); /* 15.2.11.3.5(x) */ 606 mrb_define_method(mrb, sym, "<=>", sym_cmp, MRB_ARGS_REQ(1)); 607 } -
EcnlProtoTool/trunk/mruby-2.1.1/src/variable.c
r331 r439 10 10 #include <mruby/proc.h> 11 11 #include <mruby/string.h> 12 13 typedef int (iv_foreach_func)(mrb_state*,mrb_sym,mrb_value,void*); 14 15 #ifdef MRB_USE_IV_SEGLIST 16 17 #ifndef MRB_SEGMENT_SIZE 18 #define MRB_SEGMENT_SIZE 4 12 #include <mruby/variable.h> 13 14 #ifndef MRB_IV_SEGMENT_SIZE 15 #define MRB_IV_SEGMENT_SIZE 4 19 16 #endif 20 17 21 18 typedef struct segment { 22 mrb_sym key[MRB_ SEGMENT_SIZE];23 mrb_value val[MRB_ SEGMENT_SIZE];19 mrb_sym key[MRB_IV_SEGMENT_SIZE]; 20 mrb_value val[MRB_IV_SEGMENT_SIZE]; 24 21 struct segment *next; 25 22 } segment; … … 32 29 } iv_tbl; 33 30 34 /* 35 * Creates the instance variable table. 36 * 37 * Parameters 38 * mrb 39 * Returns 40 * the instance variable table. 41 */ 31 /* Creates the instance variable table. */ 42 32 static iv_tbl* 43 33 iv_new(mrb_state *mrb) … … 53 43 } 54 44 55 /* 56 * Set the value for the symbol in the instance variable table. 57 * 58 * Parameters 59 * mrb 60 * t the instance variable table to be set in. 61 * sym the symbol to be used as the key. 62 * val the value to be set. 63 */ 45 /* Set the value for the symbol in the instance variable table. */ 64 46 static void 65 47 iv_put(mrb_state *mrb, iv_tbl *t, mrb_sym sym, mrb_value val) 66 48 { 67 segment *seg = t->rootseg;49 segment *seg; 68 50 segment *prev = NULL; 69 51 segment *matched_seg = NULL; … … 71 53 size_t i; 72 54 55 if (t == NULL) return; 56 seg = t->rootseg; 73 57 while (seg) { 74 for (i=0; i<MRB_ SEGMENT_SIZE; i++) {58 for (i=0; i<MRB_IV_SEGMENT_SIZE; i++) { 75 59 mrb_sym key = seg->key[i]; 76 60 /* Found room in last segment after last_len */ … … 96 80 97 81 /* Not found */ 98 t->size++;99 82 if (matched_seg) { 100 83 matched_seg->key[matched_idx] = sym; 101 84 matched_seg->val[matched_idx] = val; 85 t->size++; 102 86 return; 103 87 } 104 88 105 89 seg = (segment*)mrb_malloc(mrb, sizeof(segment)); 106 if (!seg) return;107 90 seg->next = NULL; 108 91 seg->key[0] = sym; 109 92 seg->val[0] = val; 110 93 t->last_len = 1; 94 t->size++; 111 95 if (prev) { 112 96 prev->next = seg; … … 117 101 } 118 102 119 /* 120 * Get a value for a symbol from the instance variable table. 121 * 122 * Parameters 123 * mrb 124 * t the variable table to be searched. 125 * sym the symbol to be used as the key. 126 * vp the value pointer. Receives the value if the specified symbol is 127 * contained in the instance variable table. 128 * Returns 129 * true if the specified symbol is contained in the instance variable table. 130 */ 103 /* Get a value for a symbol from the instance variable table. */ 131 104 static mrb_bool 132 105 iv_get(mrb_state *mrb, iv_tbl *t, mrb_sym sym, mrb_value *vp) … … 135 108 size_t i; 136 109 110 if (t == NULL) return FALSE; 137 111 seg = t->rootseg; 138 112 while (seg) { 139 for (i=0; i<MRB_ SEGMENT_SIZE; i++) {113 for (i=0; i<MRB_IV_SEGMENT_SIZE; i++) { 140 114 mrb_sym key = seg->key[i]; 141 115 … … 153 127 } 154 128 155 /* 156 * Deletes the value for the symbol from the instance variable table. 157 * 158 * Parameters 159 * t the variable table to be searched. 160 * sym the symbol to be used as the key. 161 * vp the value pointer. Receive the deleted value if the symbol is 162 * contained in the instance variable table. 163 * Returns 164 * true if the specified symbol is contained in the instance variable table. 165 */ 129 /* Deletes the value for the symbol from the instance variable table. */ 166 130 static mrb_bool 167 131 iv_del(mrb_state *mrb, iv_tbl *t, mrb_sym sym, mrb_value *vp) … … 170 134 size_t i; 171 135 136 if (t == NULL) return FALSE; 172 137 seg = t->rootseg; 173 138 while (seg) { 174 for (i=0; i<MRB_ SEGMENT_SIZE; i++) {139 for (i=0; i<MRB_IV_SEGMENT_SIZE; i++) { 175 140 mrb_sym key = seg->key[i]; 176 141 … … 190 155 } 191 156 192 static mrb_bool 193 iv_foreach(mrb_state *mrb, iv_tbl *t, iv_foreach_func *func, void *p) 157 /* Iterates over the instance variable table. */ 158 static void 159 iv_foreach(mrb_state *mrb, iv_tbl *t, mrb_iv_foreach_func *func, void *p) 194 160 { 195 161 segment *seg; 196 162 size_t i; 197 int n; 198 163 164 if (t == NULL) return; 199 165 seg = t->rootseg; 200 166 while (seg) { 201 for (i=0; i<MRB_ SEGMENT_SIZE; i++) {167 for (i=0; i<MRB_IV_SEGMENT_SIZE; i++) { 202 168 mrb_sym key = seg->key[i]; 203 169 204 170 /* no value in last segment after last_len */ 205 171 if (!seg->next && i >= t->last_len) { 206 return FALSE;172 return; 207 173 } 208 174 if (key != 0) { 209 n =(*func)(mrb, key, seg->val[i], p); 210 if (n > 0) return FALSE; 211 if (n < 0) { 212 t->size--; 213 seg->key[i] = 0; 175 if ((*func)(mrb, key, seg->val[i], p) != 0) { 176 return; 214 177 } 215 178 } … … 217 180 seg = seg->next; 218 181 } 219 return TRUE; 220 } 221 182 return; 183 } 184 185 /* Get the size of the instance variable table. */ 222 186 static size_t 223 187 iv_size(mrb_state *mrb, iv_tbl *t) … … 226 190 size_t size = 0; 227 191 228 if ( !t) return 0;192 if (t == NULL) return 0; 229 193 if (t->size > 0) return t->size; 230 194 seg = t->rootseg; … … 235 199 } 236 200 seg = seg->next; 237 size += MRB_ SEGMENT_SIZE;201 size += MRB_IV_SEGMENT_SIZE; 238 202 } 239 203 /* empty iv_tbl */ … … 241 205 } 242 206 207 /* Copy the instance variable table. */ 243 208 static iv_tbl* 244 209 iv_copy(mrb_state *mrb, iv_tbl *t) … … 253 218 254 219 while (seg != NULL) { 255 for (i=0; i<MRB_ SEGMENT_SIZE; i++) {220 for (i=0; i<MRB_IV_SEGMENT_SIZE; i++) { 256 221 mrb_sym key = seg->key[i]; 257 222 mrb_value val = seg->val[i]; … … 267 232 } 268 233 234 /* Free memory of the instance variable table. */ 269 235 static void 270 236 iv_free(mrb_state *mrb, iv_tbl *t) … … 281 247 } 282 248 283 #else284 285 #include <mruby/khash.h>286 287 #ifndef MRB_IVHASH_INIT_SIZE288 #define MRB_IVHASH_INIT_SIZE 8289 #endif290 291 KHASH_DECLARE(iv, mrb_sym, mrb_value, TRUE)292 KHASH_DEFINE(iv, mrb_sym, mrb_value, TRUE, kh_int_hash_func, kh_int_hash_equal)293 294 typedef struct iv_tbl {295 khash_t(iv) h;296 } iv_tbl;297 298 static iv_tbl*299 iv_new(mrb_state *mrb)300 {301 return (iv_tbl*)kh_init_size(iv, mrb, MRB_IVHASH_INIT_SIZE);302 }303 304 static void305 iv_put(mrb_state *mrb, iv_tbl *t, mrb_sym sym, mrb_value val)306 {307 khash_t(iv) *h = &t->h;308 khiter_t k;309 310 k = kh_put(iv, mrb, h, sym);311 kh_value(h, k) = val;312 }313 314 static mrb_bool315 iv_get(mrb_state *mrb, iv_tbl *t, mrb_sym sym, mrb_value *vp)316 {317 khash_t(iv) *h = &t->h;318 khiter_t k;319 320 k = kh_get(iv, mrb, h, sym);321 if (k != kh_end(h)) {322 if (vp) *vp = kh_value(h, k);323 return TRUE;324 }325 return FALSE;326 }327 328 static mrb_bool329 iv_del(mrb_state *mrb, iv_tbl *t, mrb_sym sym, mrb_value *vp)330 {331 khash_t(iv) *h = &t->h;332 khiter_t k;333 334 if (h) {335 k = kh_get(iv, mrb, h, sym);336 if (k != kh_end(h)) {337 mrb_value val = kh_value(h, k);338 kh_del(iv, mrb, h, k);339 if (vp) *vp = val;340 return TRUE;341 }342 }343 return FALSE;344 }345 346 static mrb_bool347 iv_foreach(mrb_state *mrb, iv_tbl *t, iv_foreach_func *func, void *p)348 {349 khash_t(iv) *h = &t->h;350 khiter_t k;351 int n;352 353 if (h) {354 for (k = kh_begin(h); k != kh_end(h); k++) {355 if (kh_exist(h, k)) {356 n = (*func)(mrb, kh_key(h, k), kh_value(h, k), p);357 if (n > 0) return FALSE;358 if (n < 0) {359 kh_del(iv, mrb, h, k);360 }361 }362 }363 }364 return TRUE;365 }366 367 static size_t368 iv_size(mrb_state *mrb, iv_tbl *t)369 {370 khash_t(iv) *h;371 372 if (t && (h = &t->h)) {373 return kh_size(h);374 }375 return 0;376 }377 378 static iv_tbl*379 iv_copy(mrb_state *mrb, iv_tbl *t)380 {381 return (iv_tbl*)kh_copy(iv, mrb, &t->h);382 }383 384 static void385 iv_free(mrb_state *mrb, iv_tbl *t)386 {387 kh_destroy(iv, mrb, &t->h);388 }389 390 #endif391 392 249 static int 393 250 iv_mark_i(mrb_state *mrb, mrb_sym sym, mrb_value v, void *p) … … 400 257 mark_tbl(mrb_state *mrb, iv_tbl *t) 401 258 { 402 if (t) { 403 iv_foreach(mrb, t, iv_mark_i, 0); 404 } 259 iv_foreach(mrb, t, iv_mark_i, 0); 405 260 } 406 261 … … 485 340 } 486 341 342 static inline void assign_class_name(mrb_state *mrb, struct RObject *obj, mrb_sym sym, mrb_value v); 343 344 void 345 mrb_obj_iv_set_force(mrb_state *mrb, struct RObject *obj, mrb_sym sym, mrb_value v) 346 { 347 assign_class_name(mrb, obj, sym, v); 348 if (!obj->iv) { 349 obj->iv = iv_new(mrb); 350 } 351 iv_put(mrb, obj->iv, sym, v); 352 mrb_write_barrier(mrb, (struct RBasic*)obj); 353 } 354 487 355 MRB_API void 488 356 mrb_obj_iv_set(mrb_state *mrb, struct RObject *obj, mrb_sym sym, mrb_value v) 489 357 { 490 iv_tbl *t = obj->iv; 491 492 if (MRB_FROZEN_P(obj)) { 493 mrb_raisef(mrb, E_RUNTIME_ERROR, "can't modify frozen %S", mrb_obj_value(obj)); 494 } 495 if (!t) { 496 t = obj->iv = iv_new(mrb); 497 } 498 mrb_write_barrier(mrb, (struct RBasic*)obj); 499 iv_put(mrb, t, sym, v); 500 } 501 502 MRB_API void 503 mrb_obj_iv_ifnone(mrb_state *mrb, struct RObject *obj, mrb_sym sym, mrb_value v) 504 { 505 iv_tbl *t = obj->iv; 506 507 if (!t) { 508 t = obj->iv = iv_new(mrb); 509 } 510 else if (iv_get(mrb, t, sym, &v)) { 511 return; 512 } 513 mrb_write_barrier(mrb, (struct RBasic*)obj); 514 iv_put(mrb, t, sym, v); 358 mrb_check_frozen(mrb, obj); 359 mrb_obj_iv_set_force(mrb, obj, sym, v); 360 } 361 362 /* Iterates over the instance variable table. */ 363 MRB_API void 364 mrb_iv_foreach(mrb_state *mrb, mrb_value obj, mrb_iv_foreach_func *func, void *p) 365 { 366 if (!obj_iv_p(obj)) return; 367 iv_foreach(mrb, mrb_obj_ptr(obj)->iv, func, p); 368 } 369 370 static inline mrb_bool 371 namespace_p(enum mrb_vtype tt) 372 { 373 return tt == MRB_TT_CLASS || tt == MRB_TT_MODULE ? TRUE : FALSE; 374 } 375 376 static inline void 377 assign_class_name(mrb_state *mrb, struct RObject *obj, mrb_sym sym, mrb_value v) 378 { 379 if (namespace_p(obj->tt) && namespace_p(mrb_type(v))) { 380 struct RObject *c = mrb_obj_ptr(v); 381 if (obj != c && ISUPPER(mrb_sym_name_len(mrb, sym, NULL)[0])) { 382 mrb_sym id_classname = mrb_intern_lit(mrb, "__classname__"); 383 mrb_value o = mrb_obj_iv_get(mrb, c, id_classname); 384 385 if (mrb_nil_p(o)) { 386 mrb_sym id_outer = mrb_intern_lit(mrb, "__outer__"); 387 o = mrb_obj_iv_get(mrb, c, id_outer); 388 389 if (mrb_nil_p(o)) { 390 if ((struct RClass *)obj == mrb->object_class) { 391 mrb_obj_iv_set_force(mrb, c, id_classname, mrb_symbol_value(sym)); 392 } 393 else { 394 mrb_obj_iv_set_force(mrb, c, id_outer, mrb_obj_value(obj)); 395 } 396 } 397 } 398 } 399 } 515 400 } 516 401 … … 545 430 } 546 431 547 #define identchar(c) (ISALNUM(c) || (c) == '_' || !ISASCII(c))548 549 432 MRB_API mrb_bool 550 mrb_iv_ p(mrb_state *mrb, mrb_sym iv_name)433 mrb_iv_name_sym_p(mrb_state *mrb, mrb_sym iv_name) 551 434 { 552 435 const char *s; 553 mrb_int i,len;554 555 s = mrb_sym 2name_len(mrb, iv_name, &len);436 mrb_int len; 437 438 s = mrb_sym_name_len(mrb, iv_name, &len); 556 439 if (len < 2) return FALSE; 557 440 if (s[0] != '@') return FALSE; 558 if (s[1] == '@') return FALSE; 559 for (i=1; i<len; i++) { 560 if (!identchar(s[i])) return FALSE; 561 } 562 return TRUE; 563 } 564 565 MRB_API void 566 mrb_iv_check(mrb_state *mrb, mrb_sym iv_name) 567 { 568 if (!mrb_iv_p(mrb, iv_name)) { 569 mrb_name_error(mrb, iv_name, "'%S' is not allowed as an instance variable name", mrb_sym2str(mrb, iv_name)); 441 if (ISDIGIT(s[1])) return FALSE; 442 return mrb_ident_p(s+1, len-1); 443 } 444 445 MRB_API void 446 mrb_iv_name_sym_check(mrb_state *mrb, mrb_sym iv_name) 447 { 448 if (!mrb_iv_name_sym_p(mrb, iv_name)) { 449 mrb_name_error(mrb, iv_name, "'%n' is not allowed as an instance variable name", iv_name); 570 450 } 571 451 } … … 604 484 mrb_str_cat_lit(mrb, str, ", "); 605 485 } 606 s = mrb_sym 2name_len(mrb, sym, &len);486 s = mrb_sym_name_len(mrb, sym, &len); 607 487 mrb_str_cat(mrb, str, s, len); 608 488 mrb_str_cat_lit(mrb, str, "="); 609 if (mrb_ type(v) == MRB_TT_OBJECT) {489 if (mrb_object_p(v)) { 610 490 ins = mrb_any_to_s(mrb, v); 611 491 } … … 625 505 if (len > 0) { 626 506 const char *cn = mrb_obj_classname(mrb, mrb_obj_value(obj)); 627 mrb_value str = mrb_str_ buf_new(mrb, 30);507 mrb_value str = mrb_str_new_capa(mrb, 30); 628 508 629 509 mrb_str_cat_lit(mrb, str, "-<"); 630 510 mrb_str_cat_cstr(mrb, str, cn); 631 511 mrb_str_cat_lit(mrb, str, ":"); 632 mrb_str_c oncat(mrb, str, mrb_ptr_to_str(mrb, obj));512 mrb_str_cat_str(mrb, str, mrb_ptr_to_str(mrb, obj)); 633 513 634 514 iv_foreach(mrb, t, inspect_i, &str); … … 646 526 mrb_value val; 647 527 648 if (t && iv_del(mrb, t, sym, &val)) { 528 mrb_check_frozen(mrb, mrb_obj_ptr(obj)); 529 if (iv_del(mrb, t, sym, &val)) { 649 530 return val; 650 531 } 651 532 } 652 533 return mrb_undef_value(); 653 }654 655 mrb_value656 mrb_vm_iv_get(mrb_state *mrb, mrb_sym sym)657 {658 /* get self */659 return mrb_iv_get(mrb, mrb->c->stack[0], sym);660 }661 662 void663 mrb_vm_iv_set(mrb_state *mrb, mrb_sym sym, mrb_value v)664 {665 /* get self */666 mrb_iv_set(mrb, mrb->c->stack[0], sym, v);667 534 } 668 535 … … 675 542 676 543 ary = *(mrb_value*)p; 677 s = mrb_sym 2name_len(mrb, sym, &len);544 s = mrb_sym_name_len(mrb, sym, &len); 678 545 if (len > 1 && s[0] == '@' && s[1] != '@') { 679 546 mrb_ary_push(mrb, ary, mrb_symbol_value(sym)); … … 705 572 706 573 ary = mrb_ary_new(mrb); 707 if (obj_iv_p(self) && mrb_obj_ptr(self)->iv) {574 if (obj_iv_p(self)) { 708 575 iv_foreach(mrb, mrb_obj_ptr(self)->iv, iv_i, &ary); 709 576 } … … 719 586 720 587 ary = *(mrb_value*)p; 721 s = mrb_sym 2name_len(mrb, sym, &len);588 s = mrb_sym_name_len(mrb, sym, &len); 722 589 if (len > 2 && s[0] == '@' && s[1] == '@') { 723 590 mrb_ary_push(mrb, ary, mrb_symbol_value(sym)); … … 729 596 /* 730 597 * call-seq: 731 * mod.class_variables -> array598 * mod.class_variables(inherit=true) -> array 732 599 * 733 600 * Returns an array of the names of class variables in <i>mod</i>. … … 747 614 mrb_value ary; 748 615 struct RClass *c; 749 616 mrb_bool inherit = TRUE; 617 618 mrb_get_args(mrb, "|b", &inherit); 750 619 ary = mrb_ary_new(mrb); 751 620 c = mrb_class_ptr(mod); 752 621 while (c) { 753 if (c->iv) { 754 iv_foreach(mrb, c->iv, cv_i, &ary); 755 } 622 iv_foreach(mrb, c->iv, cv_i, &ary); 623 if (!inherit) break; 756 624 c = c->super; 757 625 } … … 759 627 } 760 628 761 MRB_APImrb_value629 mrb_value 762 630 mrb_mod_cv_get(mrb_state *mrb, struct RClass *c, mrb_sym sym) 763 631 { … … 790 658 } 791 659 } 792 mrb_name_error(mrb, sym, "uninitialized class variable %S in %S", 793 mrb_sym2str(mrb, sym), mrb_obj_value(cls)); 660 mrb_name_error(mrb, sym, "uninitialized class variable %n in %C", sym, cls); 794 661 /* not reached */ 795 662 return mrb_nil_value(); … … 808 675 809 676 while (c) { 810 if (c->iv) { 811 iv_tbl *t = c->iv; 812 813 if (iv_get(mrb, t, sym, NULL)) { 814 mrb_write_barrier(mrb, (struct RBasic*)c); 815 iv_put(mrb, t, sym, v); 816 return; 817 } 677 iv_tbl *t = c->iv; 678 679 if (iv_get(mrb, t, sym, NULL)) { 680 mrb_check_frozen(mrb, c); 681 iv_put(mrb, t, sym, v); 682 mrb_write_barrier(mrb, (struct RBasic*)c); 683 return; 818 684 } 819 685 c = c->super; … … 840 706 } 841 707 708 mrb_check_frozen(mrb, c); 842 709 if (!c->iv) { 843 710 c->iv = iv_new(mrb); 844 711 } 845 712 713 iv_put(mrb, c->iv, sym, v); 846 714 mrb_write_barrier(mrb, (struct RBasic*)c); 847 iv_put(mrb, c->iv, sym, v);848 715 } 849 716 … … 854 721 } 855 722 856 MRB_APImrb_bool723 mrb_bool 857 724 mrb_mod_cv_defined(mrb_state *mrb, struct RClass * c, mrb_sym sym) 858 725 { 859 726 while (c) { 860 if (c->iv) { 861 iv_tbl *t = c->iv; 862 if (iv_get(mrb, t, sym, NULL)) return TRUE; 863 } 727 iv_tbl *t = c->iv; 728 if (iv_get(mrb, t, sym, NULL)) return TRUE; 864 729 c = c->super; 865 730 } … … 877 742 mrb_vm_cv_get(mrb_state *mrb, mrb_sym sym) 878 743 { 879 struct RClass *c = mrb->c->ci->proc->target_class; 880 881 if (!c) c = mrb->c->ci->target_class; 882 744 struct RClass *c; 745 746 struct RProc *p = mrb->c->ci->proc; 747 748 for (;;) { 749 c = MRB_PROC_TARGET_CLASS(p); 750 if (c->tt != MRB_TT_SCLASS) break; 751 p = p->upper; 752 } 883 753 return mrb_mod_cv_get(mrb, c, sym); 884 754 } … … 887 757 mrb_vm_cv_set(mrb_state *mrb, mrb_sym sym, mrb_value v) 888 758 { 889 struct RClass *c = mrb->c->ci->proc->target_class; 890 891 if (!c) c = mrb->c->ci->target_class; 759 struct RClass *c; 760 struct RProc *p = mrb->c->ci->proc; 761 762 for (;;) { 763 c = MRB_PROC_TARGET_CLASS(p); 764 if (c->tt != MRB_TT_SCLASS) break; 765 p = p->upper; 766 } 892 767 mrb_mod_cv_set(mrb, c, sym, v); 893 768 } … … 912 787 struct RClass *c = base; 913 788 mrb_value v; 914 iv_tbl *t;915 789 mrb_bool retry = FALSE; 916 790 mrb_value name; … … 919 793 while (c) { 920 794 if (c->iv) { 921 t = c->iv; 922 if (iv_get(mrb, t, sym, &v)) 795 if (iv_get(mrb, c->iv, sym, &v)) 923 796 return v; 924 797 } 925 798 c = c->super; 926 799 } 927 if (!retry && base && base->tt == MRB_TT_MODULE) {800 if (!retry && base->tt == MRB_TT_MODULE) { 928 801 c = mrb->object_class; 929 802 retry = TRUE; … … 944 817 mrb_vm_const_get(mrb_state *mrb, mrb_sym sym) 945 818 { 946 struct RClass *c = mrb->c->ci->proc->target_class; 947 948 if (!c) c = mrb->c->ci->target_class; 949 if (c) { 950 struct RClass *c2; 951 mrb_value v; 952 953 if (c->iv && iv_get(mrb, c->iv, sym, &v)) { 819 struct RClass *c; 820 struct RClass *c2; 821 mrb_value v; 822 struct RProc *proc; 823 824 c = MRB_PROC_TARGET_CLASS(mrb->c->ci->proc); 825 if (iv_get(mrb, c->iv, sym, &v)) { 826 return v; 827 } 828 c2 = c; 829 while (c2 && c2->tt == MRB_TT_SCLASS) { 830 mrb_value klass; 831 832 if (!iv_get(mrb, c2->iv, mrb_intern_lit(mrb, "__attached__"), &klass)) { 833 c2 = NULL; 834 break; 835 } 836 c2 = mrb_class_ptr(klass); 837 } 838 if (c2 && (c2->tt == MRB_TT_CLASS || c2->tt == MRB_TT_MODULE)) c = c2; 839 mrb_assert(!MRB_PROC_CFUNC_P(mrb->c->ci->proc)); 840 proc = mrb->c->ci->proc; 841 while (proc) { 842 c2 = MRB_PROC_TARGET_CLASS(proc); 843 if (c2 && iv_get(mrb, c2->iv, sym, &v)) { 954 844 return v; 955 845 } 956 c2 = c; 957 while (c2 && c2->tt == MRB_TT_SCLASS) { 958 mrb_value klass; 959 klass = mrb_obj_iv_get(mrb, (struct RObject *)c2, 960 mrb_intern_lit(mrb, "__attached__")); 961 c2 = mrb_class_ptr(klass); 962 } 963 if (c2->tt == MRB_TT_CLASS || c2->tt == MRB_TT_MODULE) c = c2; 964 c2 = c; 965 for (;;) { 966 c2 = mrb_class_outer_module(mrb, c2); 967 if (!c2) break; 968 if (c2->iv && iv_get(mrb, c2->iv, sym, &v)) { 969 return v; 970 } 971 } 846 proc = proc->upper; 972 847 } 973 848 return const_get(mrb, c, sym); … … 978 853 { 979 854 mod_const_check(mrb, mod); 855 if (mrb_type(v) == MRB_TT_CLASS || mrb_type(v) == MRB_TT_MODULE) { 856 mrb_class_name_class(mrb, mrb_class_ptr(mod), mrb_class_ptr(v), sym); 857 } 980 858 mrb_iv_set(mrb, mod, sym, v); 981 859 } … … 984 862 mrb_vm_const_set(mrb_state *mrb, mrb_sym sym, mrb_value v) 985 863 { 986 struct RClass *c = mrb->c->ci->proc->target_class;987 988 if (!c) c = mrb->c->ci->target_class;864 struct RClass *c; 865 866 c = MRB_PROC_TARGET_CLASS(mrb->c->ci->proc); 989 867 mrb_obj_iv_set(mrb, (struct RObject*)c, sym, v); 990 868 } … … 1017 895 1018 896 ary = *(mrb_value*)p; 1019 s = mrb_sym 2name_len(mrb, sym, &len);897 s = mrb_sym_name_len(mrb, sym, &len); 1020 898 if (len >= 1 && ISUPPER(s[0])) { 1021 mrb_ary_push(mrb, ary, mrb_symbol_value(sym)); 899 mrb_int i, alen = RARRAY_LEN(ary); 900 901 for (i=0; i<alen; i++) { 902 if (mrb_symbol(RARRAY_PTR(ary)[i]) == sym) 903 break; 904 } 905 if (i==alen) { 906 mrb_ary_push(mrb, ary, mrb_symbol_value(sym)); 907 } 1022 908 } 1023 909 return 0; … … 1041 927 ary = mrb_ary_new(mrb); 1042 928 while (c) { 1043 if (c->iv) { 1044 iv_foreach(mrb, c->iv, const_i, &ary); 1045 } 929 iv_foreach(mrb, c->iv, const_i, &ary); 1046 930 if (!inherit) break; 1047 931 c = c->super; … … 1056 940 mrb_value v; 1057 941 1058 if (!mrb->globals) {1059 return mrb_nil_value();1060 }1061 942 if (iv_get(mrb, mrb->globals, sym, &v)) 1062 943 return v; … … 1070 951 1071 952 if (!mrb->globals) { 1072 t = mrb->globals = iv_new(mrb); 1073 } 1074 else { 1075 t = mrb->globals; 1076 } 953 mrb->globals = iv_new(mrb); 954 } 955 t = mrb->globals; 1077 956 iv_put(mrb, t, sym, v); 1078 957 } … … 1081 960 mrb_gv_remove(mrb_state *mrb, mrb_sym sym) 1082 961 { 1083 if (!mrb->globals) {1084 return;1085 }1086 962 iv_del(mrb, mrb->globals, sym, NULL); 1087 963 } … … 1112 988 iv_tbl *t = mrb->globals; 1113 989 mrb_value ary = mrb_ary_new(mrb); 1114 size_t i; 1115 char buf[3]; 1116 1117 if (t) { 1118 iv_foreach(mrb, t, gv_i, &ary); 1119 } 1120 buf[0] = '$'; 1121 buf[2] = 0; 1122 for (i = 1; i <= 9; ++i) { 1123 buf[1] = (char)(i + '0'); 1124 mrb_ary_push(mrb, ary, mrb_symbol_value(mrb_intern(mrb, buf, 2))); 1125 } 990 991 iv_foreach(mrb, t, gv_i, &ary); 1126 992 return ary; 1127 993 } … … 1132 998 struct RClass *klass = mrb_class_ptr(mod); 1133 999 struct RClass *tmp; 1134 mrb_bool mod_retry = 0;1000 mrb_bool mod_retry = FALSE; 1135 1001 1136 1002 tmp = klass; 1137 1003 retry: 1138 1004 while (tmp) { 1139 if ( tmp->iv &&iv_get(mrb, tmp->iv, id, NULL)) {1005 if (iv_get(mrb, tmp->iv, id, NULL)) { 1140 1006 return TRUE; 1141 1007 } … … 1144 1010 } 1145 1011 if (!exclude && !mod_retry && (klass->tt == MRB_TT_MODULE)) { 1146 mod_retry = 1;1012 mod_retry = TRUE; 1147 1013 tmp = mrb->object_class; 1148 1014 goto retry; … … 1187 1053 } 1188 1054 1189 mrb_sym 1190 mrb_class_sym(mrb_state *mrb, struct RClass *c, struct RClass *outer) 1191 { 1192 mrb_value name; 1193 1194 name = mrb_obj_iv_get(mrb, (struct RObject*)c, mrb_intern_lit(mrb, "__classid__")); 1195 if (mrb_nil_p(name)) { 1196 1197 if (!outer) return 0; 1198 else { 1199 struct csym_arg arg; 1200 1201 arg.c = c; 1202 arg.sym = 0; 1203 iv_foreach(mrb, outer->iv, csym_i, &arg); 1204 return arg.sym; 1205 } 1206 } 1207 return mrb_symbol(name); 1208 } 1055 static mrb_sym 1056 find_class_sym(mrb_state *mrb, struct RClass *outer, struct RClass *c) 1057 { 1058 struct csym_arg arg; 1059 1060 if (!outer) return 0; 1061 if (outer == c) return 0; 1062 arg.c = c; 1063 arg.sym = 0; 1064 iv_foreach(mrb, outer->iv, csym_i, &arg); 1065 return arg.sym; 1066 } 1067 1068 static struct RClass* 1069 outer_class(mrb_state *mrb, struct RClass *c) 1070 { 1071 mrb_value ov; 1072 1073 ov = mrb_obj_iv_get(mrb, (struct RObject*)c, mrb_intern_lit(mrb, "__outer__")); 1074 if (mrb_nil_p(ov)) return NULL; 1075 switch (mrb_type(ov)) { 1076 case MRB_TT_CLASS: 1077 case MRB_TT_MODULE: 1078 return mrb_class_ptr(ov); 1079 default: 1080 break; 1081 } 1082 return NULL; 1083 } 1084 1085 static mrb_bool 1086 detect_outer_loop(mrb_state *mrb, struct RClass *c) 1087 { 1088 struct RClass *t = c; /* tortoise */ 1089 struct RClass *h = c; /* hare */ 1090 1091 for (;;) { 1092 if (h == NULL) return FALSE; 1093 h = outer_class(mrb, h); 1094 if (h == NULL) return FALSE; 1095 h = outer_class(mrb, h); 1096 t = outer_class(mrb, t); 1097 if (t == h) return TRUE; 1098 } 1099 } 1100 1101 mrb_value 1102 mrb_class_find_path(mrb_state *mrb, struct RClass *c) 1103 { 1104 struct RClass *outer; 1105 mrb_value path; 1106 mrb_sym name; 1107 const char *str; 1108 mrb_int len; 1109 1110 if (detect_outer_loop(mrb, c)) return mrb_nil_value(); 1111 outer = outer_class(mrb, c); 1112 if (outer == NULL) return mrb_nil_value(); 1113 name = find_class_sym(mrb, outer, c); 1114 if (name == 0) return mrb_nil_value(); 1115 str = mrb_class_name(mrb, outer); 1116 path = mrb_str_new_capa(mrb, 40); 1117 mrb_str_cat_cstr(mrb, path, str); 1118 mrb_str_cat_cstr(mrb, path, "::"); 1119 1120 str = mrb_sym_name_len(mrb, name, &len); 1121 mrb_str_cat(mrb, path, str, len); 1122 if (RSTRING_PTR(path)[0] != '#') { 1123 iv_del(mrb, c->iv, mrb_intern_lit(mrb, "__outer__"), NULL); 1124 iv_put(mrb, c->iv, mrb_intern_lit(mrb, "__classname__"), path); 1125 mrb_field_write_barrier_value(mrb, (struct RBasic*)c, path); 1126 path = mrb_str_dup(mrb, path); 1127 } 1128 return path; 1129 } 1130 1131 #define identchar(c) (ISALNUM(c) || (c) == '_' || !ISASCII(c)) 1132 1133 mrb_bool 1134 mrb_ident_p(const char *s, mrb_int len) 1135 { 1136 mrb_int i; 1137 1138 for (i = 0; i < len; i++) { 1139 if (!identchar(s[i])) return FALSE; 1140 } 1141 return TRUE; 1142 } -
EcnlProtoTool/trunk/mruby-2.1.1/src/vm.c
r331 r439 7 7 #include <stddef.h> 8 8 #include <stdarg.h> 9 #ifndef MRB_WITHOUT_FLOAT 9 10 #include <math.h> 11 #endif 10 12 #include <mruby.h> 11 13 #include <mruby/array.h> … … 23 25 #include <mruby/throw.h> 24 26 25 #if ndef MRB_DISABLE_STDIO27 #ifdef MRB_DISABLE_STDIO 26 28 #if defined(__cplusplus) 27 29 extern "C" { … … 52 54 #ifndef MRB_FUNCALL_DEPTH_MAX 53 55 #define MRB_FUNCALL_DEPTH_MAX 512 56 #endif 57 58 /* Maximum depth of ecall() recursion. */ 59 #ifndef MRB_ECALL_DEPTH_MAX 60 #define MRB_ECALL_DEPTH_MAX 512 54 61 #endif 55 62 … … 66 73 #endif 67 74 68 #define ARENA_RESTORE(mrb,ai) (mrb)->gc.arena_idx = (ai) 75 76 #ifndef MRB_GC_FIXED_ARENA 77 static void 78 mrb_gc_arena_shrink(mrb_state *mrb, int idx) 79 { 80 mrb_gc *gc = &mrb->gc; 81 int capa = gc->arena_capa; 82 83 if (idx < capa / 4) { 84 capa >>= 2; 85 if (capa < MRB_GC_ARENA_SIZE) { 86 capa = MRB_GC_ARENA_SIZE; 87 } 88 if (capa != gc->arena_capa) { 89 gc->arena = (struct RBasic**)mrb_realloc(mrb, gc->arena, sizeof(struct RBasic*)*capa); 90 gc->arena_capa = capa; 91 } 92 } 93 } 94 #else 95 #define mrb_gc_arena_shrink(mrb,idx) 96 #endif 69 97 70 98 #define CALL_MAXARGS 127 … … 116 144 117 145 static inline void 118 envadjust(mrb_state *mrb, mrb_value *oldbase, mrb_value *newbase, size_t size)146 envadjust(mrb_state *mrb, mrb_value *oldbase, mrb_value *newbase, size_t oldsize) 119 147 { 120 148 mrb_callinfo *ci = mrb->c->cibase; … … 126 154 127 155 if (e && MRB_ENV_STACK_SHARED_P(e) && 128 (st = e->stack) && oldbase <= st && st < oldbase+ size) {156 (st = e->stack) && oldbase <= st && st < oldbase+oldsize) { 129 157 ptrdiff_t off = e->stack - oldbase; 130 158 131 159 e->stack = newbase + off; 132 160 } 161 162 if (ci->proc && MRB_PROC_ENV_P(ci->proc) && ci->env != MRB_PROC_ENV(ci->proc)) { 163 e = MRB_PROC_ENV(ci->proc); 164 165 if (e && MRB_ENV_STACK_SHARED_P(e) && 166 (st = e->stack) && oldbase <= st && st < oldbase+oldsize) { 167 ptrdiff_t off = e->stack - oldbase; 168 169 e->stack = newbase + off; 170 } 171 } 172 133 173 ci->stackent = newbase + (ci->stackent - oldbase); 134 174 ci++; … … 139 179 140 180 static void 141 stack_extend_alloc(mrb_state *mrb, int room)181 stack_extend_alloc(mrb_state *mrb, mrb_int room) 142 182 { 143 183 mrb_value *oldbase = mrb->c->stbase; … … 149 189 if (off > size) size = off; 150 190 #ifdef MRB_STACK_EXTEND_DOUBLING 151 if ( room <= size)191 if ((size_t)room <= size) 152 192 size *= 2; 153 193 else … … 168 208 } 169 209 stack_clear(&(newstack[oldsize]), size - oldsize); 170 envadjust(mrb, oldbase, newstack, size);210 envadjust(mrb, oldbase, newstack, oldsize); 171 211 mrb->c->stbase = newstack; 172 212 mrb->c->stack = mrb->c->stbase + off; … … 180 220 } 181 221 182 static inlinevoid183 stack_extend(mrb_state *mrb,int room)222 MRB_API void 223 mrb_stack_extend(mrb_state *mrb, mrb_int room) 184 224 { 185 225 if (mrb->c->stack + room >= mrb->c->stend) { … … 191 231 uvenv(mrb_state *mrb, int up) 192 232 { 193 struct REnv *e = mrb->c->ci->proc->env; 233 struct RProc *proc = mrb->c->ci->proc; 234 struct REnv *e; 194 235 195 236 while (up--) { 196 if (!e) return NULL; 197 e = (struct REnv*)e->c; 198 } 199 return e; 200 } 201 202 static inline mrb_bool 203 is_strict(mrb_state *mrb, struct REnv *e) 204 { 205 int cioff = e->cioff; 206 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)) { 209 return TRUE; 210 } 211 return FALSE; 212 } 213 214 static inline struct REnv* 215 top_env(mrb_state *mrb, struct RProc *proc) 216 { 217 struct REnv *e = proc->env; 218 219 if (is_strict(mrb, e)) return e; 220 while (e->c) { 221 e = (struct REnv*)e->c; 222 if (is_strict(mrb, e)) return e; 223 } 224 return e; 237 proc = proc->upper; 238 if (!proc) return NULL; 239 } 240 e = MRB_PROC_ENV(proc); 241 if (e) return e; /* proc has enclosed env */ 242 else { 243 mrb_callinfo *ci = mrb->c->ci; 244 mrb_callinfo *cb = mrb->c->cibase; 245 246 while (cb <= ci) { 247 if (ci->proc == proc) { 248 return ci->env; 249 } 250 ci--; 251 } 252 } 253 return NULL; 254 } 255 256 static inline struct RProc* 257 top_proc(mrb_state *mrb, struct RProc *proc) 258 { 259 while (proc->upper) { 260 if (MRB_PROC_SCOPE_P(proc) || MRB_PROC_STRICT_P(proc)) 261 return proc; 262 proc = proc->upper; 263 } 264 return proc; 225 265 } 226 266 … … 229 269 #define CI_ACC_RESUMED -3 230 270 231 static mrb_callinfo*271 static inline mrb_callinfo* 232 272 cipush(mrb_state *mrb) 233 273 { 234 274 struct mrb_context *c = mrb->c; 275 static const mrb_callinfo ci_zero = { 0 }; 235 276 mrb_callinfo *ci = c->ci; 236 277 … … 245 286 } 246 287 ci = ++c->ci; 288 *ci = ci_zero; 247 289 ci->epos = mrb->c->eidx; 248 290 ci->ridx = ridx; 249 ci->env = 0;250 ci->pc = 0;251 ci->err = 0;252 ci->proc = 0;253 ci->acc = 0;254 291 255 292 return ci; 256 293 } 257 294 258 MRB_APIvoid295 void 259 296 mrb_env_unshare(mrb_state *mrb, struct REnv *e) 260 297 { 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); 280 } 281 282 static void 298 if (e == NULL) return; 299 else { 300 size_t len = (size_t)MRB_ENV_STACK_LEN(e); 301 mrb_value *p; 302 303 if (!MRB_ENV_STACK_SHARED_P(e)) return; 304 if (e->cxt != mrb->c) return; 305 if (e == mrb->c->cibase->env) return; /* for mirb */ 306 p = (mrb_value *)mrb_malloc(mrb, sizeof(mrb_value)*len); 307 if (len > 0) { 308 stack_copy(p, e->stack, len); 309 } 310 e->stack = p; 311 MRB_ENV_UNSHARE_STACK(e); 312 mrb_write_barrier(mrb, (struct RBasic *)e); 313 } 314 } 315 316 static inline void 283 317 cipop(mrb_state *mrb) 284 318 { … … 287 321 288 322 c->ci--; 289 290 if (env) { 291 mrb_env_unshare(mrb, env); 292 } 323 if (env) mrb_env_unshare(mrb, env); 293 324 } 294 325 … … 296 327 297 328 static void 298 ecall(mrb_state *mrb , int i)329 ecall(mrb_state *mrb) 299 330 { 300 331 struct RProc *p; 301 mrb_callinfo *ci = mrb->c->ci;302 mrb_ value *self = mrb->c->stack;332 struct mrb_context *c = mrb->c; 333 mrb_callinfo *ci = c->ci; 303 334 struct RObject *exc; 335 struct REnv *env; 304 336 ptrdiff_t cioff; 305 337 int ai = mrb_gc_arena_save(mrb); 338 uint16_t i = --c->eidx; 339 int nregs; 306 340 307 341 if (i<0) return; 308 if (ci - mrb->c->cibase > MRB_FUNCALL_DEPTH_MAX) { 342 /* restrict total call depth of ecall() */ 343 if (++mrb->ecall_nest > MRB_ECALL_DEPTH_MAX) { 309 344 mrb_exc_raise(mrb, mrb_obj_value(mrb->stack_err)); 310 345 } 311 p = mrb->c->ensure[i];346 p = c->ensure[i]; 312 347 if (!p) return; 313 mrb->c->ensure[i] = NULL; 314 cioff = ci - mrb->c->cibase; 348 mrb_assert(!MRB_PROC_CFUNC_P(p)); 349 c->ensure[i] = NULL; 350 nregs = p->upper->body.irep->nregs; 351 if (ci->proc && !MRB_PROC_CFUNC_P(ci->proc) && 352 ci->proc->body.irep->nregs > nregs) { 353 nregs = ci->proc->body.irep->nregs; 354 } 355 cioff = ci - c->cibase; 315 356 ci = cipush(mrb); 316 357 ci->stackent = mrb->c->stack; … … 319 360 ci->argc = 0; 320 361 ci->proc = p; 321 ci->nregs = p->body.irep->nregs; 322 ci->target_class = p->target_class; 323 mrb->c->stack = mrb->c->stack + ci[-1].nregs; 362 ci->target_class = MRB_PROC_TARGET_CLASS(p); 363 env = MRB_PROC_ENV(p); 364 mrb_assert(env); 365 c->stack += nregs; 324 366 exc = mrb->exc; mrb->exc = 0; 325 367 if (exc) { 326 368 mrb_gc_protect(mrb, mrb_obj_value(exc)); 327 369 } 328 mrb_run(mrb, p, *self); 329 mrb->c->ci = mrb->c->cibase + cioff; 370 if (mrb->c->fib) { 371 mrb_gc_protect(mrb, mrb_obj_value(mrb->c->fib)); 372 } 373 mrb_run(mrb, p, env->stack[0]); 374 mrb->c = c; 375 c->ci = c->cibase + cioff; 330 376 if (!mrb->exc) mrb->exc = exc; 331 377 mrb_gc_arena_restore(mrb, ai); 378 mrb->ecall_nest--; 332 379 } 333 380 … … 356 403 } 357 404 405 static int 406 ci_nregs(mrb_callinfo *ci) 407 { 408 struct RProc *p; 409 int n = 0; 410 411 if (!ci) return 3; 412 p = ci->proc; 413 if (!p) { 414 if (ci->argc < 0) return 3; 415 return ci->argc+2; 416 } 417 if (!MRB_PROC_CFUNC_P(p) && p->body.irep) { 418 n = p->body.irep->nregs; 419 } 420 if (ci->argc < 0) { 421 if (n < 3) n = 3; /* self + args + blk */ 422 } 423 if (ci->argc > n) { 424 n = ci->argc + 2; /* self + blk */ 425 } 426 return n; 427 } 428 358 429 MRB_API mrb_value 359 430 mrb_funcall_with_block(mrb_state *mrb, mrb_value self, mrb_sym mid, mrb_int argc, const mrb_value *argv, mrb_value blk) 360 431 { 361 432 mrb_value val; 433 int ai = mrb_gc_arena_save(mrb); 362 434 363 435 if (!mrb->jmp) { … … 383 455 } 384 456 else { 385 struct RProc *p;457 mrb_method_t m; 386 458 struct RClass *c; 387 459 mrb_callinfo *ci; 388 int n ;460 int n = ci_nregs(mrb->c->ci); 389 461 ptrdiff_t voff = -1; 390 462 … … 392 464 stack_init(mrb); 393 465 } 394 n = mrb->c->ci->nregs;395 466 if (argc < 0) { 396 mrb_raisef(mrb, E_ARGUMENT_ERROR, "negative argc for funcall (% S)", mrb_fixnum_value(argc));467 mrb_raisef(mrb, E_ARGUMENT_ERROR, "negative argc for funcall (%i)", argc); 397 468 } 398 469 c = mrb_class(mrb, self); 399 p= mrb_method_search_vm(mrb, &c, mid);400 if ( !p) {470 m = mrb_method_search_vm(mrb, &c, mid); 471 if (MRB_METHOD_UNDEF_P(m)) { 401 472 mrb_sym missing = mrb_intern_lit(mrb, "method_missing"); 402 473 mrb_value args = mrb_ary_new_from_values(mrb, argc, argv); 403 p= mrb_method_search_vm(mrb, &c, missing);404 if ( !p) {474 m = mrb_method_search_vm(mrb, &c, missing); 475 if (MRB_METHOD_UNDEF_P(m)) { 405 476 mrb_method_missing(mrb, mid, self, args); 406 477 } 407 478 mrb_ary_unshift(mrb, args, mrb_symbol_value(mid)); 408 stack_extend(mrb, n+2);479 mrb_stack_extend(mrb, n+2); 409 480 mrb->c->stack[n+1] = args; 410 481 argc = -1; … … 415 486 ci = cipush(mrb); 416 487 ci->mid = mid; 417 ci->proc = p;418 488 ci->stackent = mrb->c->stack; 419 ci->argc = argc;489 ci->argc = (int)argc; 420 490 ci->target_class = c; 421 491 mrb->c->stack = mrb->c->stack + n; 492 if (argc < 0) argc = 1; 422 493 if (mrb->c->stbase <= argv && argv < mrb->c->stend) { 423 494 voff = argv - mrb->c->stbase; 424 495 } 425 if (MRB_PROC_CFUNC_P(p)) { 426 ci->nregs = argc + 2; 427 stack_extend(mrb, ci->nregs); 428 } 429 else if (argc >= CALL_MAXARGS) { 496 if (argc >= CALL_MAXARGS) { 430 497 mrb_value args = mrb_ary_new_from_values(mrb, argc, argv); 431 stack_extend(mrb, ci->nregs); 498 432 499 mrb->c->stack[1] = args; 433 500 ci->argc = -1; 434 501 argc = 1; 435 502 } 436 else { 437 if (argc < 0) argc = 1; 438 ci->nregs = p->body.irep->nregs + argc; 439 stack_extend(mrb, ci->nregs); 503 mrb_stack_extend(mrb, argc + 2); 504 if (MRB_METHOD_PROC_P(m)) { 505 struct RProc *p = MRB_METHOD_PROC(m); 506 507 ci->proc = p; 508 if (!MRB_PROC_CFUNC_P(p)) { 509 mrb_stack_extend(mrb, p->body.irep->nregs + argc); 510 } 440 511 } 441 512 if (voff >= 0) { … … 448 519 mrb->c->stack[argc+1] = blk; 449 520 450 if (MRB_PROC_CFUNC_P(p)) { 451 int ai = mrb_gc_arena_save(mrb); 452 521 if (MRB_METHOD_CFUNC_P(m)) { 453 522 ci->acc = CI_ACC_DIRECT; 454 val = p->body.func(mrb, self);523 val = MRB_METHOD_CFUNC(m)(mrb, self); 455 524 mrb->c->stack = mrb->c->ci->stackent; 456 525 cipop(mrb); 457 mrb_gc_arena_restore(mrb, ai);458 526 } 459 527 else { 460 528 ci->acc = CI_ACC_SKIP; 461 val = mrb_run(mrb, p, self); 462 } 463 } 529 val = mrb_run(mrb, MRB_METHOD_PROC(m), self); 530 } 531 } 532 mrb_gc_arena_restore(mrb, ai); 464 533 mrb_gc_protect(mrb, val); 465 534 return val; … … 476 545 { 477 546 mrb_callinfo *ci = mrb->c->ci; 547 int keep, nregs; 478 548 479 549 mrb->c->stack[0] = self; 480 550 ci->proc = p; 481 ci->target_class = p->target_class;482 551 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); 552 return MRB_PROC_CFUNC(p)(mrb, self); 553 } 554 nregs = p->body.irep->nregs; 555 if (ci->argc < 0) keep = 3; 556 else keep = ci->argc + 2; 557 if (nregs < keep) { 558 mrb_stack_extend(mrb, keep); 487 559 } 488 560 else { 489 stack_extend(mrb, p->body.irep->nregs);490 }491 492 ci->nregs = p->body.irep->nregs; 561 mrb_stack_extend(mrb, nregs); 562 stack_clear(mrb->c->stack+keep, nregs-keep); 563 } 564 493 565 ci = cipush(mrb); 494 ci->nregs = 0;495 566 ci->target_class = 0; 496 567 ci->pc = p->body.irep->iseq; … … 520 591 * k.send :hello, "gentle", "readers" #=> "Hello gentle readers" 521 592 */ 522 MRB_APImrb_value593 mrb_value 523 594 mrb_f_send(mrb_state *mrb, mrb_value self) 524 595 { … … 526 597 mrb_value block, *argv, *regs; 527 598 mrb_int argc, i, len; 528 struct RProc *p;599 mrb_method_t m; 529 600 struct RClass *c; 530 601 mrb_callinfo *ci; … … 538 609 539 610 c = mrb_class(mrb, self); 540 p = mrb_method_search_vm(mrb, &c, name); 541 542 if (!p) { /* call method_mising */ 611 m = mrb_method_search_vm(mrb, &c, name); 612 if (MRB_METHOD_UNDEF_P(m)) { /* call method_mising */ 543 613 goto funcall; 544 614 } … … 558 628 } 559 629 560 return mrb_exec_irep(mrb, self, p); 630 if (MRB_METHOD_CFUNC_P(m)) { 631 if (MRB_METHOD_PROC_P(m)) { 632 ci->proc = MRB_METHOD_PROC(m); 633 } 634 return MRB_METHOD_CFUNC(m)(mrb, self); 635 } 636 return mrb_exec_irep(mrb, self, MRB_METHOD_PROC(m)); 561 637 } 562 638 … … 566 642 struct RProc *p; 567 643 mrb_callinfo *ci; 568 mrb_int max = 3;644 int nregs; 569 645 570 646 if (mrb_nil_p(blk)) { … … 582 658 ci->mid = ci[-1].mid; 583 659 if (MRB_PROC_CFUNC_P(p)) { 584 stack_extend(mrb, 3);660 mrb_stack_extend(mrb, 3); 585 661 mrb->c->stack[0] = self; 586 662 mrb->c->stack[1] = self; 587 663 mrb->c->stack[2] = mrb_nil_value(); 588 return p->body.func(mrb, self);589 } 590 ci->nregs = p->body.irep->nregs;591 if ( max < ci->nregs) max = ci->nregs;592 stack_extend(mrb, max);664 return MRB_PROC_CFUNC(p)(mrb, self); 665 } 666 nregs = p->body.irep->nregs; 667 if (nregs < 3) nregs = 3; 668 mrb_stack_extend(mrb, nregs); 593 669 mrb->c->stack[0] = self; 594 670 mrb->c->stack[1] = self; 595 mrb->c->stack[2] = mrb_nil_value();671 stack_clear(mrb->c->stack+2, nregs-2); 596 672 ci = cipush(mrb); 597 ci->nregs = 0;598 673 ci->target_class = 0; 599 674 ci->pc = p->body.irep->iseq; … … 659 734 case MRB_TT_SYMBOL: 660 735 case MRB_TT_FIXNUM: 736 #ifndef MRB_WITHOUT_FLOAT 661 737 case MRB_TT_FLOAT: 738 #endif 662 739 c = 0; 663 740 break; … … 676 753 mrb_sym mid = mrb->c->ci->mid; 677 754 mrb_callinfo *ci; 678 int n = mrb->c->ci->nregs;679 755 mrb_value val; 756 int n; 680 757 681 758 if (mrb_nil_p(b)) { 682 759 mrb_raise(mrb, E_ARGUMENT_ERROR, "no block given"); 683 760 } 684 if (mrb->c->ci - mrb->c->cibase > MRB_FUNCALL_DEPTH_MAX) { 761 ci = mrb->c->ci; 762 n = ci_nregs(ci); 763 if (ci - mrb->c->cibase > MRB_FUNCALL_DEPTH_MAX) { 685 764 mrb_exc_raise(mrb, mrb_obj_value(mrb->stack_err)); 686 765 } … … 690 769 ci->proc = p; 691 770 ci->stackent = mrb->c->stack; 692 ci->argc = argc;771 ci->argc = (int)argc; 693 772 ci->target_class = c; 694 773 ci->acc = CI_ACC_SKIP; 774 n = MRB_PROC_CFUNC_P(p) ? (int)(argc+2) : p->body.irep->nregs; 695 775 mrb->c->stack = mrb->c->stack + n; 696 if (MRB_PROC_CFUNC_P(p)) { 697 ci->nregs = argc + 2; 698 stack_extend(mrb, ci->nregs); 699 } 700 else { 701 ci->nregs = p->body.irep->nregs; 702 stack_extend(mrb, ci->nregs); 703 } 776 mrb_stack_extend(mrb, n); 704 777 705 778 mrb->c->stack[0] = self; … … 710 783 711 784 if (MRB_PROC_CFUNC_P(p)) { 712 val = p->body.func(mrb, self);785 val = MRB_PROC_CFUNC(p)(mrb, self); 713 786 mrb->c->stack = mrb->c->ci->stackent; 787 cipop(mrb); 714 788 } 715 789 else { 716 int cioff = mrb->c->ci - mrb->c->cibase;717 790 val = mrb_run(mrb, p, self); 718 mrb->c->ci = mrb->c->cibase + cioff; 719 } 720 cipop(mrb); 791 } 721 792 return val; 722 793 } … … 727 798 struct RProc *p = mrb_proc_ptr(b); 728 799 729 return mrb_yield_with_class(mrb, b, argc, argv, p->env->stack[0], p->target_class);800 return mrb_yield_with_class(mrb, b, argc, argv, MRB_PROC_ENV(p)->stack[0], MRB_PROC_TARGET_CLASS(p)); 730 801 } 731 802 … … 735 806 struct RProc *p = mrb_proc_ptr(b); 736 807 737 return mrb_yield_with_class(mrb, b, 1, &arg, p->env->stack[0], p->target_class);808 return mrb_yield_with_class(mrb, b, 1, &arg, MRB_PROC_ENV(p)->stack[0], MRB_PROC_TARGET_CLASS(p)); 738 809 } 739 810 … … 747 818 mrb_raise(mrb, E_ARGUMENT_ERROR, "no block given"); 748 819 } 749 if ( mrb_type(b) != MRB_TT_PROC) {820 if (!mrb_proc_p(b)) { 750 821 mrb_raise(mrb, E_TYPE_ERROR, "not a block"); 751 822 } … … 754 825 ci = mrb->c->ci; 755 826 756 stack_extend(mrb, 3);827 mrb_stack_extend(mrb, 3); 757 828 mrb->c->stack[1] = mrb_ary_new_from_values(mrb, argc, argv); 758 829 mrb->c->stack[2] = mrb_nil_value(); … … 767 838 768 839 brk = (struct RBreak*)mrb_obj_alloc(mrb, MRB_TT_BREAK, NULL); 769 brk->iv = NULL; 770 brk->proc = p; 771 brk->val = val; 840 mrb_break_proc_set(brk, p); 841 mrb_break_value_set(brk, val); 772 842 773 843 return brk; … … 789 859 mrb_value exc; 790 860 791 msg = mrb_str_ buf_new(mrb, sizeof(lead) + 7);861 msg = mrb_str_new_capa(mrb, sizeof(lead) + 7); 792 862 mrb_str_cat(mrb, msg, lead, sizeof(lead) - 1); 793 863 mrb_str_cat(mrb, msg, kind_str[kind], kind_str_len[kind]); … … 810 880 } 811 881 if (mrb->c->ci->mid) { 812 str = mrb_format(mrb, "'%S': wrong number of arguments (%S for %S)", 813 mrb_sym2str(mrb, mrb->c->ci->mid), 814 mrb_fixnum_value(argc), mrb_fixnum_value(num)); 882 str = mrb_format(mrb, "'%n': wrong number of arguments (%i for %i)", 883 mrb->c->ci->mid, argc, num); 815 884 } 816 885 else { 817 str = mrb_format(mrb, "wrong number of arguments (%S for %S)", 818 mrb_fixnum_value(argc), mrb_fixnum_value(num)); 886 str = mrb_format(mrb, "wrong number of arguments (%i for %i)", argc, num); 819 887 } 820 888 exc = mrb_exc_new_str(mrb, E_ARGUMENT_ERROR, str); … … 822 890 } 823 891 824 #define ERR_PC_SET(mrb , pc) mrb->c->ci->err = pc;825 #define ERR_PC_CLR(mrb) 892 #define ERR_PC_SET(mrb) mrb->c->ci->err = pc0; 893 #define ERR_PC_CLR(mrb) mrb->c->ci->err = 0; 826 894 #ifdef MRB_ENABLE_DEBUG_HOOK 827 895 #define CODE_FETCH_HOOK(mrb, irep, pc, regs) if ((mrb)->code_fetch_hook) (mrb)->code_fetch_hook((mrb), (irep), (pc), (regs)); … … 836 904 #endif 837 905 838 906 #ifndef MRB_DISABLE_DIRECT_THREADING 839 907 #if defined __GNUC__ || defined __clang__ || defined __INTEL_COMPILER 840 908 #define DIRECT_THREADED 841 909 #endif 910 #endif /* ifndef MRB_DISABLE_DIRECT_THREADING */ 842 911 843 912 #ifndef DIRECT_THREADED 844 913 845 #define INIT_DISPATCH for (;;) { i = BYTECODE_DECODER(*pc); CODE_FETCH_HOOK(mrb, irep, pc, regs); switch (GET_OPCODE(i)) {846 #define CASE( op) case op:847 #define NEXT pc++;break848 #define JUMP break914 #define INIT_DISPATCH for (;;) { insn = BYTECODE_DECODER(*pc); CODE_FETCH_HOOK(mrb, irep, pc, regs); switch (insn) { 915 #define CASE(insn,ops) case insn: pc0=pc++; FETCH_ ## ops ();; L_ ## insn ## _BODY: 916 #define NEXT break 917 #define JUMP NEXT 849 918 #define END_DISPATCH }} 850 919 … … 852 921 853 922 #define INIT_DISPATCH JUMP; return mrb_nil_value(); 854 #define CASE( op) L_ ## op: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)]923 #define CASE(insn,ops) L_ ## insn: pc0=pc++; FETCH_ ## ops (); L_ ## insn ## _BODY: 924 #define NEXT insn=BYTECODE_DECODER(*pc); CODE_FETCH_HOOK(mrb, irep, pc, regs); goto *optable[insn] 925 #define JUMP NEXT 857 926 858 927 #define END_DISPATCH … … 866 935 mrb_value result; 867 936 struct mrb_context *c = mrb->c; 868 int cioff = c->ci - c->cibase;937 ptrdiff_t cioff = c->ci - c->cibase; 869 938 unsigned int nregs = irep->nregs; 870 939 … … 874 943 if (stack_keep > nregs) 875 944 nregs = stack_keep; 876 stack_extend(mrb, nregs);945 mrb_stack_extend(mrb, nregs); 877 946 stack_clear(c->stack + stack_keep, nregs - stack_keep); 878 947 c->stack[0] = self; 879 948 result = mrb_vm_exec(mrb, proc, irep->iseq); 880 if (c->ci - c->cibase > cioff) {881 c->ci = c->cibase + cioff;882 }883 949 if (mrb->c != c) { 884 950 if (mrb->c->fib) { … … 887 953 mrb->c = c; 888 954 } 955 else if (c->ci - c->cibase > cioff) { 956 c->ci = c->cibase + cioff; 957 } 889 958 return result; 890 959 } 891 960 961 static mrb_bool 962 check_target_class(mrb_state *mrb) 963 { 964 if (!mrb->c->ci->target_class) { 965 mrb_value exc = mrb_exc_new_str_lit(mrb, E_TYPE_ERROR, "no target class or module"); 966 mrb_exc_set(mrb, exc); 967 return FALSE; 968 } 969 return TRUE; 970 } 971 972 void mrb_hash_check_kdict(mrb_state *mrb, mrb_value self); 973 892 974 MRB_API mrb_value 893 mrb_vm_exec(mrb_state *mrb, struct RProc *proc, mrb_code *pc) 894 { 895 /* mrb_assert(mrb_proc_cfunc_p(proc)) */ 975 mrb_vm_exec(mrb_state *mrb, struct RProc *proc, const mrb_code *pc) 976 { 977 /* mrb_assert(MRB_PROC_CFUNC_P(proc)) */ 978 const mrb_code *pc0 = pc; 896 979 mrb_irep *irep = proc->body.irep; 897 980 mrb_value *pool = irep->pool; 898 981 mrb_sym *syms = irep->syms; 899 mrb_code i ;982 mrb_code insn; 900 983 int ai = mrb_gc_arena_save(mrb); 901 984 struct mrb_jmpbuf *prev_jmp = mrb->jmp; 902 985 struct mrb_jmpbuf c_jmp; 986 uint32_t a; 987 uint16_t b; 988 uint8_t c; 989 mrb_sym mid; 903 990 904 991 #ifdef DIRECT_THREADED 905 992 static void *optable[] = { 906 &&L_OP_NOP, &&L_OP_MOVE, 907 &&L_OP_LOADL, &&L_OP_LOADI, &&L_OP_LOADSYM, &&L_OP_LOADNIL, 908 &&L_OP_LOADSELF, &&L_OP_LOADT, &&L_OP_LOADF, 909 &&L_OP_GETGLOBAL, &&L_OP_SETGLOBAL, &&L_OP_GETSPECIAL, &&L_OP_SETSPECIAL, 910 &&L_OP_GETIV, &&L_OP_SETIV, &&L_OP_GETCV, &&L_OP_SETCV, 911 &&L_OP_GETCONST, &&L_OP_SETCONST, &&L_OP_GETMCNST, &&L_OP_SETMCNST, 912 &&L_OP_GETUPVAR, &&L_OP_SETUPVAR, 913 &&L_OP_JMP, &&L_OP_JMPIF, &&L_OP_JMPNOT, 914 &&L_OP_ONERR, &&L_OP_RESCUE, &&L_OP_POPERR, &&L_OP_RAISE, &&L_OP_EPUSH, &&L_OP_EPOP, 915 &&L_OP_SEND, &&L_OP_SENDB, &&L_OP_FSEND, 916 &&L_OP_CALL, &&L_OP_SUPER, &&L_OP_ARGARY, &&L_OP_ENTER, 917 &&L_OP_KARG, &&L_OP_KDICT, &&L_OP_RETURN, &&L_OP_TAILCALL, &&L_OP_BLKPUSH, 918 &&L_OP_ADD, &&L_OP_ADDI, &&L_OP_SUB, &&L_OP_SUBI, &&L_OP_MUL, &&L_OP_DIV, 919 &&L_OP_EQ, &&L_OP_LT, &&L_OP_LE, &&L_OP_GT, &&L_OP_GE, 920 &&L_OP_ARRAY, &&L_OP_ARYCAT, &&L_OP_ARYPUSH, &&L_OP_AREF, &&L_OP_ASET, &&L_OP_APOST, 921 &&L_OP_STRING, &&L_OP_STRCAT, &&L_OP_HASH, 922 &&L_OP_LAMBDA, &&L_OP_RANGE, &&L_OP_OCLASS, 923 &&L_OP_CLASS, &&L_OP_MODULE, &&L_OP_EXEC, 924 &&L_OP_METHOD, &&L_OP_SCLASS, &&L_OP_TCLASS, 925 &&L_OP_DEBUG, &&L_OP_STOP, &&L_OP_ERR, 993 #define OPCODE(x,_) &&L_OP_ ## x, 994 #include "mruby/ops.h" 995 #undef OPCODE 926 996 }; 927 997 #endif … … 934 1004 if (exc_catched) { 935 1005 exc_catched = FALSE; 1006 mrb_gc_arena_restore(mrb, ai); 936 1007 if (mrb->exc && mrb->exc->tt == MRB_TT_BREAK) 937 1008 goto L_BREAK; … … 940 1011 mrb->jmp = &c_jmp; 941 1012 mrb->c->ci->proc = proc; 942 mrb->c->ci->nregs = irep->nregs;943 1013 944 1014 #define regs (mrb->c->stack) 945 1015 INIT_DISPATCH { 946 CASE(OP_NOP ) {1016 CASE(OP_NOP, Z) { 947 1017 /* do nothing */ 948 1018 NEXT; 949 1019 } 950 1020 951 CASE(OP_MOVE) { 952 /* A B R(A) := R(B) */ 953 int a = GETARG_A(i); 954 int b = GETARG_B(i); 1021 CASE(OP_MOVE, BB) { 955 1022 regs[a] = regs[b]; 956 1023 NEXT; 957 1024 } 958 1025 959 CASE(OP_LOADL) { 960 /* A Bx R(A) := Pool(Bx) */ 961 int a = GETARG_A(i); 962 int bx = GETARG_Bx(i); 1026 CASE(OP_LOADL, BB) { 963 1027 #ifdef MRB_WORD_BOXING 964 mrb_value val = pool[bx]; 1028 mrb_value val = pool[b]; 1029 #ifndef MRB_WITHOUT_FLOAT 965 1030 if (mrb_float_p(val)) { 966 1031 val = mrb_float_value(mrb, mrb_float(val)); 967 1032 } 1033 #endif 968 1034 regs[a] = val; 969 1035 #else 970 regs[a] = pool[bx]; 971 #endif 972 NEXT; 973 } 974 975 CASE(OP_LOADI) { 976 /* A sBx R(A) := sBx */ 977 SET_INT_VALUE(regs[GETARG_A(i)], GETARG_sBx(i)); 978 NEXT; 979 } 980 981 CASE(OP_LOADSYM) { 982 /* A Bx R(A) := Syms(Bx) */ 983 int a = GETARG_A(i); 984 int bx = GETARG_Bx(i); 985 SET_SYM_VALUE(regs[a], syms[bx]); 986 NEXT; 987 } 988 989 CASE(OP_LOADSELF) { 990 /* A R(A) := self */ 991 int a = GETARG_A(i); 1036 regs[a] = pool[b]; 1037 #endif 1038 NEXT; 1039 } 1040 1041 CASE(OP_LOADI, BB) { 1042 SET_INT_VALUE(regs[a], b); 1043 NEXT; 1044 } 1045 1046 CASE(OP_LOADINEG, BB) { 1047 SET_INT_VALUE(regs[a], -b); 1048 NEXT; 1049 } 1050 1051 CASE(OP_LOADI__1,B) goto L_LOADI; 1052 CASE(OP_LOADI_0,B) goto L_LOADI; 1053 CASE(OP_LOADI_1,B) goto L_LOADI; 1054 CASE(OP_LOADI_2,B) goto L_LOADI; 1055 CASE(OP_LOADI_3,B) goto L_LOADI; 1056 CASE(OP_LOADI_4,B) goto L_LOADI; 1057 CASE(OP_LOADI_5,B) goto L_LOADI; 1058 CASE(OP_LOADI_6,B) goto L_LOADI; 1059 CASE(OP_LOADI_7, B) { 1060 L_LOADI: 1061 SET_INT_VALUE(regs[a], (mrb_int)insn - (mrb_int)OP_LOADI_0); 1062 NEXT; 1063 } 1064 1065 CASE(OP_LOADSYM, BB) { 1066 SET_SYM_VALUE(regs[a], syms[b]); 1067 NEXT; 1068 } 1069 1070 CASE(OP_LOADNIL, B) { 1071 SET_NIL_VALUE(regs[a]); 1072 NEXT; 1073 } 1074 1075 CASE(OP_LOADSELF, B) { 992 1076 regs[a] = regs[0]; 993 1077 NEXT; 994 1078 } 995 1079 996 CASE(OP_LOADT) { 997 /* A R(A) := true */ 998 int a = GETARG_A(i); 1080 CASE(OP_LOADT, B) { 999 1081 SET_TRUE_VALUE(regs[a]); 1000 1082 NEXT; 1001 1083 } 1002 1084 1003 CASE(OP_LOADF) { 1004 /* A R(A) := false */ 1005 int a = GETARG_A(i); 1085 CASE(OP_LOADF, B) { 1006 1086 SET_FALSE_VALUE(regs[a]); 1007 1087 NEXT; 1008 1088 } 1009 1089 1010 CASE(OP_GETGLOBAL) { 1011 /* A Bx R(A) := getglobal(Syms(Bx)) */ 1012 int a = GETARG_A(i); 1013 int bx = GETARG_Bx(i); 1014 mrb_value val = mrb_gv_get(mrb, syms[bx]); 1090 CASE(OP_GETGV, BB) { 1091 mrb_value val = mrb_gv_get(mrb, syms[b]); 1015 1092 regs[a] = val; 1016 1093 NEXT; 1017 1094 } 1018 1095 1019 CASE(OP_SETGLOBAL) { 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]); 1024 NEXT; 1025 } 1026 1027 CASE(OP_GETSPECIAL) { 1028 /* A Bx R(A) := Special[Bx] */ 1029 int a = GETARG_A(i); 1030 int bx = GETARG_Bx(i); 1031 mrb_value val = mrb_vm_special_get(mrb, bx); 1096 CASE(OP_SETGV, BB) { 1097 mrb_gv_set(mrb, syms[b], regs[a]); 1098 NEXT; 1099 } 1100 1101 CASE(OP_GETSV, BB) { 1102 mrb_value val = mrb_vm_special_get(mrb, b); 1032 1103 regs[a] = val; 1033 1104 NEXT; 1034 1105 } 1035 1106 1036 CASE(OP_SETSPECIAL) { 1037 /* A Bx Special[Bx] := R(A) */ 1038 int a = GETARG_A(i); 1039 int bx = GETARG_Bx(i); 1040 mrb_vm_special_set(mrb, bx, regs[a]); 1041 NEXT; 1042 } 1043 1044 CASE(OP_GETIV) { 1045 /* A Bx R(A) := ivget(Bx) */ 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; 1050 NEXT; 1051 } 1052 1053 CASE(OP_SETIV) { 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]); 1058 NEXT; 1059 } 1060 1061 CASE(OP_GETCV) { 1062 /* A Bx R(A) := cvget(Syms(Bx)) */ 1063 int a = GETARG_A(i); 1064 int bx = GETARG_Bx(i); 1107 CASE(OP_SETSV, BB) { 1108 mrb_vm_special_set(mrb, b, regs[a]); 1109 NEXT; 1110 } 1111 1112 CASE(OP_GETIV, BB) { 1113 regs[a] = mrb_iv_get(mrb, regs[0], syms[b]); 1114 NEXT; 1115 } 1116 1117 CASE(OP_SETIV, BB) { 1118 mrb_iv_set(mrb, regs[0], syms[b], regs[a]); 1119 NEXT; 1120 } 1121 1122 CASE(OP_GETCV, BB) { 1065 1123 mrb_value val; 1066 ERR_PC_SET(mrb , pc);1067 val = mrb_vm_cv_get(mrb, syms[b x]);1124 ERR_PC_SET(mrb); 1125 val = mrb_vm_cv_get(mrb, syms[b]); 1068 1126 ERR_PC_CLR(mrb); 1069 1127 regs[a] = val; … … 1071 1129 } 1072 1130 1073 CASE(OP_SETCV) { 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]); 1078 NEXT; 1079 } 1080 1081 CASE(OP_GETCONST) { 1082 /* A Bx R(A) := constget(Syms(Bx)) */ 1131 CASE(OP_SETCV, BB) { 1132 mrb_vm_cv_set(mrb, syms[b], regs[a]); 1133 NEXT; 1134 } 1135 1136 CASE(OP_GETCONST, BB) { 1083 1137 mrb_value val; 1084 int a = GETARG_A(i); 1085 int bx = GETARG_Bx(i); 1086 mrb_sym sym = syms[bx]; 1087 1088 ERR_PC_SET(mrb, pc); 1138 mrb_sym sym = syms[b]; 1139 1140 ERR_PC_SET(mrb); 1089 1141 val = mrb_vm_const_get(mrb, sym); 1090 1142 ERR_PC_CLR(mrb); … … 1093 1145 } 1094 1146 1095 CASE(OP_SETCONST) { 1096 /* A Bx constset(Syms(Bx),R(A)) */ 1097 int a = GETARG_A(i); 1098 int bx = GETARG_Bx(i); 1099 mrb_vm_const_set(mrb, syms[bx], regs[a]); 1100 NEXT; 1101 } 1102 1103 CASE(OP_GETMCNST) { 1104 /* A Bx R(A) := R(A)::Syms(Bx) */ 1147 CASE(OP_SETCONST, BB) { 1148 mrb_vm_const_set(mrb, syms[b], regs[a]); 1149 NEXT; 1150 } 1151 1152 CASE(OP_GETMCNST, BB) { 1105 1153 mrb_value val; 1106 int a = GETARG_A(i); 1107 int bx = GETARG_Bx(i); 1108 1109 ERR_PC_SET(mrb, pc); 1110 val = mrb_const_get(mrb, regs[a], syms[bx]); 1154 1155 ERR_PC_SET(mrb); 1156 val = mrb_const_get(mrb, regs[a], syms[b]); 1111 1157 ERR_PC_CLR(mrb); 1112 1158 regs[a] = val; … … 1114 1160 } 1115 1161 1116 CASE(OP_SETMCNST) { 1117 /* A Bx R(A+1)::Syms(Bx) := R(A) */ 1118 int a = GETARG_A(i); 1119 int bx = GETARG_Bx(i); 1120 mrb_const_set(mrb, regs[a+1], syms[bx], regs[a]); 1121 NEXT; 1122 } 1123 1124 CASE(OP_GETUPVAR) { 1125 /* A B C R(A) := uvget(B,C) */ 1126 int a = GETARG_A(i); 1127 int b = GETARG_B(i); 1128 int c = GETARG_C(i); 1162 CASE(OP_SETMCNST, BB) { 1163 mrb_const_set(mrb, regs[a+1], syms[b], regs[a]); 1164 NEXT; 1165 } 1166 1167 CASE(OP_GETUPVAR, BBB) { 1129 1168 mrb_value *regs_a = regs + a; 1130 1169 struct REnv *e = uvenv(mrb, c); 1131 1170 1132 if (!e) { 1171 if (e && b < MRB_ENV_STACK_LEN(e)) { 1172 *regs_a = e->stack[b]; 1173 } 1174 else { 1133 1175 *regs_a = mrb_nil_value(); 1134 1176 } 1135 else { 1136 *regs_a = e->stack[b]; 1137 } 1138 NEXT; 1139 } 1140 1141 CASE(OP_SETUPVAR) { 1142 /* A B C uvset(B,C,R(A)) */ 1143 int a = GETARG_A(i); 1144 int b = GETARG_B(i); 1145 int c = GETARG_C(i); 1146 1177 NEXT; 1178 } 1179 1180 CASE(OP_SETUPVAR, BBB) { 1147 1181 struct REnv *e = uvenv(mrb, c); 1148 1182 … … 1158 1192 } 1159 1193 1160 CASE(OP_JMP) { 1161 /* sBx pc+=sBx */ 1162 int sbx = GETARG_sBx(i); 1163 pc += sbx; 1194 CASE(OP_JMP, S) { 1195 pc = irep->iseq+a; 1164 1196 JUMP; 1165 1197 } 1166 1167 CASE(OP_JMPIF) { 1168 /* A sBx if R(A) pc+=sBx */ 1169 int a = GETARG_A(i); 1170 int sbx = GETARG_sBx(i); 1198 CASE(OP_JMPIF, BS) { 1171 1199 if (mrb_test(regs[a])) { 1172 pc += sbx;1200 pc = irep->iseq+b; 1173 1201 JUMP; 1174 1202 } 1175 1203 NEXT; 1176 1204 } 1177 1178 CASE(OP_JMPNOT) { 1179 /* A sBx if !R(A) pc+=sBx */ 1180 int a = GETARG_A(i); 1181 int sbx = GETARG_sBx(i); 1205 CASE(OP_JMPNOT, BS) { 1182 1206 if (!mrb_test(regs[a])) { 1183 pc += sbx;1207 pc = irep->iseq+b; 1184 1208 JUMP; 1185 1209 } 1186 1210 NEXT; 1187 1211 } 1188 1189 CASE(OP_ONERR) { 1190 /* sBx pc+=sBx on exception */ 1191 int sbx = GETARG_sBx(i); 1212 CASE(OP_JMPNIL, BS) { 1213 if (mrb_nil_p(regs[a])) { 1214 pc = irep->iseq+b; 1215 JUMP; 1216 } 1217 NEXT; 1218 } 1219 1220 CASE(OP_ONERR, S) { 1221 /* check rescue stack */ 1222 if (mrb->c->ci->ridx == UINT16_MAX-1) { 1223 mrb_value exc = mrb_exc_new_str_lit(mrb, E_RUNTIME_ERROR, "too many nested rescues"); 1224 mrb_exc_set(mrb, exc); 1225 goto L_RAISE; 1226 } 1227 /* expand rescue stack */ 1192 1228 if (mrb->c->rsize <= mrb->c->ci->ridx) { 1193 1229 if (mrb->c->rsize == 0) mrb->c->rsize = RESCUE_STACK_INIT_SIZE; 1194 else mrb->c->rsize *= 2; 1195 mrb->c->rescue = (mrb_code **)mrb_realloc(mrb, mrb->c->rescue, sizeof(mrb_code*) * mrb->c->rsize); 1196 } 1197 mrb->c->rescue[mrb->c->ci->ridx++] = pc + sbx; 1198 NEXT; 1199 } 1200 1201 CASE(OP_RESCUE) { 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 } 1239 NEXT; 1240 } 1241 1242 CASE(OP_POPERR) { 1243 /* A A.times{rescue_pop()} */ 1244 int a = GETARG_A(i); 1245 1246 while (a--) { 1247 mrb->c->ci->ridx--; 1248 } 1249 NEXT; 1250 } 1251 1252 CASE(OP_RAISE) { 1253 /* A raise(R(A)) */ 1254 int a = GETARG_A(i); 1255 1230 else { 1231 mrb->c->rsize *= 2; 1232 if (mrb->c->rsize <= mrb->c->ci->ridx) { 1233 mrb->c->rsize = UINT16_MAX; 1234 } 1235 } 1236 mrb->c->rescue = (uint16_t*)mrb_realloc(mrb, mrb->c->rescue, sizeof(uint16_t)*mrb->c->rsize); 1237 } 1238 /* push rescue stack */ 1239 mrb->c->rescue[mrb->c->ci->ridx++] = a; 1240 NEXT; 1241 } 1242 1243 CASE(OP_EXCEPT, B) { 1244 mrb_value exc = mrb_obj_value(mrb->exc); 1245 mrb->exc = 0; 1246 regs[a] = exc; 1247 NEXT; 1248 } 1249 CASE(OP_RESCUE, BB) { 1250 mrb_value exc = regs[a]; /* exc on stack */ 1251 mrb_value e = regs[b]; 1252 struct RClass *ec; 1253 1254 switch (mrb_type(e)) { 1255 case MRB_TT_CLASS: 1256 case MRB_TT_MODULE: 1257 break; 1258 default: 1259 { 1260 mrb_value exc; 1261 1262 exc = mrb_exc_new_str_lit(mrb, E_TYPE_ERROR, 1263 "class or module required for rescue clause"); 1264 mrb_exc_set(mrb, exc); 1265 goto L_RAISE; 1266 } 1267 } 1268 ec = mrb_class_ptr(e); 1269 regs[b] = mrb_bool_value(mrb_obj_is_kind_of(mrb, exc, ec)); 1270 NEXT; 1271 } 1272 1273 CASE(OP_POPERR, B) { 1274 mrb->c->ci->ridx -= a; 1275 NEXT; 1276 } 1277 1278 CASE(OP_RAISE, B) { 1256 1279 mrb_exc_set(mrb, regs[a]); 1257 1280 goto L_RAISE; 1258 1281 } 1259 1282 1260 CASE(OP_EPUSH) { 1261 /* Bx ensure_push(SEQ[Bx]) */ 1262 int bx = GETARG_Bx(i); 1283 CASE(OP_EPUSH, B) { 1263 1284 struct RProc *p; 1264 1285 1265 p = mrb_closure_new(mrb, irep->reps[bx]); 1266 /* push ensure_stack */ 1286 p = mrb_closure_new(mrb, irep->reps[a]); 1287 /* check ensure stack */ 1288 if (mrb->c->eidx == UINT16_MAX-1) { 1289 mrb_value exc = mrb_exc_new_str_lit(mrb, E_RUNTIME_ERROR, "too many nested ensures"); 1290 mrb_exc_set(mrb, exc); 1291 goto L_RAISE; 1292 } 1293 /* expand ensure stack */ 1267 1294 if (mrb->c->esize <= mrb->c->eidx+1) { 1268 1295 if (mrb->c->esize == 0) mrb->c->esize = ENSURE_STACK_INIT_SIZE; 1269 else mrb->c->esize *= 2; 1270 mrb->c->ensure = (struct RProc **)mrb_realloc(mrb, mrb->c->ensure, sizeof(struct RProc*) * mrb->c->esize); 1271 } 1296 else { 1297 mrb->c->esize *= 2; 1298 if (mrb->c->esize <= mrb->c->eidx) { 1299 mrb->c->esize = UINT16_MAX; 1300 } 1301 } 1302 mrb->c->ensure = (struct RProc**)mrb_realloc(mrb, mrb->c->ensure, sizeof(struct RProc*)*mrb->c->esize); 1303 } 1304 /* push ensure stack */ 1272 1305 mrb->c->ensure[mrb->c->eidx++] = p; 1273 1306 mrb->c->ensure[mrb->c->eidx] = NULL; 1274 ARENA_RESTORE(mrb, ai); 1275 NEXT; 1276 } 1277 1278 CASE(OP_EPOP) { 1279 /* A A.times{ensure_pop().call} */ 1280 int a = GETARG_A(i); 1307 mrb_gc_arena_restore(mrb, ai); 1308 NEXT; 1309 } 1310 1311 CASE(OP_EPOP, B) { 1281 1312 mrb_callinfo *ci = mrb->c->ci; 1282 int n, epos = ci->epos; 1283 1284 for (n=0; n<a && mrb->c->eidx > epos; n++) { 1285 ecall(mrb, --mrb->c->eidx); 1286 ARENA_RESTORE(mrb, ai); 1287 } 1288 NEXT; 1289 } 1290 1291 CASE(OP_LOADNIL) { 1292 /* A R(A) := nil */ 1293 int a = GETARG_A(i); 1294 1295 SET_NIL_VALUE(regs[a]); 1296 NEXT; 1297 } 1298 1299 CASE(OP_SENDB) { 1300 /* A B C R(A) := call(R(A),Syms(B),R(A+1),...,R(A+C),&R(A+C+1))*/ 1301 /* fall through */ 1313 unsigned int n, epos = ci->epos; 1314 mrb_value self = regs[0]; 1315 struct RClass *target_class = ci->target_class; 1316 1317 if (mrb->c->eidx <= epos) { 1318 NEXT; 1319 } 1320 1321 if (a > (int)mrb->c->eidx - epos) 1322 a = mrb->c->eidx - epos; 1323 for (n=0; n<a; n++) { 1324 int nregs = irep->nregs; 1325 1326 proc = mrb->c->ensure[epos+n]; 1327 mrb->c->ensure[epos+n] = NULL; 1328 if (proc == NULL) continue; 1329 irep = proc->body.irep; 1330 ci = cipush(mrb); 1331 ci->mid = ci[-1].mid; 1332 ci->argc = 0; 1333 ci->proc = proc; 1334 ci->stackent = mrb->c->stack; 1335 ci->target_class = target_class; 1336 ci->pc = pc; 1337 ci->acc = nregs; 1338 mrb->c->stack += ci->acc; 1339 mrb_stack_extend(mrb, irep->nregs); 1340 regs[0] = self; 1341 pc = irep->iseq; 1342 } 1343 pool = irep->pool; 1344 syms = irep->syms; 1345 mrb->c->eidx = epos; 1346 JUMP; 1347 } 1348 1349 CASE(OP_SENDV, BB) { 1350 c = CALL_MAXARGS; 1351 goto L_SEND; 1302 1352 }; 1303 1353 1304 L_SEND: 1305 CASE(OP_SEND) { 1306 /* A B C R(A) := call(R(A),Syms(B),R(A+1),...,R(A+C)) */ 1307 int a = GETARG_A(i); 1308 int n = GETARG_C(i); 1309 struct RProc *m; 1310 struct RClass *c; 1354 CASE(OP_SENDVB, BB) { 1355 c = CALL_MAXARGS; 1356 goto L_SENDB; 1357 }; 1358 1359 CASE(OP_SEND, BBB) 1360 L_SEND: 1361 { 1362 /* push nil after arguments */ 1363 int bidx = (c == CALL_MAXARGS) ? a+2 : a+c+1; 1364 SET_NIL_VALUE(regs[bidx]); 1365 goto L_SENDB; 1366 }; 1367 L_SEND_SYM: 1368 { 1369 /* push nil after arguments */ 1370 int bidx = (c == CALL_MAXARGS) ? a+2 : a+c+1; 1371 SET_NIL_VALUE(regs[bidx]); 1372 goto L_SENDB_SYM; 1373 }; 1374 1375 CASE(OP_SENDB, BBB) 1376 L_SENDB: 1377 mid = syms[b]; 1378 L_SENDB_SYM: 1379 { 1380 int argc = (c == CALL_MAXARGS) ? -1 : c; 1381 int bidx = (argc < 0) ? a+2 : a+c+1; 1382 mrb_method_t m; 1383 struct RClass *cls; 1311 1384 mrb_callinfo *ci = mrb->c->ci; 1312 mrb_value recv, result; 1313 mrb_sym mid = syms[GETARG_B(i)]; 1314 int bidx; 1315 mrb_value blk; 1385 mrb_value recv, blk; 1386 1387 mrb_assert(bidx < irep->nregs); 1316 1388 1317 1389 recv = regs[a]; 1318 if (n == CALL_MAXARGS) { 1319 bidx = a+2; 1320 } 1321 else { 1322 bidx = a+n+1; 1323 } 1324 if (GET_OPCODE(i) != OP_SENDB) { 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; 1341 } 1342 } 1343 c = mrb_class(mrb, recv); 1344 m = mrb_method_search_vm(mrb, &c, mid); 1345 if (!m) { 1346 mrb_value sym = mrb_symbol_value(mid); 1390 blk = regs[bidx]; 1391 if (!mrb_nil_p(blk) && !mrb_proc_p(blk)) { 1392 blk = mrb_convert_type(mrb, blk, MRB_TT_PROC, "Proc", "to_proc"); 1393 /* The stack might have been reallocated during mrb_convert_type(), 1394 see #3622 */ 1395 regs[bidx] = blk; 1396 } 1397 cls = mrb_class(mrb, recv); 1398 m = mrb_method_search_vm(mrb, &cls, mid); 1399 if (MRB_METHOD_UNDEF_P(m)) { 1347 1400 mrb_sym missing = mrb_intern_lit(mrb, "method_missing"); 1348 1349 m = mrb_method_search_vm(mrb, &c, missing); 1350 if (!m) { 1351 mrb_value args; 1352 1353 if (n == CALL_MAXARGS) { 1354 args = regs[a+1]; 1355 } 1356 else { 1357 args = mrb_ary_new_from_values(mrb, n, regs+a+1); 1358 } 1359 ERR_PC_SET(mrb, pc); 1401 m = mrb_method_search_vm(mrb, &cls, missing); 1402 if (MRB_METHOD_UNDEF_P(m) || (missing == mrb->c->ci->mid && mrb_obj_eq(mrb, regs[0], recv))) { 1403 mrb_value args = (argc < 0) ? regs[a+1] : mrb_ary_new_from_values(mrb, c, regs+a+1); 1404 ERR_PC_SET(mrb); 1360 1405 mrb_method_missing(mrb, mid, recv, args); 1361 1406 } 1407 if (argc >= 0) { 1408 if (a+2 >= irep->nregs) { 1409 mrb_stack_extend(mrb, a+3); 1410 } 1411 regs[a+1] = mrb_ary_new_from_values(mrb, c, regs+a+1); 1412 regs[a+2] = blk; 1413 argc = -1; 1414 } 1415 mrb_ary_unshift(mrb, regs[a+1], mrb_symbol_value(mid)); 1362 1416 mid = missing; 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);1372 1417 } 1373 1418 … … 1375 1420 ci = cipush(mrb); 1376 1421 ci->mid = mid; 1377 ci->proc = m;1378 1422 ci->stackent = mrb->c->stack; 1379 ci->target_class = c; 1380 1381 ci->pc = pc + 1; 1423 ci->target_class = cls; 1424 ci->argc = argc; 1425 1426 ci->pc = pc; 1382 1427 ci->acc = a; 1383 1428 … … 1385 1430 mrb->c->stack += a; 1386 1431 1387 if (MRB_PROC_CFUNC_P(m)) { 1388 if (n == CALL_MAXARGS) { 1389 ci->argc = -1; 1390 ci->nregs = 3; 1432 if (MRB_METHOD_CFUNC_P(m)) { 1433 if (MRB_METHOD_PROC_P(m)) { 1434 struct RProc *p = MRB_METHOD_PROC(m); 1435 1436 ci->proc = p; 1437 recv = p->body.func(mrb, recv); 1438 } 1439 else if (MRB_METHOD_NOARG_P(m) && 1440 (argc > 0 || (argc == -1 && RARRAY_LEN(regs[1]) != 0))) { 1441 argnum_error(mrb, 0); 1442 goto L_RAISE; 1391 1443 } 1392 1444 else { 1393 ci->argc = n; 1394 ci->nregs = n + 2; 1395 } 1396 result = m->body.func(mrb, recv); 1445 recv = MRB_METHOD_FUNC(m)(mrb, recv); 1446 } 1397 1447 mrb_gc_arena_restore(mrb, ai); 1448 mrb_gc_arena_shrink(mrb, ai); 1398 1449 if (mrb->exc) goto L_RAISE; 1399 1450 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 } 1451 if (mrb_proc_p(blk)) { 1452 struct RProc *p = mrb_proc_ptr(blk); 1453 if (p && !MRB_PROC_STRICT_P(p) && MRB_PROC_ENV(p) == ci[-1].env) { 1454 p->flags |= MRB_PROC_ORPHAN; 1407 1455 } 1408 1456 } … … 1410 1458 if (ci->acc == CI_ACC_RESUMED) { 1411 1459 mrb->jmp = prev_jmp; 1412 return re sult;1460 return recv; 1413 1461 } 1414 1462 else { … … 1420 1468 } 1421 1469 } 1422 mrb->c->stack[0] = re sult;1470 mrb->c->stack[0] = recv; 1423 1471 /* pop stackpos */ 1424 1472 mrb->c->stack = ci->stackent; … … 1429 1477 else { 1430 1478 /* setup environment for calling method */ 1431 proc = mrb->c->ci->proc = m;1432 irep = m->body.irep;1479 proc = ci->proc = MRB_METHOD_PROC(m); 1480 irep = proc->body.irep; 1433 1481 pool = irep->pool; 1434 1482 syms = irep->syms; 1435 ci->nregs = irep->nregs; 1436 if (n == CALL_MAXARGS) { 1437 ci->argc = -1; 1438 stack_extend(mrb, (irep->nregs < 3) ? 3 : irep->nregs); 1439 } 1440 else { 1441 ci->argc = n; 1442 stack_extend(mrb, irep->nregs); 1443 } 1483 mrb_stack_extend(mrb, (argc < 0 && irep->nregs < 3) ? 3 : irep->nregs); 1444 1484 pc = irep->iseq; 1445 1485 JUMP; … … 1447 1487 } 1448 1488 1449 CASE(OP_FSEND) { 1450 /* A B C R(A) := fcall(R(A),Syms(B),R(A+1),... ,R(A+C-1)) */ 1451 /* not implemented yet */ 1452 NEXT; 1453 } 1454 1455 CASE(OP_CALL) { 1456 /* A R(A) := self.call(frame.argc, frame.argv) */ 1489 CASE(OP_CALL, Z) { 1457 1490 mrb_callinfo *ci; 1458 1491 mrb_value recv = mrb->c->stack[0]; … … 1461 1494 /* replace callinfo */ 1462 1495 ci = mrb->c->ci; 1463 ci->target_class = m->target_class;1496 ci->target_class = MRB_PROC_TARGET_CLASS(m); 1464 1497 ci->proc = m; 1465 if (m->env) { 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; 1475 if (!m->env->stack) { 1476 m->env->stack = mrb->c->stack; 1498 if (MRB_PROC_ENV_P(m)) { 1499 struct REnv *e = MRB_PROC_ENV(m); 1500 1501 ci->mid = e->mid; 1502 if (!e->stack) { 1503 e->stack = mrb->c->stack; 1477 1504 } 1478 1505 } … … 1480 1507 /* prepare stack */ 1481 1508 if (MRB_PROC_CFUNC_P(m)) { 1482 recv = m->body.func(mrb, recv);1509 recv = MRB_PROC_CFUNC(m)(mrb, recv); 1483 1510 mrb_gc_arena_restore(mrb, ai); 1511 mrb_gc_arena_shrink(mrb, ai); 1484 1512 if (mrb->exc) goto L_RAISE; 1485 1513 /* pop stackpos */ … … 1500 1528 if (!irep) { 1501 1529 mrb->c->stack[0] = mrb_nil_value(); 1502 goto L_RETURN; 1530 a = 0; 1531 c = OP_R_NORMAL; 1532 goto L_OP_RETURN_BODY; 1503 1533 } 1504 1534 pool = irep->pool; 1505 1535 syms = irep->syms; 1506 ci->nregs = irep->nregs; 1507 stack_extend(mrb, irep->nregs); 1536 mrb_stack_extend(mrb, irep->nregs); 1508 1537 if (ci->argc < 0) { 1509 1538 if (irep->nregs > 3) { … … 1514 1543 stack_clear(regs+ci->argc+2, irep->nregs-ci->argc-2); 1515 1544 } 1516 if ( m->env) {1517 regs[0] = m->env->stack[0];1545 if (MRB_PROC_ENV_P(m)) { 1546 regs[0] = MRB_PROC_ENV(m)->stack[0]; 1518 1547 } 1519 1548 pc = irep->iseq; … … 1522 1551 } 1523 1552 1524 CASE(OP_SUPER) { 1525 /* A C R(A) := super(R(A+1),... ,R(A+C+1)) */ 1526 mrb_value recv; 1553 CASE(OP_SUPER, BB) { 1554 int argc = (b == CALL_MAXARGS) ? -1 : b; 1555 int bidx = (argc < 0) ? a+2 : a+b+1; 1556 mrb_method_t m; 1557 struct RClass *cls; 1527 1558 mrb_callinfo *ci = mrb->c->ci; 1528 struct RProc *m;1529 struct R Class *c;1559 mrb_value recv, blk; 1560 struct RProc *p = ci->proc; 1530 1561 mrb_sym mid = ci->mid; 1531 int a = GETARG_A(i);1532 int n = GETARG_C(i); 1533 mrb_value blk;1534 int bidx;1535 1536 if (mid == 0 || !ci->target_class) {1537 mrb_value exc; 1538 1539 exc = mrb_exc_new_str_lit(mrb, E_NOMETHOD_ERROR, "super called outside of method");1562 struct RClass* target_class = MRB_PROC_TARGET_CLASS(p); 1563 1564 if (MRB_PROC_ENV_P(p) && p->e.env->mid && p->e.env->mid != mid) { /* alias support */ 1565 mid = p->e.env->mid; /* restore old mid */ 1566 } 1567 mrb_assert(bidx < irep->nregs); 1568 1569 if (mid == 0 || !target_class) { 1570 mrb_value exc = mrb_exc_new_str_lit(mrb, E_NOMETHOD_ERROR, "super called outside of method"); 1540 1571 mrb_exc_set(mrb, exc); 1541 1572 goto L_RAISE; 1542 1573 } 1574 if (target_class->tt == MRB_TT_MODULE) { 1575 target_class = ci->target_class; 1576 if (target_class->tt != MRB_TT_ICLASS) { 1577 mrb_value exc = mrb_exc_new_str_lit(mrb, E_RUNTIME_ERROR, "superclass info lost [mruby limitations]"); 1578 mrb_exc_set(mrb, exc); 1579 goto L_RAISE; 1580 } 1581 } 1543 1582 recv = regs[0]; 1544 c = mrb->c->ci->target_class->super; 1545 m = mrb_method_search_vm(mrb, &c, mid); 1546 if (!m) { 1583 if (!mrb_obj_is_kind_of(mrb, recv, target_class)) { 1584 mrb_value exc = mrb_exc_new_str_lit(mrb, E_TYPE_ERROR, 1585 "self has wrong type to call super in this context"); 1586 mrb_exc_set(mrb, exc); 1587 goto L_RAISE; 1588 } 1589 blk = regs[bidx]; 1590 if (!mrb_nil_p(blk) && !mrb_proc_p(blk)) { 1591 blk = mrb_convert_type(mrb, blk, MRB_TT_PROC, "Proc", "to_proc"); 1592 /* The stack or ci stack might have been reallocated during 1593 mrb_convert_type(), see #3622 and #3784 */ 1594 regs[bidx] = blk; 1595 ci = mrb->c->ci; 1596 } 1597 cls = target_class->super; 1598 m = mrb_method_search_vm(mrb, &cls, mid); 1599 if (MRB_METHOD_UNDEF_P(m)) { 1547 1600 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); 1601 1602 if (mid != missing) { 1603 cls = mrb_class(mrb, recv); 1604 } 1605 m = mrb_method_search_vm(mrb, &cls, missing); 1606 if (MRB_METHOD_UNDEF_P(m)) { 1607 mrb_value args = (argc < 0) ? regs[a+1] : mrb_ary_new_from_values(mrb, b, regs+a+1); 1608 ERR_PC_SET(mrb); 1559 1609 mrb_method_missing(mrb, mid, recv, args); 1560 1610 } 1561 1611 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 } 1566 if (n == CALL_MAXARGS) { 1567 mrb_ary_unshift(mrb, regs[a+1], mrb_symbol_value(ci->mid)); 1568 } 1569 else { 1570 value_move(regs+a+2, regs+a+1, ++n); 1571 SET_SYM_VALUE(regs[a+1], ci->mid); 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; 1612 if (argc >= 0) { 1613 if (a+2 >= irep->nregs) { 1614 mrb_stack_extend(mrb, a+3); 1615 } 1616 regs[a+1] = mrb_ary_new_from_values(mrb, b, regs+a+1); 1617 regs[a+2] = blk; 1618 argc = -1; 1619 } 1620 mrb_ary_unshift(mrb, regs[a+1], mrb_symbol_value(ci->mid)); 1591 1621 } 1592 1622 … … 1594 1624 ci = cipush(mrb); 1595 1625 ci->mid = mid; 1596 ci->proc = m;1597 1626 ci->stackent = mrb->c->stack; 1598 ci->target_class = c; 1599 ci->pc = pc + 1; 1600 if (n == CALL_MAXARGS) { 1601 ci->argc = -1; 1602 } 1603 else { 1604 ci->argc = n; 1605 } 1627 ci->target_class = cls; 1628 ci->pc = pc; 1629 ci->argc = argc; 1606 1630 1607 1631 /* prepare stack */ … … 1609 1633 mrb->c->stack[0] = recv; 1610 1634 1611 if (MRB_ PROC_CFUNC_P(m)) {1635 if (MRB_METHOD_CFUNC_P(m)) { 1612 1636 mrb_value v; 1613 1637 1614 if (n == CALL_MAXARGS) { 1615 ci->nregs = 3; 1616 } 1617 else { 1618 ci->nregs = n + 2; 1619 } 1620 v = m->body.func(mrb, recv); 1638 if (MRB_METHOD_PROC_P(m)) { 1639 ci->proc = MRB_METHOD_PROC(m); 1640 } 1641 v = MRB_METHOD_CFUNC(m)(mrb, recv); 1621 1642 mrb_gc_arena_restore(mrb, ai); 1622 1643 if (mrb->exc) goto L_RAISE; … … 1647 1668 1648 1669 /* setup environment for calling method */ 1649 ci->proc = m;1650 irep = m->body.irep;1670 proc = ci->proc = MRB_METHOD_PROC(m); 1671 irep = proc->body.irep; 1651 1672 pool = irep->pool; 1652 1673 syms = irep->syms; 1653 ci->nregs = irep->nregs; 1654 if (n == CALL_MAXARGS) { 1655 stack_extend(mrb, (irep->nregs < 3) ? 3 : irep->nregs); 1656 } 1657 else { 1658 stack_extend(mrb, irep->nregs); 1659 } 1674 mrb_stack_extend(mrb, (argc < 0 && irep->nregs < 3) ? 3 : irep->nregs); 1660 1675 pc = irep->iseq; 1661 1676 JUMP; … … 1663 1678 } 1664 1679 1665 CASE(OP_ARGARY) { 1666 /* A Bx R(A) := argument array (16=6:1:5:4) */ 1667 int a = GETARG_A(i); 1668 int bx = GETARG_Bx(i); 1669 int m1 = (bx>>10)&0x3f; 1670 int r = (bx>>9)&0x1; 1671 int m2 = (bx>>4)&0x1f; 1672 int lv = (bx>>0)&0xf; 1680 CASE(OP_ARGARY, BS) { 1681 int m1 = (b>>11)&0x3f; 1682 int r = (b>>10)&0x1; 1683 int m2 = (b>>5)&0x1f; 1684 int kd = (b>>4)&0x1; 1685 int lv = (b>>0)&0xf; 1673 1686 mrb_value *stack; 1674 1687 … … 1685 1698 struct REnv *e = uvenv(mrb, lv-1); 1686 1699 if (!e) goto L_NOSUPER; 1700 if (MRB_ENV_STACK_LEN(e) <= m1+r+m2+kd+1) 1701 goto L_NOSUPER; 1687 1702 stack = e->stack + 1; 1688 1703 } 1689 1704 if (r == 0) { 1690 regs[a] = mrb_ary_new_from_values(mrb, m1+m2 , stack);1705 regs[a] = mrb_ary_new_from_values(mrb, m1+m2+kd, stack); 1691 1706 } 1692 1707 else { … … 1698 1713 struct RArray *ary = mrb_ary_ptr(stack[m1]); 1699 1714 1700 pp = ary->ptr;1701 len = ary->len;1702 } 1703 regs[a] = mrb_ary_new_capa(mrb, m1+len+m2 );1715 pp = ARY_PTR(ary); 1716 len = (int)ARY_LEN(ary); 1717 } 1718 regs[a] = mrb_ary_new_capa(mrb, m1+len+m2+kd); 1704 1719 rest = mrb_ary_ptr(regs[a]); 1705 1720 if (m1 > 0) { 1706 stack_copy( rest->ptr, stack, m1);1721 stack_copy(ARY_PTR(rest), stack, m1); 1707 1722 } 1708 1723 if (len > 0) { 1709 stack_copy( rest->ptr+m1, pp, len);1724 stack_copy(ARY_PTR(rest)+m1, pp, len); 1710 1725 } 1711 1726 if (m2 > 0) { 1712 stack_copy(rest->ptr+m1+len, stack+m1+1, m2); 1713 } 1714 rest->len = m1+len+m2; 1727 stack_copy(ARY_PTR(rest)+m1+len, stack+m1+1, m2); 1728 } 1729 if (kd) { 1730 stack_copy(ARY_PTR(rest)+m1+len+m2, stack+m1+m2+1, kd); 1731 } 1732 ARY_SET_LEN(rest, m1+len+m2+kd); 1715 1733 } 1716 1734 regs[a+1] = stack[m1+r+m2]; 1717 ARENA_RESTORE(mrb, ai); 1718 NEXT; 1719 } 1720 1721 CASE(OP_ENTER) { 1722 /* Ax arg setup according to flags (23=5:5:1:5:5:1:1) */ 1723 /* number of optional arguments times OP_JMP should follow */ 1724 mrb_aspec ax = GETARG_Ax(i); 1725 int m1 = MRB_ASPEC_REQ(ax); 1726 int o = MRB_ASPEC_OPT(ax); 1727 int r = MRB_ASPEC_REST(ax); 1728 int m2 = MRB_ASPEC_POST(ax); 1735 mrb_gc_arena_restore(mrb, ai); 1736 NEXT; 1737 } 1738 1739 CASE(OP_ENTER, W) { 1740 int m1 = MRB_ASPEC_REQ(a); 1741 int o = MRB_ASPEC_OPT(a); 1742 int r = MRB_ASPEC_REST(a); 1743 int m2 = MRB_ASPEC_POST(a); 1744 int kd = (MRB_ASPEC_KEY(a) > 0 || MRB_ASPEC_KDICT(a))? 1 : 0; 1729 1745 /* unused 1730 int k = MRB_ASPEC_KEY(ax); 1731 int kd = MRB_ASPEC_KDICT(ax); 1732 int b = MRB_ASPEC_BLOCK(ax); 1746 int b = MRB_ASPEC_BLOCK(a); 1733 1747 */ 1734 1748 int argc = mrb->c->ci->argc; 1735 1749 mrb_value *argv = regs+1; 1736 mrb_value *argv0 = argv; 1737 int len = m1 + o + r + m2; 1750 mrb_value * const argv0 = argv; 1751 int const len = m1 + o + r + m2; 1752 int const blk_pos = len + kd + 1; 1738 1753 mrb_value *blk = &argv[argc < 0 ? 1 : argc]; 1739 1754 mrb_value kdict; 1755 int kargs = kd; 1756 1757 /* arguments is passed with Array */ 1740 1758 if (argc < 0) { 1741 1759 struct RArray *ary = mrb_ary_ptr(regs[1]); 1742 argv = ary->ptr;1743 argc = ary->len;1760 argv = ARY_PTR(ary); 1761 argc = (int)ARY_LEN(ary); 1744 1762 mrb_gc_protect(mrb, regs[1]); 1745 1763 } 1764 1765 /* strict argument check */ 1746 1766 if (mrb->c->ci->proc && MRB_PROC_STRICT_P(mrb->c->ci->proc)) { 1747 if (argc >= 0) { 1748 if (argc < m1 + m2 || (r == 0 && argc > len)) { 1767 if (argc < m1 + m2 || (r == 0 && argc > len + kd)) { 1768 argnum_error(mrb, m1+m2); 1769 goto L_RAISE; 1770 } 1771 } 1772 /* extract first argument array to arguments */ 1773 else if (len > 1 && argc == 1 && mrb_array_p(argv[0])) { 1774 mrb_gc_protect(mrb, argv[0]); 1775 argc = (int)RARRAY_LEN(argv[0]); 1776 argv = RARRAY_PTR(argv[0]); 1777 } 1778 1779 if (kd) { 1780 /* check last arguments is hash if method takes keyword arguments */ 1781 if (argc == m1+m2) { 1782 kdict = mrb_hash_new(mrb); 1783 kargs = 0; 1784 } 1785 else { 1786 if (argv && argc > 0 && mrb_hash_p(argv[argc-1])) { 1787 kdict = argv[argc-1]; 1788 mrb_hash_check_kdict(mrb, kdict); 1789 } 1790 else if (r || argc <= m1+m2+o 1791 || !(mrb->c->ci->proc && MRB_PROC_STRICT_P(mrb->c->ci->proc))) { 1792 kdict = mrb_hash_new(mrb); 1793 kargs = 0; 1794 } 1795 else { 1749 1796 argnum_error(mrb, m1+m2); 1750 1797 goto L_RAISE; 1751 1798 } 1752 }1753 }1754 else if (len > 1 && argc == 1 && mrb_array_p(argv[0])) {1755 mrb_gc_protect(mrb, argv[0]);1756 argc = mrb_ary_ptr(argv[0])->len;1757 argv = mrb_ary_ptr(argv[0])->ptr; 1758 }1759 if (argc < len) {1799 if (MRB_ASPEC_KEY(a) > 0) { 1800 kdict = mrb_hash_dup(mrb, kdict); 1801 } 1802 } 1803 } 1804 1805 /* no rest arguments */ 1806 if (argc-kargs < len) { 1760 1807 int mlen = m2; 1761 1808 if (argc < m1+m2) { 1762 if (m1 < argc) 1763 mlen = argc - m1; 1764 else 1765 mlen = 0; 1766 } 1767 regs[len+1] = *blk; /* move block */ 1768 SET_NIL_VALUE(regs[argc+1]); 1809 mlen = m1 < argc ? argc - m1 : 0; 1810 } 1811 regs[blk_pos] = *blk; /* move block */ 1812 if (kd) regs[len + 1] = kdict; 1813 1814 /* copy mandatory and optional arguments */ 1769 1815 if (argv0 != argv) { 1770 1816 value_move(®s[1], argv, argc-mlen); /* m1 + o */ … … 1773 1819 stack_clear(®s[argc+1], m1-argc); 1774 1820 } 1821 /* copy post mandatory arguments */ 1775 1822 if (mlen) { 1776 1823 value_move(®s[len-m2+1], &argv[argc-mlen], mlen); … … 1779 1826 stack_clear(®s[len-m2+mlen+1], m2-mlen); 1780 1827 } 1828 /* initalize rest arguments with empty Array */ 1781 1829 if (r) { 1782 1830 regs[m1+o+1] = mrb_ary_new_capa(mrb, 0); 1783 1831 } 1784 if (o == 0 || argc < m1+m2) pc++;1785 else1786 pc += argc - m1 - m2 + 1;1832 /* skip initailizer of passed arguments */ 1833 if (o > 0 && argc-kargs > m1+m2) 1834 pc += (argc - kargs - m1 - m2)*3; 1787 1835 } 1788 1836 else { 1789 1837 int rnum = 0; 1790 1838 if (argv0 != argv) { 1791 regs[len+1] = *blk; /* move block */ 1839 regs[blk_pos] = *blk; /* move block */ 1840 if (kd) regs[len + 1] = kdict; 1792 1841 value_move(®s[1], argv, m1+o); 1793 1842 } 1794 1843 if (r) { 1795 rnum = argc-m1-o-m2; 1796 regs[m1+o+1] = mrb_ary_new_from_values(mrb, rnum, argv+m1+o); 1844 mrb_value ary; 1845 1846 rnum = argc-m1-o-m2-kargs; 1847 ary = mrb_ary_new_from_values(mrb, rnum, argv+m1+o); 1848 regs[m1+o+1] = ary; 1797 1849 } 1798 1850 if (m2) { … … 1802 1854 } 1803 1855 if (argv0 == argv) { 1804 regs[len+1] = *blk; /* move block */ 1805 } 1806 pc += o + 1; 1807 } 1808 mrb->c->ci->argc = len; 1856 regs[blk_pos] = *blk; /* move block */ 1857 if (kd) regs[len + 1] = kdict; 1858 } 1859 pc += o*3; 1860 } 1861 1862 /* format arguments for generated code */ 1863 mrb->c->ci->argc = len + kd; 1864 1809 1865 /* clear local (but non-argument) variables */ 1810 if (irep->nlocals- len-2> 0) {1811 stack_clear(®s[ len+2], irep->nlocals-len-2);1866 if (irep->nlocals-blk_pos-1 > 0) { 1867 stack_clear(®s[blk_pos+1], irep->nlocals-blk_pos-1); 1812 1868 } 1813 1869 JUMP; 1814 1870 } 1815 1871 1816 CASE(OP_KARG) { 1817 /* A B C R(A) := kdict[Syms(B)]; if C kdict.rm(Syms(B)) */ 1818 /* if C == 2; raise unless kdict.empty? */ 1819 /* OP_JMP should follow to skip init code */ 1820 NEXT; 1821 } 1822 1823 CASE(OP_KDICT) { 1824 /* A C R(A) := kdict */ 1825 NEXT; 1826 } 1827 1872 CASE(OP_KARG, BB) { 1873 mrb_value k = mrb_symbol_value(syms[b]); 1874 mrb_value kdict = regs[mrb->c->ci->argc]; 1875 1876 if (!mrb_hash_p(kdict) || !mrb_hash_key_p(mrb, kdict, k)) { 1877 mrb_value str = mrb_format(mrb, "missing keyword: %v", k); 1878 mrb_exc_set(mrb, mrb_exc_new_str(mrb, E_ARGUMENT_ERROR, str)); 1879 goto L_RAISE; 1880 } 1881 regs[a] = mrb_hash_get(mrb, kdict, k); 1882 mrb_hash_delete_key(mrb, kdict, k); 1883 NEXT; 1884 } 1885 1886 CASE(OP_KEY_P, BB) { 1887 mrb_value k = mrb_symbol_value(syms[b]); 1888 mrb_value kdict = regs[mrb->c->ci->argc]; 1889 mrb_bool key_p = FALSE; 1890 1891 if (mrb_hash_p(kdict)) { 1892 key_p = mrb_hash_key_p(mrb, kdict, k); 1893 } 1894 regs[a] = mrb_bool_value(key_p); 1895 NEXT; 1896 } 1897 1898 CASE(OP_KEYEND, Z) { 1899 mrb_value kdict = regs[mrb->c->ci->argc]; 1900 1901 if (mrb_hash_p(kdict) && !mrb_hash_empty_p(mrb, kdict)) { 1902 mrb_value keys = mrb_hash_keys(mrb, kdict); 1903 mrb_value key1 = RARRAY_PTR(keys)[0]; 1904 mrb_value str = mrb_format(mrb, "unknown keyword: %v", key1); 1905 mrb_exc_set(mrb, mrb_exc_new_str(mrb, E_ARGUMENT_ERROR, str)); 1906 goto L_RAISE; 1907 } 1908 NEXT; 1909 } 1910 1911 CASE(OP_BREAK, B) { 1912 c = OP_R_BREAK; 1913 goto L_RETURN; 1914 } 1915 CASE(OP_RETURN_BLK, B) { 1916 c = OP_R_RETURN; 1917 goto L_RETURN; 1918 } 1919 CASE(OP_RETURN, B) 1920 c = OP_R_NORMAL; 1828 1921 L_RETURN: 1829 i = MKOP_AB(OP_RETURN, GETARG_A(i), OP_R_NORMAL); 1830 /* fall through */ 1831 CASE(OP_RETURN) { 1832 /* A B return R(A) (B=normal,in-block return/break) */ 1833 mrb_callinfo *ci; 1922 { 1923 mrb_callinfo *ci; 1924 1925 #define ecall_adjust() do {\ 1926 ptrdiff_t cioff = ci - mrb->c->cibase;\ 1927 ecall(mrb);\ 1928 ci = mrb->c->cibase + cioff;\ 1929 } while (0) 1834 1930 1835 1931 ci = mrb->c->ci; … … 1843 1939 blk = regs[ci->argc+1]; 1844 1940 } 1845 if (mrb_ type(blk) == MRB_TT_PROC) {1941 if (mrb_proc_p(blk)) { 1846 1942 struct RProc *p = mrb_proc_ptr(blk); 1847 1943 1848 if (!MRB_PROC_STRICT_P(p roc) &&1849 ci > mrb->c->cibase && p->env== ci[-1].env) {1944 if (!MRB_PROC_STRICT_P(p) && 1945 ci > mrb->c->cibase && MRB_PROC_ENV(p) == ci[-1].env) { 1850 1946 p->flags |= MRB_PROC_ORPHAN; 1851 1947 } … … 1855 1951 if (mrb->exc) { 1856 1952 mrb_callinfo *ci0; 1857 mrb_value *stk;1858 1953 1859 1954 L_RAISE: … … 1863 1958 goto L_RESCUE; 1864 1959 } 1865 stk = mrb->c->stack;1866 1960 while (ci[0].ridx == ci[-1].ridx) { 1867 1961 cipop(mrb); … … 1873 1967 ci = mrb->c->ci; 1874 1968 if (ci == mrb->c->cibase) { 1875 mrb->c->stack = stk;1876 1969 if (ci->ridx == 0) { 1877 1970 L_FTOP: /* fiber top */ … … 1883 1976 struct mrb_context *c = mrb->c; 1884 1977 1885 if (c->fib) {1886 mrb_write_barrier(mrb, (struct RBasic*)c->fib);1978 while (c->eidx > ci->epos) { 1979 ecall_adjust(); 1887 1980 } 1981 c->status = MRB_FIBER_TERMINATED; 1888 1982 mrb->c = c->prev; 1889 1983 c->prev = NULL; … … 1896 1990 if (ci[0].ridx == ci[-1].ridx) { 1897 1991 while (mrb->c->eidx > ci->epos) { 1898 ecall(mrb, --mrb->c->eidx); 1899 ci = mrb->c->ci; 1992 ecall_adjust(); 1900 1993 } 1901 1994 } … … 1907 2000 pool = irep->pool; 1908 2001 syms = irep->syms; 1909 if (ci !=ci0) {2002 if (ci < ci0) { 1910 2003 mrb->c->stack = ci[1].stackent; 1911 2004 } 1912 stack_extend(mrb, irep->nregs);1913 pc = mrb->c->rescue[--ci->ridx];2005 mrb_stack_extend(mrb, irep->nregs); 2006 pc = irep->iseq+mrb->c->rescue[--ci->ridx]; 1914 2007 } 1915 2008 else { 1916 2009 int acc; 1917 2010 mrb_value v; 1918 1919 v = regs[GETARG_A(i)]; 2011 struct RProc *dst; 2012 2013 ci = mrb->c->ci; 2014 v = regs[a]; 1920 2015 mrb_gc_protect(mrb, v); 1921 switch ( GETARG_B(i)) {2016 switch (c) { 1922 2017 case OP_R_RETURN: 1923 2018 /* Fall through to OP_R_NORMAL otherwise */ 1924 if (ci->acc >=0 && proc->env && !MRB_PROC_STRICT_P(proc)) { 1925 struct REnv *e = top_env(mrb, proc); 1926 mrb_callinfo *ce; 1927 1928 if (!MRB_ENV_STACK_SHARED_P(e) || e->cxt.c != mrb->c) { 1929 localjump_error(mrb, LOCALJUMP_ERROR_RETURN); 1930 goto L_RAISE; 2019 if (ci->acc >=0 && MRB_PROC_ENV_P(proc) && !MRB_PROC_STRICT_P(proc)) { 2020 mrb_callinfo *cibase = mrb->c->cibase; 2021 dst = top_proc(mrb, proc); 2022 2023 if (MRB_PROC_ENV_P(dst)) { 2024 struct REnv *e = MRB_PROC_ENV(dst); 2025 2026 if (!MRB_ENV_STACK_SHARED_P(e) || (e->cxt && e->cxt != mrb->c)) { 2027 localjump_error(mrb, LOCALJUMP_ERROR_RETURN); 2028 goto L_RAISE; 2029 } 1931 2030 } 1932 1933 ce = mrb->c->cibase + e->cioff; 1934 while (ci >= ce) { 1935 if (ci->env) { 1936 mrb_env_unshare(mrb, ci->env); 1937 } 2031 while (cibase <= ci && ci->proc != dst) { 1938 2032 if (ci->acc < 0) { 1939 2033 localjump_error(mrb, LOCALJUMP_ERROR_RETURN); … … 1942 2036 ci--; 1943 2037 } 1944 if (c e == mrb->c->cibase) {2038 if (ci <= cibase) { 1945 2039 localjump_error(mrb, LOCALJUMP_ERROR_RETURN); 1946 2040 goto L_RAISE; 1947 2041 } 1948 mrb->c->stack = mrb->c->ci->stackent;1949 mrb->c->ci = ce;1950 2042 break; 1951 2043 } 2044 /* fallthrough */ 1952 2045 case OP_R_NORMAL: 1953 2046 NORMAL_RETURN: 1954 2047 if (ci == mrb->c->cibase) { 1955 if (!mrb->c->prev) { /* toplevel return */ 1956 localjump_error(mrb, LOCALJUMP_ERROR_RETURN); 1957 goto L_RAISE; 2048 struct mrb_context *c = mrb->c; 2049 2050 if (!c->prev) { /* toplevel return */ 2051 regs[irep->nlocals] = v; 2052 goto L_STOP; 1958 2053 } 1959 if ( mrb->c->prev->ci == mrb->c->prev->cibase) {2054 if (c->prev->ci == c->prev->cibase) { 1960 2055 mrb_value exc = mrb_exc_new_str_lit(mrb, E_FIBER_ERROR, "double resume"); 1961 2056 mrb_exc_set(mrb, exc); 1962 2057 goto L_RAISE; 1963 2058 } 1964 while ( mrb->c->eidx > 0) {1965 ecall(mrb , --mrb->c->eidx);2059 while (c->eidx > 0) { 2060 ecall(mrb); 1966 2061 } 1967 2062 /* automatic yield at the end */ 1968 mrb->c->status = MRB_FIBER_TERMINATED; 1969 mrb->c = mrb->c->prev; 2063 c->status = MRB_FIBER_TERMINATED; 2064 mrb->c = c->prev; 2065 c->prev = NULL; 1970 2066 mrb->c->status = MRB_FIBER_RUNNING; 1971 }1972 ci = mrb->c->ci;2067 ci = mrb->c->ci; 2068 } 1973 2069 break; 1974 2070 case OP_R_BREAK: 1975 2071 if (MRB_PROC_STRICT_P(proc)) goto NORMAL_RETURN; 1976 if (MRB_PROC_ORPHAN_P(proc)) { 2072 if (MRB_PROC_ORPHAN_P(proc)) { 1977 2073 mrb_value exc; 1978 2074 … … 1983 2079 goto L_RAISE; 1984 2080 } 1985 if (! proc->env || !MRB_ENV_STACK_SHARED_P(proc->env)) {2081 if (!MRB_PROC_ENV_P(proc) || !MRB_ENV_STACK_SHARED_P(MRB_PROC_ENV(proc))) { 1986 2082 goto L_BREAK_ERROR; 1987 2083 } 2084 else { 2085 struct REnv *e = MRB_PROC_ENV(proc); 2086 2087 if (e->cxt != mrb->c) { 2088 goto L_BREAK_ERROR; 2089 } 2090 } 2091 while (mrb->c->eidx > mrb->c->ci->epos) { 2092 ecall_adjust(); 2093 } 1988 2094 /* break from fiber block */ 1989 if ( mrb->c->ci == mrb->c->cibase && mrb->c->ci->pc) {2095 if (ci == mrb->c->cibase && ci->pc) { 1990 2096 struct mrb_context *c = mrb->c; 1991 2097 1992 while (mrb->c->eidx > 0) {1993 ecall(mrb, --mrb->c->eidx);1994 }1995 2098 mrb->c = c->prev; 1996 2099 c->prev = NULL; … … 1998 2101 } 1999 2102 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); 2103 mrb_gc_arena_restore(mrb, ai); 2004 2104 mrb->c->vmexec = FALSE; 2005 2105 mrb->exc = (struct RObject*)break_new(mrb, proc, v); … … 2009 2109 if (FALSE) { 2010 2110 L_BREAK: 2011 v = ((struct RBreak*)mrb->exc)->val;2012 proc = ((struct RBreak*)mrb->exc)->proc;2111 v = mrb_break_value_get((struct RBreak*)mrb->exc); 2112 proc = mrb_break_proc_get((struct RBreak*)mrb->exc); 2013 2113 mrb->exc = NULL; 2014 2114 ci = mrb->c->ci; 2015 2115 } 2016 2116 mrb->c->stack = ci->stackent; 2017 mrb->c->ci = mrb->c->cibase + proc->env->cioff + 1; 2018 while (ci > mrb->c->ci) { 2019 if (ci->env) { 2020 mrb_env_unshare(mrb, ci->env); 2021 } 2117 proc = proc->upper; 2118 while (mrb->c->cibase < ci && ci[-1].proc != proc) { 2022 2119 if (ci[-1].acc == CI_ACC_SKIP) { 2023 mrb->c->ci = ci; 2120 while (ci < mrb->c->ci) { 2121 cipop(mrb); 2122 } 2024 2123 goto L_BREAK_ERROR; 2025 2124 } 2026 2125 ci--; 2126 } 2127 if (ci == mrb->c->cibase) { 2128 goto L_BREAK_ERROR; 2027 2129 } 2028 2130 break; … … 2031 2133 break; 2032 2134 } 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); 2135 while (ci < mrb->c->ci) { 2136 cipop(mrb); 2137 } 2138 ci[0].ridx = ci[-1].ridx; 2139 while (mrb->c->eidx > ci->epos) { 2140 ecall_adjust(); 2141 } 2142 if (mrb->c->vmexec && !ci->target_class) { 2143 mrb_gc_arena_restore(mrb, ai); 2038 2144 mrb->c->vmexec = FALSE; 2039 2145 mrb->jmp = prev_jmp; 2040 2146 return v; 2041 2147 } 2042 ci = mrb->c->ci;2043 2148 acc = ci->acc; 2044 2149 mrb->c->stack = ci->stackent; 2045 2150 cipop(mrb); 2046 2151 if (acc == CI_ACC_SKIP || acc == CI_ACC_DIRECT) { 2047 ARENA_RESTORE(mrb, ai);2152 mrb_gc_arena_restore(mrb, ai); 2048 2153 mrb->jmp = prev_jmp; 2049 2154 return v; 2050 2155 } 2051 2156 pc = ci->pc; 2052 DEBUG(fprintf(stderr, "from :%s\n", mrb_sym2name(mrb, ci->mid))); 2157 ci = mrb->c->ci; 2158 DEBUG(fprintf(stderr, "from :%s\n", mrb_sym_name(mrb, ci->mid))); 2053 2159 proc = mrb->c->ci->proc; 2054 2160 irep = proc->body.irep; … … 2057 2163 2058 2164 regs[acc] = v; 2059 ARENA_RESTORE(mrb, ai);2165 mrb_gc_arena_restore(mrb, ai); 2060 2166 } 2061 2167 JUMP; 2062 2168 } 2063 2169 2064 CASE(OP_TAILCALL) { 2065 /* A B C return call(R(A),Syms(B),R(A+1),... ,R(A+C+1)) */ 2066 int a = GETARG_A(i); 2067 int n = GETARG_C(i); 2068 struct RProc *m; 2069 struct RClass *c; 2070 mrb_callinfo *ci; 2071 mrb_value recv; 2072 mrb_sym mid = syms[GETARG_B(i)]; 2073 2074 recv = regs[a]; 2075 c = mrb_class(mrb, recv); 2076 m = mrb_method_search_vm(mrb, &c, mid); 2077 if (!m) { 2078 mrb_value sym = mrb_symbol_value(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; 2094 if (n == CALL_MAXARGS) { 2095 mrb_ary_unshift(mrb, regs[a+1], sym); 2096 } 2097 else { 2098 value_move(regs+a+2, regs+a+1, ++n); 2099 regs[a+1] = sym; 2100 } 2101 } 2102 2103 /* replace callinfo */ 2104 ci = mrb->c->ci; 2105 ci->mid = mid; 2106 ci->target_class = c; 2107 if (n == CALL_MAXARGS) { 2108 ci->argc = -1; 2109 } 2110 else { 2111 ci->argc = n; 2112 } 2113 2114 /* move stack */ 2115 value_move(mrb->c->stack, ®s[a], ci->argc+1); 2116 2117 if (MRB_PROC_CFUNC_P(m)) { 2118 mrb_value v = m->body.func(mrb, recv); 2119 mrb->c->stack[0] = v; 2120 mrb_gc_arena_restore(mrb, ai); 2121 goto L_RETURN; 2122 } 2123 else { 2124 /* setup environment for calling method */ 2125 irep = m->body.irep; 2126 pool = irep->pool; 2127 syms = irep->syms; 2128 if (ci->argc < 0) { 2129 stack_extend(mrb, (irep->nregs < 3) ? 3 : irep->nregs); 2130 } 2131 else { 2132 stack_extend(mrb, irep->nregs); 2133 } 2134 pc = irep->iseq; 2135 } 2136 JUMP; 2137 } 2138 2139 CASE(OP_BLKPUSH) { 2140 /* A Bx R(A) := block (16=6:1:5:4) */ 2141 int a = GETARG_A(i); 2142 int bx = GETARG_Bx(i); 2143 int m1 = (bx>>10)&0x3f; 2144 int r = (bx>>9)&0x1; 2145 int m2 = (bx>>4)&0x1f; 2146 int lv = (bx>>0)&0xf; 2170 CASE(OP_BLKPUSH, BS) { 2171 int m1 = (b>>11)&0x3f; 2172 int r = (b>>10)&0x1; 2173 int m2 = (b>>5)&0x1f; 2174 int kd = (b>>4)&0x1; 2175 int lv = (b>>0)&0xf; 2147 2176 mrb_value *stack; 2148 2177 … … 2150 2179 else { 2151 2180 struct REnv *e = uvenv(mrb, lv-1); 2152 if (!e || e->cioff == 0||2153 (!MRB_ENV_STACK_SHARED_P(e) && e->cxt.mid == 0)) {2181 if (!e || (!MRB_ENV_STACK_SHARED_P(e) && e->mid == 0) || 2182 MRB_ENV_STACK_LEN(e) <= m1+r+m2+1) { 2154 2183 localjump_error(mrb, LOCALJUMP_ERROR_YIELD); 2155 2184 goto L_RAISE; … … 2161 2190 goto L_RAISE; 2162 2191 } 2163 regs[a] = stack[m1+r+m2 ];2192 regs[a] = stack[m1+r+m2+kd]; 2164 2193 NEXT; 2165 2194 } 2166 2195 2167 2196 #define TYPES2(a,b) ((((uint16_t)(a))<<8)|(((uint16_t)(b))&0xff)) 2168 #define OP_MATH_BODY(op,v1,v2) do {\ 2169 v1(regs[a]) = v1(regs[a]) op v2(regs[a+1]);\ 2170 } while(0) 2171 2172 CASE(OP_ADD) { 2173 /* A B C R(A) := R(A)+R(A+1) (Syms[B]=:+,C=1)*/ 2174 int a = GETARG_A(i); 2197 #define OP_MATH(op_name) \ 2198 /* need to check if op is overridden */ \ 2199 switch (TYPES2(mrb_type(regs[a]),mrb_type(regs[a+1]))) { \ 2200 OP_MATH_CASE_FIXNUM(op_name); \ 2201 OP_MATH_CASE_FLOAT(op_name, fixnum, float); \ 2202 OP_MATH_CASE_FLOAT(op_name, float, fixnum); \ 2203 OP_MATH_CASE_FLOAT(op_name, float, float); \ 2204 OP_MATH_CASE_STRING_##op_name(); \ 2205 default: \ 2206 c = 1; \ 2207 mid = mrb_intern_lit(mrb, MRB_STRINGIZE(OP_MATH_OP_##op_name)); \ 2208 goto L_SEND_SYM; \ 2209 } \ 2210 NEXT; 2211 #define OP_MATH_CASE_FIXNUM(op_name) \ 2212 case TYPES2(MRB_TT_FIXNUM, MRB_TT_FIXNUM): \ 2213 { \ 2214 mrb_int x = mrb_fixnum(regs[a]), y = mrb_fixnum(regs[a+1]), z; \ 2215 if (mrb_int_##op_name##_overflow(x, y, &z)) \ 2216 OP_MATH_OVERFLOW_INT(op_name, x, y, z); \ 2217 else \ 2218 SET_INT_VALUE(regs[a], z); \ 2219 } \ 2220 break 2221 #ifdef MRB_WITHOUT_FLOAT 2222 #define OP_MATH_CASE_FLOAT(op_name, t1, t2) (void)0 2223 #define OP_MATH_OVERFLOW_INT(op_name, x, y, z) SET_INT_VALUE(regs[a], z) 2224 #else 2225 #define OP_MATH_CASE_FLOAT(op_name, t1, t2) \ 2226 case TYPES2(OP_MATH_TT_##t1, OP_MATH_TT_##t2): \ 2227 { \ 2228 mrb_float z = mrb_##t1(regs[a]) OP_MATH_OP_##op_name mrb_##t2(regs[a+1]); \ 2229 SET_FLOAT_VALUE(mrb, regs[a], z); \ 2230 } \ 2231 break 2232 #define OP_MATH_OVERFLOW_INT(op_name, x, y, z) \ 2233 SET_FLOAT_VALUE(mrb, regs[a], (mrb_float)x OP_MATH_OP_##op_name (mrb_float)y) 2234 #endif 2235 #define OP_MATH_CASE_STRING_add() \ 2236 case TYPES2(MRB_TT_STRING, MRB_TT_STRING): \ 2237 regs[a] = mrb_str_plus(mrb, regs[a], regs[a+1]); \ 2238 mrb_gc_arena_restore(mrb, ai); \ 2239 break 2240 #define OP_MATH_CASE_STRING_sub() (void)0 2241 #define OP_MATH_CASE_STRING_mul() (void)0 2242 #define OP_MATH_OP_add + 2243 #define OP_MATH_OP_sub - 2244 #define OP_MATH_OP_mul * 2245 #define OP_MATH_TT_fixnum MRB_TT_FIXNUM 2246 #define OP_MATH_TT_float MRB_TT_FLOAT 2247 2248 CASE(OP_ADD, B) { 2249 OP_MATH(add); 2250 } 2251 2252 CASE(OP_SUB, B) { 2253 OP_MATH(sub); 2254 } 2255 2256 CASE(OP_MUL, B) { 2257 OP_MATH(mul); 2258 } 2259 2260 CASE(OP_DIV, B) { 2261 #ifndef MRB_WITHOUT_FLOAT 2262 double x, y, f; 2263 #endif 2175 2264 2176 2265 /* need to check if op is overridden */ 2177 2266 switch (TYPES2(mrb_type(regs[a]),mrb_type(regs[a+1]))) { 2178 2267 case TYPES2(MRB_TT_FIXNUM,MRB_TT_FIXNUM): 2179 { 2180 mrb_int x, y, z; 2181 mrb_value *regs_a = regs + a; 2182 2183 x = mrb_fixnum(regs_a[0]); 2184 y = mrb_fixnum(regs_a[1]); 2185 if (mrb_int_add_overflow(x, y, &z)) { 2186 SET_FLOAT_VALUE(mrb, regs_a[0], (mrb_float)x + (mrb_float)y); 2187 break; 2188 } 2189 SET_INT_VALUE(regs[a], z); 2190 } 2191 break; 2192 case TYPES2(MRB_TT_FIXNUM,MRB_TT_FLOAT): 2193 { 2194 mrb_int x = mrb_fixnum(regs[a]); 2195 mrb_float y = mrb_float(regs[a+1]); 2196 SET_FLOAT_VALUE(mrb, regs[a], (mrb_float)x + y); 2197 } 2198 break; 2199 case TYPES2(MRB_TT_FLOAT,MRB_TT_FIXNUM): 2200 #ifdef MRB_WORD_BOXING 2201 { 2202 mrb_float x = mrb_float(regs[a]); 2203 mrb_int y = mrb_fixnum(regs[a+1]); 2204 SET_FLOAT_VALUE(mrb, regs[a], x + y); 2205 } 2206 #else 2207 OP_MATH_BODY(+,mrb_float,mrb_fixnum); 2208 #endif 2209 break; 2210 case TYPES2(MRB_TT_FLOAT,MRB_TT_FLOAT): 2211 #ifdef MRB_WORD_BOXING 2212 { 2213 mrb_float x = mrb_float(regs[a]); 2214 mrb_float y = mrb_float(regs[a+1]); 2215 SET_FLOAT_VALUE(mrb, regs[a], x + y); 2216 } 2217 #else 2218 OP_MATH_BODY(+,mrb_float,mrb_float); 2219 #endif 2220 break; 2221 case TYPES2(MRB_TT_STRING,MRB_TT_STRING): 2222 regs[a] = mrb_str_plus(mrb, regs[a], regs[a+1]); 2223 break; 2224 default: 2225 goto L_SEND; 2226 } 2227 ARENA_RESTORE(mrb, ai); 2228 NEXT; 2229 } 2230 2231 CASE(OP_SUB) { 2232 /* A B C R(A) := R(A)-R(A+1) (Syms[B]=:-,C=1)*/ 2233 int a = GETARG_A(i); 2234 2235 /* need to check if op is overridden */ 2236 switch (TYPES2(mrb_type(regs[a]),mrb_type(regs[a+1]))) { 2237 case TYPES2(MRB_TT_FIXNUM,MRB_TT_FIXNUM): 2238 { 2239 mrb_int x, y, z; 2240 2241 x = mrb_fixnum(regs[a]); 2242 y = mrb_fixnum(regs[a+1]); 2243 if (mrb_int_sub_overflow(x, y, &z)) { 2244 SET_FLOAT_VALUE(mrb, regs[a], (mrb_float)x - (mrb_float)y); 2245 break; 2246 } 2247 SET_INT_VALUE(regs[a], z); 2248 } 2249 break; 2250 case TYPES2(MRB_TT_FIXNUM,MRB_TT_FLOAT): 2251 { 2252 mrb_int x = mrb_fixnum(regs[a]); 2253 mrb_float y = mrb_float(regs[a+1]); 2254 SET_FLOAT_VALUE(mrb, regs[a], (mrb_float)x - y); 2255 } 2256 break; 2257 case TYPES2(MRB_TT_FLOAT,MRB_TT_FIXNUM): 2258 #ifdef MRB_WORD_BOXING 2259 { 2260 mrb_float x = mrb_float(regs[a]); 2261 mrb_int y = mrb_fixnum(regs[a+1]); 2262 SET_FLOAT_VALUE(mrb, regs[a], x - y); 2263 } 2264 #else 2265 OP_MATH_BODY(-,mrb_float,mrb_fixnum); 2266 #endif 2267 break; 2268 case TYPES2(MRB_TT_FLOAT,MRB_TT_FLOAT): 2269 #ifdef MRB_WORD_BOXING 2270 { 2271 mrb_float x = mrb_float(regs[a]); 2272 mrb_float y = mrb_float(regs[a+1]); 2273 SET_FLOAT_VALUE(mrb, regs[a], x - y); 2274 } 2275 #else 2276 OP_MATH_BODY(-,mrb_float,mrb_float); 2277 #endif 2278 break; 2279 default: 2280 goto L_SEND; 2281 } 2282 NEXT; 2283 } 2284 2285 CASE(OP_MUL) { 2286 /* A B C R(A) := R(A)*R(A+1) (Syms[B]=:*,C=1)*/ 2287 int a = GETARG_A(i); 2288 2289 /* need to check if op is overridden */ 2290 switch (TYPES2(mrb_type(regs[a]),mrb_type(regs[a+1]))) { 2291 case TYPES2(MRB_TT_FIXNUM,MRB_TT_FIXNUM): 2292 { 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); 2299 break; 2300 } 2301 SET_INT_VALUE(regs[a], z); 2302 } 2303 break; 2304 case TYPES2(MRB_TT_FIXNUM,MRB_TT_FLOAT): 2305 { 2306 mrb_int x = mrb_fixnum(regs[a]); 2307 mrb_float y = mrb_float(regs[a+1]); 2308 SET_FLOAT_VALUE(mrb, regs[a], (mrb_float)x * y); 2309 } 2310 break; 2311 case TYPES2(MRB_TT_FLOAT,MRB_TT_FIXNUM): 2312 #ifdef MRB_WORD_BOXING 2313 { 2314 mrb_float x = mrb_float(regs[a]); 2315 mrb_int y = mrb_fixnum(regs[a+1]); 2316 SET_FLOAT_VALUE(mrb, regs[a], x * y); 2317 } 2318 #else 2319 OP_MATH_BODY(*,mrb_float,mrb_fixnum); 2320 #endif 2321 break; 2322 case TYPES2(MRB_TT_FLOAT,MRB_TT_FLOAT): 2323 #ifdef MRB_WORD_BOXING 2324 { 2325 mrb_float x = mrb_float(regs[a]); 2326 mrb_float y = mrb_float(regs[a+1]); 2327 SET_FLOAT_VALUE(mrb, regs[a], x * y); 2328 } 2329 #else 2330 OP_MATH_BODY(*,mrb_float,mrb_float); 2331 #endif 2332 break; 2333 default: 2334 goto L_SEND; 2335 } 2336 NEXT; 2337 } 2338 2339 CASE(OP_DIV) { 2340 /* A B C R(A) := R(A)/R(A+1) (Syms[B]=:/,C=1)*/ 2341 int a = GETARG_A(i); 2342 2343 /* need to check if op is overridden */ 2344 switch (TYPES2(mrb_type(regs[a]),mrb_type(regs[a+1]))) { 2345 case TYPES2(MRB_TT_FIXNUM,MRB_TT_FIXNUM): 2268 #ifdef MRB_WITHOUT_FLOAT 2346 2269 { 2347 2270 mrb_int x = mrb_fixnum(regs[a]); 2348 2271 mrb_int y = mrb_fixnum(regs[a+1]); 2349 SET_FLOAT_VALUE(mrb, regs[a], (mrb_float)x / (mrb_float)y); 2350 } 2272 SET_INT_VALUE(regs[a], y ? x / y : 0); 2273 } 2274 break; 2275 #else 2276 x = (mrb_float)mrb_fixnum(regs[a]); 2277 y = (mrb_float)mrb_fixnum(regs[a+1]); 2351 2278 break; 2352 2279 case TYPES2(MRB_TT_FIXNUM,MRB_TT_FLOAT): 2353 { 2354 mrb_int x = mrb_fixnum(regs[a]); 2355 mrb_float y = mrb_float(regs[a+1]); 2356 SET_FLOAT_VALUE(mrb, regs[a], (mrb_float)x / y); 2357 } 2280 x = (mrb_float)mrb_fixnum(regs[a]); 2281 y = mrb_float(regs[a+1]); 2358 2282 break; 2359 2283 case TYPES2(MRB_TT_FLOAT,MRB_TT_FIXNUM): 2360 #ifdef MRB_WORD_BOXING 2361 { 2362 mrb_float x = mrb_float(regs[a]); 2363 mrb_int y = mrb_fixnum(regs[a+1]); 2364 SET_FLOAT_VALUE(mrb, regs[a], x / y); 2365 } 2366 #else 2367 OP_MATH_BODY(/,mrb_float,mrb_fixnum); 2368 #endif 2284 x = mrb_float(regs[a]); 2285 y = (mrb_float)mrb_fixnum(regs[a+1]); 2369 2286 break; 2370 2287 case TYPES2(MRB_TT_FLOAT,MRB_TT_FLOAT): 2371 #ifdef MRB_WORD_BOXING 2372 { 2373 mrb_float x = mrb_float(regs[a]); 2374 mrb_float y = mrb_float(regs[a+1]); 2375 SET_FLOAT_VALUE(mrb, regs[a], x / y); 2376 } 2288 x = mrb_float(regs[a]); 2289 y = mrb_float(regs[a+1]); 2290 break; 2291 #endif 2292 default: 2293 c = 1; 2294 mid = mrb_intern_lit(mrb, "/"); 2295 goto L_SEND_SYM; 2296 } 2297 2298 #ifndef MRB_WITHOUT_FLOAT 2299 if (y == 0) { 2300 if (x > 0) f = INFINITY; 2301 else if (x < 0) f = -INFINITY; 2302 else /* if (x == 0) */ f = NAN; 2303 } 2304 else { 2305 f = x / y; 2306 } 2307 SET_FLOAT_VALUE(mrb, regs[a], f); 2308 #endif 2309 NEXT; 2310 } 2311 2312 #define OP_MATHI(op_name) \ 2313 /* need to check if op is overridden */ \ 2314 switch (mrb_type(regs[a])) { \ 2315 OP_MATHI_CASE_FIXNUM(op_name); \ 2316 OP_MATHI_CASE_FLOAT(op_name); \ 2317 default: \ 2318 SET_INT_VALUE(regs[a+1], b); \ 2319 c = 1; \ 2320 mid = mrb_intern_lit(mrb, MRB_STRINGIZE(OP_MATH_OP_##op_name)); \ 2321 goto L_SEND_SYM; \ 2322 } \ 2323 NEXT; 2324 #define OP_MATHI_CASE_FIXNUM(op_name) \ 2325 case MRB_TT_FIXNUM: \ 2326 { \ 2327 mrb_int x = mrb_fixnum(regs[a]), y = (mrb_int)b, z; \ 2328 if (mrb_int_##op_name##_overflow(x, y, &z)) \ 2329 OP_MATH_OVERFLOW_INT(op_name, x, y, z); \ 2330 else \ 2331 SET_INT_VALUE(regs[a], z); \ 2332 } \ 2333 break 2334 #ifdef MRB_WITHOUT_FLOAT 2335 #define OP_MATHI_CASE_FLOAT(op_name) (void)0 2377 2336 #else 2378 OP_MATH_BODY(/,mrb_float,mrb_float); 2379 #endif 2380 break; 2381 default: 2382 goto L_SEND; 2383 } 2384 #ifdef MRB_NAN_BOXING 2385 if (isnan(mrb_float(regs[a]))) { 2386 mrb_value v = mrb_float_value(mrb, mrb_float(regs[a])); 2387 regs[a] = v; 2388 } 2389 #endif 2390 NEXT; 2391 } 2392 2393 CASE(OP_ADDI) { 2394 /* A B C R(A) := R(A)+C (Syms[B]=:+)*/ 2395 int a = GETARG_A(i); 2396 2397 /* need to check if + is overridden */ 2398 switch (mrb_type(regs[a])) { 2399 case MRB_TT_FIXNUM: 2400 { 2401 mrb_int x = mrb_fixnum(regs[a]); 2402 mrb_int y = GETARG_C(i); 2403 mrb_int z; 2404 2405 if (mrb_int_add_overflow(x, y, &z)) { 2406 SET_FLOAT_VALUE(mrb, regs[a], (mrb_float)x + (mrb_float)y); 2407 break; 2408 } 2409 SET_INT_VALUE(regs[a], z); 2410 } 2411 break; 2412 case MRB_TT_FLOAT: 2413 #ifdef MRB_WORD_BOXING 2414 { 2415 mrb_float x = mrb_float(regs[a]); 2416 SET_FLOAT_VALUE(mrb, regs[a], x + GETARG_C(i)); 2417 } 2337 #define OP_MATHI_CASE_FLOAT(op_name) \ 2338 case MRB_TT_FLOAT: \ 2339 { \ 2340 mrb_float z = mrb_float(regs[a]) OP_MATH_OP_##op_name b; \ 2341 SET_FLOAT_VALUE(mrb, regs[a], z); \ 2342 } \ 2343 break 2344 #endif 2345 2346 CASE(OP_ADDI, BB) { 2347 OP_MATHI(add); 2348 } 2349 2350 CASE(OP_SUBI, BB) { 2351 OP_MATHI(sub); 2352 } 2353 2354 #define OP_CMP_BODY(op,v1,v2) (v1(regs[a]) op v2(regs[a+1])) 2355 2356 #ifdef MRB_WITHOUT_FLOAT 2357 #define OP_CMP(op) do {\ 2358 int result;\ 2359 /* need to check if - is overridden */\ 2360 switch (TYPES2(mrb_type(regs[a]),mrb_type(regs[a+1]))) {\ 2361 case TYPES2(MRB_TT_FIXNUM,MRB_TT_FIXNUM):\ 2362 result = OP_CMP_BODY(op,mrb_fixnum,mrb_fixnum);\ 2363 break;\ 2364 default:\ 2365 c = 1;\ 2366 mid = mrb_intern_lit(mrb, # op);\ 2367 goto L_SEND_SYM;\ 2368 }\ 2369 if (result) {\ 2370 SET_TRUE_VALUE(regs[a]);\ 2371 }\ 2372 else {\ 2373 SET_FALSE_VALUE(regs[a]);\ 2374 }\ 2375 } while(0) 2418 2376 #else 2419 mrb_float(regs[a]) += GETARG_C(i);2420 #endif2421 break;2422 default:2423 SET_INT_VALUE(regs[a+1], GETARG_C(i));2424 i = MKOP_ABC(OP_SEND, a, GETARG_B(i), 1);2425 goto L_SEND;2426 }2427 NEXT;2428 }2429 2430 CASE(OP_SUBI) {2431 /* A B C R(A) := R(A)-C (Syms[B]=:-)*/2432 int a = GETARG_A(i);2433 mrb_value *regs_a = regs + a;2434 2435 /* need to check if + is overridden */2436 switch (mrb_type(regs_a[0])) {2437 case MRB_TT_FIXNUM:2438 {2439 mrb_int x = mrb_fixnum(regs_a[0]);2440 mrb_int y = GETARG_C(i);2441 mrb_int z;2442 2443 if (mrb_int_sub_overflow(x, y, &z)) {2444 SET_FLOAT_VALUE(mrb, regs_a[0], (mrb_float)x - (mrb_float)y);2445 }2446 else {2447 SET_INT_VALUE(regs_a[0], z);2448 }2449 }2450 break;2451 case MRB_TT_FLOAT:2452 #ifdef MRB_WORD_BOXING2453 {2454 mrb_float x = mrb_float(regs[a]);2455 SET_FLOAT_VALUE(mrb, regs[a], x - GETARG_C(i));2456 }2457 #else2458 mrb_float(regs_a[0]) -= GETARG_C(i);2459 #endif2460 break;2461 default:2462 SET_INT_VALUE(regs_a[1], GETARG_C(i));2463 i = MKOP_ABC(OP_SEND, a, GETARG_B(i), 1);2464 goto L_SEND;2465 }2466 NEXT;2467 }2468 2469 #define OP_CMP_BODY(op,v1,v2) (v1(regs[a]) op v2(regs[a+1]))2470 2471 2377 #define OP_CMP(op) do {\ 2472 2378 int result;\ … … 2486 2392 break;\ 2487 2393 default:\ 2488 goto L_SEND;\ 2394 c = 1;\ 2395 mid = mrb_intern_lit(mrb, # op);\ 2396 goto L_SEND_SYM;\ 2489 2397 }\ 2490 2398 if (result) {\ … … 2495 2403 }\ 2496 2404 } while(0) 2497 2498 CASE(OP_EQ) { 2499 /* A B C R(A) := R(A)==R(A+1) (Syms[B]=:==,C=1)*/ 2500 int a = GETARG_A(i); 2405 #endif 2406 2407 CASE(OP_EQ, B) { 2501 2408 if (mrb_obj_eq(mrb, regs[a], regs[a+1])) { 2502 2409 SET_TRUE_VALUE(regs[a]); … … 2508 2415 } 2509 2416 2510 CASE(OP_LT) { 2511 /* A B C R(A) := R(A)<R(A+1) (Syms[B]=:<,C=1)*/ 2512 int a = GETARG_A(i); 2417 CASE(OP_LT, B) { 2513 2418 OP_CMP(<); 2514 2419 NEXT; 2515 2420 } 2516 2421 2517 CASE(OP_LE) { 2518 /* A B C R(A) := R(A)<=R(A+1) (Syms[B]=:<=,C=1)*/ 2519 int a = GETARG_A(i); 2422 CASE(OP_LE, B) { 2520 2423 OP_CMP(<=); 2521 2424 NEXT; 2522 2425 } 2523 2426 2524 CASE(OP_GT) { 2525 /* A B C R(A) := R(A)>R(A+1) (Syms[B]=:>,C=1)*/ 2526 int a = GETARG_A(i); 2427 CASE(OP_GT, B) { 2527 2428 OP_CMP(>); 2528 2429 NEXT; 2529 2430 } 2530 2431 2531 CASE(OP_GE) { 2532 /* A B C R(A) := R(A)>=R(A+1) (Syms[B]=:>=,C=1)*/ 2533 int a = GETARG_A(i); 2432 CASE(OP_GE, B) { 2534 2433 OP_CMP(>=); 2535 2434 NEXT; 2536 2435 } 2537 2436 2538 CASE(OP_ARRAY) { 2539 /* A B C R(A) := ary_new(R(B),R(B+1)..R(B+C)) */ 2540 int a = GETARG_A(i); 2541 int b = GETARG_B(i); 2542 int c = GETARG_C(i); 2437 CASE(OP_ARRAY, BB) { 2438 mrb_value v = mrb_ary_new_from_values(mrb, b, ®s[a]); 2439 regs[a] = v; 2440 mrb_gc_arena_restore(mrb, ai); 2441 NEXT; 2442 } 2443 CASE(OP_ARRAY2, BBB) { 2543 2444 mrb_value v = mrb_ary_new_from_values(mrb, c, ®s[b]); 2544 2445 regs[a] = v; 2545 ARENA_RESTORE(mrb, ai); 2546 NEXT; 2547 } 2548 2549 CASE(OP_ARYCAT) { 2550 /* A B mrb_ary_concat(R(A),R(B)) */ 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); 2555 ARENA_RESTORE(mrb, ai); 2556 NEXT; 2557 } 2558 2559 CASE(OP_ARYPUSH) { 2560 /* A B R(A).push(R(B)) */ 2561 int a = GETARG_A(i); 2562 int b = GETARG_B(i); 2563 mrb_ary_push(mrb, regs[a], regs[b]); 2564 NEXT; 2565 } 2566 2567 CASE(OP_AREF) { 2568 /* A B C R(A) := R(B)[C] */ 2569 int a = GETARG_A(i); 2570 int b = GETARG_B(i); 2571 int c = GETARG_C(i); 2446 mrb_gc_arena_restore(mrb, ai); 2447 NEXT; 2448 } 2449 2450 CASE(OP_ARYCAT, B) { 2451 mrb_value splat = mrb_ary_splat(mrb, regs[a+1]); 2452 if (mrb_nil_p(regs[a])) { 2453 regs[a] = splat; 2454 } 2455 else { 2456 mrb_ary_concat(mrb, regs[a], splat); 2457 } 2458 mrb_gc_arena_restore(mrb, ai); 2459 NEXT; 2460 } 2461 2462 CASE(OP_ARYPUSH, B) { 2463 mrb_ary_push(mrb, regs[a], regs[a+1]); 2464 NEXT; 2465 } 2466 2467 CASE(OP_ARYDUP, B) { 2468 mrb_value ary = regs[a]; 2469 if (mrb_array_p(ary)) { 2470 ary = mrb_ary_new_from_values(mrb, RARRAY_LEN(ary), RARRAY_PTR(ary)); 2471 } 2472 else { 2473 ary = mrb_ary_new_from_values(mrb, 1, &ary); 2474 } 2475 regs[a] = ary; 2476 NEXT; 2477 } 2478 2479 CASE(OP_AREF, BBB) { 2572 2480 mrb_value v = regs[b]; 2573 2481 … … 2587 2495 } 2588 2496 2589 CASE(OP_ASET) { 2590 /* A B C R(B)[C] := R(A) */ 2591 int a = GETARG_A(i); 2592 int b = GETARG_B(i); 2593 int c = GETARG_C(i); 2497 CASE(OP_ASET, BBB) { 2594 2498 mrb_ary_set(mrb, regs[b], c, regs[a]); 2595 2499 NEXT; 2596 2500 } 2597 2501 2598 CASE(OP_APOST) { 2599 /* A B C *R(A),R(A+1)..R(A+C) := R(A) */ 2600 int a = GETARG_A(i); 2502 CASE(OP_APOST, BBB) { 2601 2503 mrb_value v = regs[a]; 2602 int pre = GETARG_B(i);2603 int post = GETARG_C(i);2504 int pre = b; 2505 int post = c; 2604 2506 struct RArray *ary; 2605 2507 int len, idx; … … 2609 2511 } 2610 2512 ary = mrb_ary_ptr(v); 2611 len = ary->len;2513 len = (int)ARY_LEN(ary); 2612 2514 if (len > pre + post) { 2613 v = mrb_ary_new_from_values(mrb, len - pre - post, ary->ptr+pre);2515 v = mrb_ary_new_from_values(mrb, len - pre - post, ARY_PTR(ary)+pre); 2614 2516 regs[a++] = v; 2615 2517 while (post--) { 2616 regs[a++] = ary->ptr[len-post-1];2518 regs[a++] = ARY_PTR(ary)[len-post-1]; 2617 2519 } 2618 2520 } … … 2621 2523 regs[a++] = v; 2622 2524 for (idx=0; idx+pre<len; idx++) { 2623 regs[a+idx] = ary->ptr[pre+idx];2525 regs[a+idx] = ARY_PTR(ary)[pre+idx]; 2624 2526 } 2625 2527 while (idx < post) { … … 2628 2530 } 2629 2531 } 2630 ARENA_RESTORE(mrb, ai); 2631 NEXT; 2632 } 2633 2634 CASE(OP_STRING) { 2635 /* A Bx R(A) := str_new(Lit(Bx)) */ 2636 mrb_value str = mrb_str_dup(mrb, pool[GETARG_Bx(i)]); 2637 regs[GETARG_A(i)] = str; 2638 ARENA_RESTORE(mrb, ai); 2639 NEXT; 2640 } 2641 2642 CASE(OP_STRCAT) { 2643 /* A B R(A).concat(R(B)) */ 2644 mrb_str_concat(mrb, regs[GETARG_A(i)], regs[GETARG_B(i)]); 2645 NEXT; 2646 } 2647 2648 CASE(OP_HASH) { 2649 /* A B C R(A) := hash_new(R(B),R(B+1)..R(B+C)) */ 2650 int b = GETARG_B(i); 2651 int c = GETARG_C(i); 2652 int lim = b+c*2; 2653 mrb_value hash = mrb_hash_new_capa(mrb, c); 2654 2655 while (b < lim) { 2656 mrb_hash_set(mrb, hash, regs[b], regs[b+1]); 2657 b+=2; 2658 } 2659 regs[GETARG_A(i)] = hash; 2660 ARENA_RESTORE(mrb, ai); 2661 NEXT; 2662 } 2663 2664 CASE(OP_LAMBDA) { 2665 /* A b c R(A) := lambda(SEQ[b],c) (b:c = 14:2) */ 2532 mrb_gc_arena_restore(mrb, ai); 2533 NEXT; 2534 } 2535 2536 CASE(OP_INTERN, B) { 2537 mrb_sym sym = mrb_intern_str(mrb, regs[a]); 2538 2539 regs[a] = mrb_symbol_value(sym); 2540 mrb_gc_arena_restore(mrb, ai); 2541 NEXT; 2542 } 2543 2544 CASE(OP_STRING, BB) { 2545 mrb_value str = mrb_str_dup(mrb, pool[b]); 2546 2547 regs[a] = str; 2548 mrb_gc_arena_restore(mrb, ai); 2549 NEXT; 2550 } 2551 2552 CASE(OP_STRCAT, B) { 2553 mrb_str_concat(mrb, regs[a], regs[a+1]); 2554 NEXT; 2555 } 2556 2557 CASE(OP_HASH, BB) { 2558 mrb_value hash = mrb_hash_new_capa(mrb, b); 2559 int i; 2560 int lim = a+b*2; 2561 2562 for (i=a; i<lim; i+=2) { 2563 mrb_hash_set(mrb, hash, regs[i], regs[i+1]); 2564 } 2565 regs[a] = hash; 2566 mrb_gc_arena_restore(mrb, ai); 2567 NEXT; 2568 } 2569 2570 CASE(OP_HASHADD, BB) { 2571 mrb_value hash; 2572 int i; 2573 int lim = a+b*2+1; 2574 2575 hash = mrb_ensure_hash_type(mrb, regs[a]); 2576 for (i=a+1; i<lim; i+=2) { 2577 mrb_hash_set(mrb, hash, regs[i], regs[i+1]); 2578 } 2579 mrb_gc_arena_restore(mrb, ai); 2580 NEXT; 2581 } 2582 CASE(OP_HASHCAT, B) { 2583 mrb_value hash = mrb_ensure_hash_type(mrb, regs[a]); 2584 2585 mrb_hash_merge(mrb, hash, regs[a+1]); 2586 mrb_gc_arena_restore(mrb, ai); 2587 NEXT; 2588 } 2589 2590 CASE(OP_LAMBDA, BB) 2591 c = OP_L_LAMBDA; 2592 L_MAKE_LAMBDA: 2593 { 2666 2594 struct RProc *p; 2667 int c = GETARG_c(i);2595 mrb_irep *nirep = irep->reps[b]; 2668 2596 2669 2597 if (c & OP_L_CAPTURE) { 2670 p = mrb_closure_new(mrb, irep->reps[GETARG_b(i)]);2598 p = mrb_closure_new(mrb, nirep); 2671 2599 } 2672 2600 else { 2673 p = mrb_proc_new(mrb, irep->reps[GETARG_b(i)]); 2601 p = mrb_proc_new(mrb, nirep); 2602 p->flags |= MRB_PROC_SCOPE; 2674 2603 } 2675 2604 if (c & OP_L_STRICT) p->flags |= MRB_PROC_STRICT; 2676 regs[GETARG_A(i)] = mrb_obj_value(p); 2677 ARENA_RESTORE(mrb, ai); 2678 NEXT; 2679 } 2680 2681 CASE(OP_OCLASS) { 2682 /* A R(A) := ::Object */ 2683 regs[GETARG_A(i)] = mrb_obj_value(mrb->object_class); 2684 NEXT; 2685 } 2686 2687 CASE(OP_CLASS) { 2688 /* A B R(A) := newclass(R(A),Syms(B),R(A+1)) */ 2605 regs[a] = mrb_obj_value(p); 2606 mrb_gc_arena_restore(mrb, ai); 2607 NEXT; 2608 } 2609 CASE(OP_BLOCK, BB) { 2610 c = OP_L_BLOCK; 2611 goto L_MAKE_LAMBDA; 2612 } 2613 CASE(OP_METHOD, BB) { 2614 c = OP_L_METHOD; 2615 goto L_MAKE_LAMBDA; 2616 } 2617 2618 CASE(OP_RANGE_INC, B) { 2619 mrb_value val = mrb_range_new(mrb, regs[a], regs[a+1], FALSE); 2620 regs[a] = val; 2621 mrb_gc_arena_restore(mrb, ai); 2622 NEXT; 2623 } 2624 2625 CASE(OP_RANGE_EXC, B) { 2626 mrb_value val = mrb_range_new(mrb, regs[a], regs[a+1], TRUE); 2627 regs[a] = val; 2628 mrb_gc_arena_restore(mrb, ai); 2629 NEXT; 2630 } 2631 2632 CASE(OP_OCLASS, B) { 2633 regs[a] = mrb_obj_value(mrb->object_class); 2634 NEXT; 2635 } 2636 2637 CASE(OP_CLASS, BB) { 2689 2638 struct RClass *c = 0, *baseclass; 2690 int a = GETARG_A(i);2691 2639 mrb_value base, super; 2692 mrb_sym id = syms[ GETARG_B(i)];2640 mrb_sym id = syms[b]; 2693 2641 2694 2642 base = regs[a]; 2695 2643 super = regs[a+1]; 2696 2644 if (mrb_nil_p(base)) { 2697 baseclass = mrb->c->ci->proc->target_class; 2698 if (!baseclass) baseclass = mrb->c->ci->target_class; 2699 2645 baseclass = MRB_PROC_TARGET_CLASS(mrb->c->ci->proc); 2700 2646 base = mrb_obj_value(baseclass); 2701 2647 } 2702 2648 c = mrb_vm_define_class(mrb, base, super, id); 2703 2649 regs[a] = mrb_obj_value(c); 2704 ARENA_RESTORE(mrb, ai); 2705 NEXT; 2706 } 2707 2708 CASE(OP_MODULE) { 2709 /* A B R(A) := newmodule(R(A),Syms(B)) */ 2710 struct RClass *c = 0, *baseclass; 2711 int a = GETARG_A(i); 2650 mrb_gc_arena_restore(mrb, ai); 2651 NEXT; 2652 } 2653 2654 CASE(OP_MODULE, BB) { 2655 struct RClass *cls = 0, *baseclass; 2712 2656 mrb_value base; 2713 mrb_sym id = syms[ GETARG_B(i)];2657 mrb_sym id = syms[b]; 2714 2658 2715 2659 base = regs[a]; 2716 2660 if (mrb_nil_p(base)) { 2717 baseclass = mrb->c->ci->proc->target_class; 2718 if (!baseclass) baseclass = mrb->c->ci->target_class; 2719 2661 baseclass = MRB_PROC_TARGET_CLASS(mrb->c->ci->proc); 2720 2662 base = mrb_obj_value(baseclass); 2721 2663 } 2722 c = mrb_vm_define_module(mrb, base, id); 2723 regs[a] = mrb_obj_value(c); 2724 ARENA_RESTORE(mrb, ai); 2725 NEXT; 2726 } 2727 2728 CASE(OP_EXEC) { 2729 /* A Bx R(A) := blockexec(R(A),SEQ[Bx]) */ 2730 int a = GETARG_A(i); 2664 cls = mrb_vm_define_module(mrb, base, id); 2665 regs[a] = mrb_obj_value(cls); 2666 mrb_gc_arena_restore(mrb, ai); 2667 NEXT; 2668 } 2669 2670 CASE(OP_EXEC, BB) { 2731 2671 mrb_callinfo *ci; 2732 2672 mrb_value recv = regs[a]; 2733 2673 struct RProc *p; 2674 mrb_irep *nirep = irep->reps[b]; 2734 2675 2735 2676 /* prepare closure */ 2736 p = mrb_ closure_new(mrb, irep->reps[GETARG_Bx(i)]);2677 p = mrb_proc_new(mrb, nirep); 2737 2678 p->c = NULL; 2738 2739 /* prepare stack */ 2679 mrb_field_write_barrier(mrb, (struct RBasic*)p, (struct RBasic*)proc); 2680 MRB_PROC_SET_TARGET_CLASS(p, mrb_class_ptr(recv)); 2681 p->flags |= MRB_PROC_SCOPE; 2682 2683 /* prepare call stack */ 2740 2684 ci = cipush(mrb); 2741 ci->pc = pc + 1;2685 ci->pc = pc; 2742 2686 ci->acc = a; 2743 2687 ci->mid = 0; … … 2749 2693 mrb->c->stack += a; 2750 2694 2751 /* setup closure */ 2752 p->target_class = ci->target_class; 2695 /* setup block to call */ 2753 2696 ci->proc = p; 2754 2697 … … 2756 2699 pool = irep->pool; 2757 2700 syms = irep->syms; 2758 stack_extend(mrb, irep->nregs);2701 mrb_stack_extend(mrb, irep->nregs); 2759 2702 stack_clear(regs+1, irep->nregs-1); 2760 ci->nregs = irep->nregs;2761 2703 pc = irep->iseq; 2762 2704 JUMP; 2763 2705 } 2764 2706 2765 CASE(OP_METHOD) { 2766 /* A B R(A).newmethod(Syms(B),R(A+1)) */ 2767 int a = GETARG_A(i); 2768 struct RClass *c = mrb_class_ptr(regs[a]); 2707 CASE(OP_DEF, BB) { 2708 struct RClass *target = mrb_class_ptr(regs[a]); 2769 2709 struct RProc *p = mrb_proc_ptr(regs[a+1]); 2770 2771 mrb_define_method_raw(mrb, c, syms[GETARG_B(i)], p); 2772 ARENA_RESTORE(mrb, ai); 2773 NEXT; 2774 } 2775 2776 CASE(OP_SCLASS) { 2777 /* A B R(A) := R(B).singleton_class */ 2778 regs[GETARG_A(i)] = mrb_singleton_class(mrb, regs[GETARG_B(i)]); 2779 ARENA_RESTORE(mrb, ai); 2780 NEXT; 2781 } 2782 2783 CASE(OP_TCLASS) { 2784 /* A R(A) := target_class */ 2785 if (!mrb->c->ci->target_class) { 2786 mrb_value exc = mrb_exc_new_str_lit(mrb, E_TYPE_ERROR, "no target class or module"); 2787 mrb_exc_set(mrb, exc); 2788 goto L_RAISE; 2789 } 2790 regs[GETARG_A(i)] = mrb_obj_value(mrb->c->ci->target_class); 2791 NEXT; 2792 } 2793 2794 CASE(OP_RANGE) { 2795 /* A B C R(A) := range_new(R(B),R(B+1),C) */ 2796 int b = GETARG_B(i); 2797 mrb_value val = mrb_range_new(mrb, regs[b], regs[b+1], GETARG_C(i)); 2798 regs[GETARG_A(i)] = val; 2799 ARENA_RESTORE(mrb, ai); 2800 NEXT; 2801 } 2802 2803 CASE(OP_DEBUG) { 2804 /* A B C debug print R(A),R(B),R(C) */ 2710 mrb_method_t m; 2711 2712 MRB_METHOD_FROM_PROC(m, p); 2713 mrb_define_method_raw(mrb, target, syms[b], m); 2714 mrb_gc_arena_restore(mrb, ai); 2715 NEXT; 2716 } 2717 2718 CASE(OP_SCLASS, B) { 2719 regs[a] = mrb_singleton_class(mrb, regs[a]); 2720 mrb_gc_arena_restore(mrb, ai); 2721 NEXT; 2722 } 2723 2724 CASE(OP_TCLASS, B) { 2725 if (!check_target_class(mrb)) goto L_RAISE; 2726 regs[a] = mrb_obj_value(mrb->c->ci->target_class); 2727 NEXT; 2728 } 2729 2730 CASE(OP_ALIAS, BB) { 2731 struct RClass *target; 2732 2733 if (!check_target_class(mrb)) goto L_RAISE; 2734 target = mrb->c->ci->target_class; 2735 mrb_alias_method(mrb, target, syms[a], syms[b]); 2736 NEXT; 2737 } 2738 CASE(OP_UNDEF, B) { 2739 struct RClass *target; 2740 2741 if (!check_target_class(mrb)) goto L_RAISE; 2742 target = mrb->c->ci->target_class; 2743 mrb_undef_method_id(mrb, target, syms[a]); 2744 NEXT; 2745 } 2746 2747 CASE(OP_DEBUG, Z) { 2748 FETCH_BBB(); 2805 2749 #ifdef MRB_ENABLE_DEBUG_HOOK 2806 2750 mrb->debug_op_hook(mrb, irep, pc, regs); 2807 2751 #else 2808 2752 #ifndef MRB_DISABLE_STDIO 2809 printf("OP_DEBUG %d %d %d\n", GETARG_A(i), GETARG_B(i), GETARG_C(i));2753 printf("OP_DEBUG %d %d %d\n", a, b, c); 2810 2754 #else 2811 2755 abort(); … … 2815 2759 } 2816 2760 2817 CASE(OP_STOP) { 2761 CASE(OP_ERR, B) { 2762 mrb_value msg = mrb_str_dup(mrb, pool[a]); 2763 mrb_value exc; 2764 2765 exc = mrb_exc_new_str(mrb, E_LOCALJUMP_ERROR, msg); 2766 ERR_PC_SET(mrb); 2767 mrb_exc_set(mrb, exc); 2768 goto L_RAISE; 2769 } 2770 2771 CASE(OP_EXT1, Z) { 2772 insn = READ_B(); 2773 switch (insn) { 2774 #define OPCODE(insn,ops) case OP_ ## insn: FETCH_ ## ops ## _1(); goto L_OP_ ## insn ## _BODY; 2775 #include "mruby/ops.h" 2776 #undef OPCODE 2777 } 2778 pc--; 2779 NEXT; 2780 } 2781 CASE(OP_EXT2, Z) { 2782 insn = READ_B(); 2783 switch (insn) { 2784 #define OPCODE(insn,ops) case OP_ ## insn: FETCH_ ## ops ## _2(); goto L_OP_ ## insn ## _BODY; 2785 #include "mruby/ops.h" 2786 #undef OPCODE 2787 } 2788 pc--; 2789 NEXT; 2790 } 2791 CASE(OP_EXT3, Z) { 2792 uint8_t insn = READ_B(); 2793 switch (insn) { 2794 #define OPCODE(insn,ops) case OP_ ## insn: FETCH_ ## ops ## _3(); goto L_OP_ ## insn ## _BODY; 2795 #include "mruby/ops.h" 2796 #undef OPCODE 2797 } 2798 pc--; 2799 NEXT; 2800 } 2801 2802 CASE(OP_STOP, Z) { 2818 2803 /* stop VM */ 2819 2804 L_STOP: 2820 { 2821 int epos = mrb->c->ci->epos; 2822 2823 while (mrb->c->eidx > epos) { 2824 ecall(mrb, --mrb->c->eidx); 2825 } 2826 } 2805 while (mrb->c->eidx > 0) { 2806 ecall(mrb); 2807 } 2808 mrb->c->cibase->ridx = 0; 2827 2809 ERR_PC_CLR(mrb); 2828 2810 mrb->jmp = prev_jmp; … … 2832 2814 return regs[irep->nlocals]; 2833 2815 } 2834 2835 CASE(OP_ERR) {2836 /* Bx raise RuntimeError with message Lit(Bx) */2837 mrb_value msg = mrb_str_dup(mrb, pool[GETARG_Bx(i)]);2838 mrb_value exc;2839 2840 if (GETARG_A(i) == 0) {2841 exc = mrb_exc_new_str(mrb, E_RUNTIME_ERROR, msg);2842 }2843 else {2844 exc = mrb_exc_new_str(mrb, E_LOCALJUMP_ERROR, msg);2845 }2846 mrb_exc_set(mrb, exc);2847 goto L_RAISE;2848 }2849 2816 } 2850 2817 END_DISPATCH; 2851 2818 #undef regs 2852 2853 2819 } 2854 2820 MRB_CATCH(&c_jmp) { … … 2884 2850 } 2885 2851 ci = cipush(mrb); 2852 ci->stackent = mrb->c->stack; 2886 2853 ci->mid = 0; 2887 ci->nregs = 1; /* protect the receiver */2888 2854 ci->acc = CI_ACC_SKIP; 2889 2855 ci->target_class = mrb->object_class; 2890 2856 v = mrb_vm_run(mrb, proc, self, stack_keep); 2891 cipop(mrb);2892 2857 2893 2858 return v; -
EcnlProtoTool/trunk/mruby-2.1.1/tasks/gitlab.rake
r331 r439 64 64 [true, false].each do |mode_32| 65 65 ['', 'MRB_USE_FLOAT'].each do |float_conf| 66 ['', 'MRB_INT16', 'MRB_INT64'].each do |int_conf| 67 ['', 'MRB_NAN_BOXING', 'MRB_WORD_BOXING'].each do |boxing_conf| 68 ['', 'MRB_UTF8_STRING'].each do |utf8_conf| 69 next if (float_conf == 'MRB_USE_FLOAT') && (boxing_conf == 'MRB_NAN_BOXING') 70 next if (int_conf == 'MRB_INT64') && (boxing_conf == 'MRB_NAN_BOXING') 71 next if (int_conf == 'MRB_INT16') && (boxing_conf == 'MRB_WORD_BOXING') 72 next if (int_conf == 'MRB_INT64') && (boxing_conf == 'MRB_WORD_BOXING') && mode_32 73 env = [float_conf, int_conf, boxing_conf, utf8_conf].map do |conf| 74 conf == '' ? nil : "-D#{conf}=1" 75 end.compact.join(' ') 76 bit = mode_32 ? '-m32 ' : '' 77 _info = '' 78 _info += mode_32 ? '32bit ' : '64bit ' 79 _info += float_conf['USE'] ? 'float ' : '' 80 _info += int_conf['16'] ? 'int16 ' : '' 81 _info += int_conf['64'] ? 'int64 ' : '' 82 _info += boxing_conf['NAN'] ? 'nan ' : '' 83 _info += boxing_conf['word'] ? 'word ' : '' 84 _info += utf8_conf['UTF8'] ? 'utf8 ' : '' 85 _info = _info.gsub(/ +/, ' ').strip.tr(' ', '_') 86 configs << { '_info' => _info, 'CFLAGS' => "#{bit}#{env}", 'LDFLAGS' => bit.strip.to_s } 87 end 66 ['', 'MRB_NAN_BOXING', 'MRB_WORD_BOXING'].each do |boxing_conf| 67 ['', 'MRB_UTF8_STRING'].each do |utf8_conf| 68 next if (float_conf == 'MRB_USE_FLOAT') && (boxing_conf == 'MRB_NAN_BOXING') 69 next if (int_conf == 'MRB_INT64') && (boxing_conf == 'MRB_NAN_BOXING') 70 next if (int_conf == 'MRB_INT64') && (boxing_conf == 'MRB_WORD_BOXING') && mode_32 71 env = [float_conf, int_conf, boxing_conf, utf8_conf].map do |conf| 72 conf == '' ? nil : "-D#{conf}=1" 73 end.compact.join(' ') 74 bit = mode_32 ? '-m32 ' : '' 75 _info = '' 76 _info += mode_32 ? '32bit ' : '64bit ' 77 _info += float_conf['USE'] ? 'float ' : '' 78 _info += int_conf['16'] ? 'int16 ' : '' 79 _info += int_conf['64'] ? 'int64 ' : '' 80 _info += boxing_conf['NAN'] ? 'nan ' : '' 81 _info += boxing_conf['WORD'] ? 'word ' : '' 82 _info += utf8_conf['UTF8'] ? 'utf8 ' : '' 83 _info = _info.gsub(/ +/, ' ').strip.tr(' ', '_') 84 configs << { '_info' => _info, 'CFLAGS' => "#{bit}#{env}", 'LDFLAGS' => bit.strip.to_s } 88 85 end 89 86 end … … 111 108 'image' => ci_docker_tag(compiler), 112 109 'variables' => hash, 113 'script' => 'env; ./minirake --verbose all test'110 'script' => 'env; rake --verbose all test' 114 111 } 115 112 end -
EcnlProtoTool/trunk/mruby-2.1.1/tasks/libmruby.rake
r331 r439 1 1 MRuby.each_target do 2 file lib file("#{build_dir}/lib/libmruby") => libmruby.flatten do |t|2 file libmruby_static => libmruby_objs.flatten do |t| 3 3 archiver.run t.name, t.prerequisites 4 4 end 5 5 6 file "#{build_dir}/lib/libmruby.flags.mak" => [__FILE__, libfile("#{build_dir}/lib/libmruby")] do |t| 6 file "#{build_dir}/lib/libmruby.flags.mak" => [__FILE__, libmruby_static] do |t| 7 mkdir_p File.dirname t.name 7 8 open(t.name, 'w') do |f| 8 9 f.puts "MRUBY_CFLAGS = #{cc.all_flags}" … … 18 19 f.puts "MRUBY_LIBS = #{linker.option_library % 'mruby'} #{linker.library_flags(gem_libraries)}" 19 20 20 f.puts "MRUBY_LIBMRUBY_PATH = #{lib file("#{build_dir}/lib/libmruby")}"21 f.puts "MRUBY_LIBMRUBY_PATH = #{libmruby_static}" 21 22 end 22 23 end -
EcnlProtoTool/trunk/mruby-2.1.1/tasks/mrbgems.rake
r331 r439 6 6 7 7 # loader all gems 8 self.libmruby << objfile("#{build_dir}/mrbgems/gem_init")8 self.libmruby_objs << objfile("#{build_dir}/mrbgems/gem_init") 9 9 file objfile("#{build_dir}/mrbgems/gem_init") => ["#{build_dir}/mrbgems/gem_init.c", "#{build_dir}/LEGAL"] 10 10 file "#{build_dir}/mrbgems/gem_init.c" => [MRUBY_CONFIG, __FILE__] do |t| 11 FileUtils.mkdir_p "#{build_dir}/mrbgems"11 mkdir_p "#{build_dir}/mrbgems" 12 12 open(t.name, 'w') do |f| 13 13 gem_func_gems = gems.select { |g| g.generate_functions } … … 19 19 s << " GENERATED_TMP_mrb_#{g.funcname}_gem_init(mrb);\n" 20 20 end 21 gem_final_calls = gem_func_gems. each_with_object('') do |g, s|21 gem_final_calls = gem_func_gems.reverse_each.with_object('') do |g, s| 22 22 s << " GENERATED_TMP_mrb_#{g.funcname}_gem_final(mrb);\n" 23 23 end … … 35 35 f.puts %Q[] 36 36 f.write gem_func_decls 37 unless gem_final_calls.empty? 37 38 f.puts %Q[] 38 f.puts %Q[static void] 39 f.puts %Q[mrb_final_mrbgems(mrb_state *mrb) {] 40 f.write gem_final_calls 41 f.puts %Q[}] 39 f.puts %Q[static void] 40 f.puts %Q[mrb_final_mrbgems(mrb_state *mrb) {] 41 f.write gem_final_calls 42 f.puts %Q[}] 43 end 42 44 f.puts %Q[] 43 45 f.puts %Q[void] … … 52 54 # legal documents 53 55 file "#{build_dir}/LEGAL" => [MRUBY_CONFIG, __FILE__] do |t| 56 mkdir_p File.dirname t.name 54 57 open(t.name, 'w+') do |f| 55 58 f.puts <<LEGAL -
EcnlProtoTool/trunk/mruby-2.1.1/tasks/toolchains/android.rake
r331 r439 8 8 /usr/local/opt/android-sdk/ndk-bundle 9 9 /usr/local/opt/android-ndk 10 ~/Android/Sdk/ndk-bundle 10 11 %LOCALAPPDATA%/Android/android-sdk/ndk-bundle 11 12 %LOCALAPPDATA%/Android/android-ndk 13 %LOCALAPPDATA%/Android/Sdk/ndk/* 12 14 ~/Library/Android/sdk/ndk-bundle 13 15 ~/Library/Android/ndk … … 37 39 Set ANDROID_PLATFORM environment variable or set :platform parameter 38 40 EOM 41 end 42 end 43 44 class SysrootNotReady < StandardError 45 def message 46 <<-EOM 47 Couldn't find standard header files 48 Please Move/Copy important file inside 49 <NDK_HOME>/sysroot/usr/include/ 50 to 51 <NDK_HOME>/platforms/<ANDROID_VERSION>/<ARCH>/usr/include/ 52 Higher NDK version will be use. 53 EOM 39 54 end 40 55 end … … 67 82 68 83 def home_path 69 @home_path ||= Pathname (84 @home_path ||= Pathname.new( 70 85 params[:ndk_home] || 71 86 ENV['ANDROID_NDK_HOME'] || … … 74 89 path.gsub! '\\', '/' 75 90 path.gsub! '~', Dir.home || '~' 91 path.gsub!('*') do 92 next nil unless path[-1] == "*" 93 dirs = Dir.glob(path).collect do |d| 94 m = d.match(/(\d+)\.(\d+)\.(\d+)$/) 95 m ? [m[1], m[2], m[3]].collect { |v| v.to_i } : nil 96 end 97 dirs.compact! 98 dirs.sort! do |before, after| 99 f = 0 100 if (f = (after.first <=> before.first)) != 0 101 next f 102 elsif (f = (after[1] <=> before[1])) != 0 103 next f 104 else 105 next after.last <=> before.last 106 end 107 end 108 dirs.empty? ? nil.to_s : dirs.first.join(".") 109 end 76 110 File.directory?(path) 77 111 } || raise(AndroidNDKHomeNotFound) … … 124 158 Dir.glob(path.to_s){ |item| 125 159 next if File.file?(item) 126 path = Pathname (item)160 path = Pathname.new(item) 127 161 break 128 162 } … … 146 180 147 181 def sysroot 148 @sysroot ||= home_path.join('platforms', platform, 182 return @sysroot if @sysroot 183 sysroot_path = home_path.join('platforms', platform, 149 184 case arch 150 185 when /armeabi/ then 'arch-arm' … … 156 191 end 157 192 ).to_s 193 if Dir.exist?(File.join(sysroot_path, "usr", "include")) 194 return @sysroot = sysroot_path 195 else 196 raise(SysrootNotReady) 197 end 158 198 end 159 199 … … 259 299 flags = [] 260 300 301 case RUBY_PLATFORM 302 when /mswin|mingw|win32/ 303 # Build for Android dont need window flag 304 flags += %W(-U_WIN32 -U_WIN64) 305 end 306 261 307 flags += %W(-MMD -MP -D__android__ -DANDROID --sysroot="#{sysroot}") 262 308 flags += ctarget … … 264 310 when :gcc 265 311 when :clang 266 flags += %W(-gcc-toolchain "#{gcc_toolchain_path .to_s}" -Wno-invalid-command-line-argument -Wno-unused-command-line-argument)312 flags += %W(-gcc-toolchain "#{gcc_toolchain_path}" -Wno-invalid-command-line-argument -Wno-unused-command-line-argument) 267 313 end 268 314 flags += %W(-fpic -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes) -
EcnlProtoTool/trunk/mruby-2.1.1/tasks/toolchains/clang.rake
r331 r439 1 1 MRuby::Toolchain.new(:clang) do |conf, _params| 2 toolchain :gcc 2 toolchain :gcc, default_command: 'clang' 3 3 4 4 [conf.cc, conf.objc, conf.asm].each do |cc| 5 cc. command = ENV['CC'] || 'clang'5 cc.flags << '-Wzero-length-array' unless ENV['CFLAGS'] 6 6 end 7 conf.cxx.command = ENV['CXX'] || 'clang++' 8 conf.linker.command = ENV['LD'] || 'clang' 7 conf.cxx.flags << '-Wzero-length-array' unless ENV['CXXFLAGS'] || ENV['CFLAGS'] 9 8 end -
EcnlProtoTool/trunk/mruby-2.1.1/tasks/toolchains/emscripten.rake
r321 r439 1 MRuby::Toolchain.new(:emscripten) do |conf |2 toolchain :gcc 1 MRuby::Toolchain.new(:emscripten) do |conf, _params| 2 toolchain :gcc, default_command: 'emcc' 3 3 4 conf.cc do |cc| 5 cc.command = "emcc" 6 cc.flags.push(%w(-Wall -Werror-implicit-function-declaration -O0)) 7 cc.flags[0].delete_at(cc.flags[0].rindex("-Og")) 4 [conf.cc, conf.objc, conf.asm].each do |cc| 5 i = cc.flags[1][0].rindex("-Og") 6 cc.flags[1][0][i] = "-O3" if i 8 7 end 9 8 10 conf.cxx do |cxx|11 cxx.command = "emcc"12 cxx.flags.push(%w(-Wall -Werror-implicit-function-declaration -O0))13 cxx.flags[0].delete_at(cxx.flags[0].rindex("-Og"))14 end15 16 conf.linker.command = "emcc"17 9 conf.archiver.command = "emar" 18 10 conf.exts.executable = '.js' -
EcnlProtoTool/trunk/mruby-2.1.1/tasks/toolchains/gcc.rake
r331 r439 1 MRuby::Toolchain.new(:gcc) do |conf, _params| 2 [conf.cc, conf.objc, conf.asm].each do |cc| 3 cc.command = ENV['CC'] || 'gcc' 4 cc.flags = [ENV['CFLAGS'] || %w(-g -std=gnu99 -Og -Wall -Werror-implicit-function-declaration -Wdeclaration-after-statement -Wwrite-strings)] 5 cc.defines = %w(DISABLE_GEMS) 6 cc.option_include_path = '-I%s' 7 cc.option_define = '-D%s' 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' 11 end 1 MRuby::Toolchain.new(:gcc) do |conf, params| 2 default_command = params[:default_command] || 'gcc' 3 compiler_flags = %w(-g3 -Og -Wall -Wundef) 4 c_mandatory_flags = %w(-std=gnu99) 5 cxx_invalid_flags = %w(-Wdeclaration-after-statement -Werror-implicit-function-declaration) 12 6 13 [conf.cxx].each do |cxx| 14 cxx.command = ENV['CXX'] || 'g++' 15 cxx.flags = [ENV['CXXFLAGS'] || ENV['CFLAGS'] || %w(-g -Og -Wall -Werror-implicit-function-declaration)] 16 cxx.defines = %w(DISABLE_GEMS) 17 cxx.option_include_path = '-I%s' 18 cxx.option_define = '-D%s' 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' 7 [conf.cc, conf.objc, conf.asm, conf.cxx].each do |compiler| 8 if compiler == conf.cxx 9 compiler.command = ENV['CXX'] || default_command.sub(/cc|$/, '++') 10 compiler.flags = [ENV['CXXFLAGS'] || ENV['CFLAGS'] || compiler_flags] 11 else 12 compiler.command = ENV['CC'] || default_command 13 compiler.flags = [c_mandatory_flags, ENV['CFLAGS'] || [compiler_flags, cxx_invalid_flags, %w(-Wwrite-strings)]] 14 end 15 compiler.option_include_path = %q[-I"%s"] 16 compiler.option_define = '-D%s' 17 compiler.compile_options = %q[%{flags} -MMD -o "%{outfile}" -c "%{infile}"] 18 compiler.cxx_compile_flag = '-x c++ -std=gnu++03' 19 compiler.cxx_exception_flag = '-fexceptions' 20 compiler.cxx_invalid_flags = c_mandatory_flags + cxx_invalid_flags 22 21 end 23 22 24 23 conf.linker do |linker| 25 linker.command = ENV['LD'] || 'gcc'24 linker.command = ENV['LD'] || ENV['CXX'] || ENV['CC'] || default_command 26 25 linker.flags = [ENV['LDFLAGS'] || %w()] 27 26 linker.libraries = %w(m) … … 29 28 linker.option_library = '-l%s' 30 29 linker.option_library_path = '-L%s' 31 linker.link_options = '%{flags} -o %{outfile}%{objs} %{flags_before_libraries} %{libs} %{flags_after_libraries}'30 linker.link_options = '%{flags} -o "%{outfile}" %{objs} %{flags_before_libraries} %{libs} %{flags_after_libraries}' 32 31 end 33 32 … … 56 55 end 57 56 end 57 58 def conf.enable_sanitizer(*opts) 59 fail 'sanitizer already set' if @sanitizer_list 60 61 @sanitizer_list = opts 62 flg = "-fsanitize=#{opts.join ','}" 63 [self.cc, self.cxx, self.linker].each{|cmd| cmd.flags << flg } 64 end 58 65 end -
EcnlProtoTool/trunk/mruby-2.1.1/tasks/toolchains/openwrt.rake
r331 r439 6 6 cc.flags = ENV['TARGET_CFLAGS'] 7 7 cc.include_paths = ["#{MRUBY_ROOT}/include"] 8 cc.defines = %w(DISABLE_GEMS) 9 cc.option_include_path = '-I%s' 8 cc.option_include_path = %q[-I"%s"] 10 9 cc.option_define = '-D%s' 11 cc.compile_options = '%{flags} -MMD -o %{outfile} -c %{infile}'10 cc.compile_options = %q[%{flags} -MMD -o "%{outfile}" -c "%{infile}"] 12 11 end 13 12 … … 16 15 cxx.flags = ENV['TARGET_CXXFLAGS'] 17 16 cxx.include_paths = ["#{MRUBY_ROOT}/include"] 18 cxx.defines = %w(DISABLE_GEMS) 19 cxx.option_include_path = '-I%s' 17 cxx.option_include_path = %q[-I"%s"] 20 18 cxx.option_define = '-D%s' 21 cxx.compile_options = '%{flags} -MMD -o %{outfile} -c %{infile}'19 cxx.compile_options = %q[%{flags} -MMD -o "%{outfile}" -c "%{infile}"] 22 20 end 23 21 … … 29 27 linker.option_library = '-l%s' 30 28 linker.option_library_path = '-L%s' 31 linker.link_options = '%{flags} -o %{outfile}%{objs} %{flags_before_libraries} %{libs} %{flags_after_libraries}'29 linker.link_options = '%{flags} -o "%{outfile}" %{objs} %{flags_before_libraries} %{libs} %{flags_after_libraries}' 32 30 end 33 31 34 32 conf.archiver do |archiver| 35 33 archiver.command = ENV['TARGET_AR'] 36 archiver.archive_options = 'rs %{outfile}%{objs}'34 archiver.archive_options = 'rs "%{outfile}" %{objs}' 37 35 end 38 36 end -
EcnlProtoTool/trunk/mruby-2.1.1/tasks/toolchains/visualcpp.rake
r331 r439 1 1 MRuby::Toolchain.new(:visualcpp) do |conf, _params| 2 conf.file_separator = '\\' 3 2 4 conf.cc do |cc| 3 5 cc.command = ENV['CC'] || 'cl.exe' 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)] 6 cc.defines = %w(DISABLE_GEMS MRB_STACK_EXTEND_DOUBLING) 7 cc.option_include_path = '/I%s' 6 cc.flags = [ENV['CFLAGS'] || %w(/c /nologo /utf-8 /W4 /GS /analyze- /Zc:wchar_t /Zi /O2 /Zc:inline /fp:precise /errorReport:prompt /WX- /Zc:forScope /Gd /Oy- /MD /EHsc /DWIN32 /DNDEBUG /D_CONSOLE /D_CRT_SECURE_NO_WARNINGS)] 7 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) 8 cc.flags << %w(/wd4214 /wd4100 /wd4996) 9 cc.flags << ["/Fd\"#{conf.build_dir.gsub('/', conf.file_separator)}\\vc142.pdb\""] 10 cc.flags << ["/Fp\"%{outdir}\\%{outfilebase}.pch\""] 11 cc.defines = %w(MRB_STACK_EXTEND_DOUBLING) 12 cc.option_include_path = %q[/I"%s"] 8 13 cc.option_define = '/D%s' 9 cc.compile_options = "%{flags} /Fo%{outfile} %{infile}"14 cc.compile_options = %Q[%{flags} /Fo"%{outfile}" "%{infile}"] 10 15 cc.cxx_compile_flag = '/TP' 11 16 cc.cxx_exception_flag = '/EHs' … … 14 19 conf.cxx do |cxx| 15 20 cxx.command = ENV['CXX'] || 'cl.exe' 16 cxx.flags = [ENV['CXXFLAGS'] || ENV['CFLAGS'] || %w(/c /nologo /W3 /Zi /MD /O2 /EHs /utf-8 /D_CRT_SECURE_NO_WARNINGS)] 17 cxx.defines = %w(DISABLE_GEMS MRB_STACK_EXTEND_DOUBLING) 18 cxx.option_include_path = '/I%s' 21 cxx.flags = [ENV['CXXFLAGS'] || ENV['CFLAGS'] || %w(/c /nologo /utf-8 /W4 /GS /analyze- /Zc:wchar_t /Zi /O2 /Zc:inline /fp:precise /errorReport:prompt /WX- /Zc:forScope /Gd /Oy- /MD /EHsc /DWIN32 /DNDEBUG /D_CONSOLE /D_CRT_SECURE_NO_WARNINGS)] 22 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) 23 cxx.flags << %w(/wd4214 /wd4100 /wd4996) 24 cxx.flags << ["/Fd\"#{conf.build_dir.gsub('/', conf.file_separator)}\\vc142.pdb\""] 25 cxx.flags << ["/Fp\"%{outdir}\\%{outfilebase}.pch\""] 26 cxx.defines = %w(MRB_STACK_EXTEND_DOUBLING) 27 cxx.option_include_path = %q[/I"%s"] 19 28 cxx.option_define = '/D%s' 20 cxx.compile_options = "%{flags} /Fo%{outfile} %{infile}"29 cxx.compile_options = %Q[%{flags} /Fo"%{outfile}" "%{infile}"] 21 30 cxx.cxx_compile_flag = '/TP' 22 31 cxx.cxx_exception_flag = '/EHs' … … 25 34 conf.linker do |linker| 26 35 linker.command = ENV['LD'] || 'link.exe' 27 linker.flags = [ENV['LDFLAGS'] || %w(/MANIFEST /NXCOMPAT /DYNAMICBASE /MACHINE:X86 /INCREMENTAL /SUBSYSTEM:CONSOLE /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /ERRORREPORT:PROMPT /NOLOGO /TLBID:1)] 28 linker.flags << "/PDB:\"#{conf.build_dir}\\vc140.pdb\"" 29 #linker.flags << "/PGD:\"%{outdir}\\%{outfilebase}.pgd\"" 30 linker.flags << "/ManifestFile:\"%{outdir}\\%{outfilebase}.exe.intermediate.manifest\"" 36 linker.flags = [ENV['LDFLAGS'] || %w(/MANIFEST /NXCOMPAT /DYNAMICBASE /DEBUG /OPT:REF /INCREMENTAL:NO /SUBSYSTEM:CONSOLE /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /OPT:ICF /ERRORREPORT:PROMPT /NOLOGO /TLBID:1)] 37 #linker.flags = [ENV['LDFLAGS'] || %w(/MANIFEST /LTCG:incremental /NXCOMPAT /DYNAMICBASE /DEBUG /OPT:REF /INCREMENTAL:NO /SUBSYSTEM:CONSOLE /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /OPT:ICF /ERRORREPORT:PROMPT /NOLOGO /TLBID:1)] 38 #linker.flags << ["/PGD:\"%{outdir}\\%{outfilebase}.pgd\""] 39 linker.flags << ["/PDB:\"#{conf.build_dir.gsub('/', conf.file_separator)}\\vc142.pdb\""] 40 linker.flags << ["/ManifestFile:\"%{outdir}\\%{outfilebase}.exe.intermediate.manifest\""] 31 41 linker.libraries = %w() 32 42 linker.library_paths = %w() 33 43 linker.option_library = '%s.lib' 34 44 linker.option_library_path = '/LIBPATH:%s' 35 linker.link_options = "%{flags} /OUT:%{outfile} %{objs} %{flags_before_libraries} %{libs} %{flags_after_libraries}"45 linker.link_options = %Q[%{flags} /OUT:"%{outfile}" %{objs} %{flags_before_libraries} %{libs} %{flags_after_libraries}] 36 46 end 37 47 38 48 conf.archiver do |archiver| 39 49 archiver.command = ENV['AR'] || 'lib.exe' 40 archiver.archive_options = '/nologo /OUT: %{outfile}%{objs}'50 archiver.archive_options = '/nologo /OUT:"%{outfile}" %{objs}' 41 51 end 42 52 43 53 conf.yacc do |yacc| 44 54 yacc.command = ENV['YACC'] || 'bison.exe' 45 yacc.compile_options = '-o %{outfile} %{infile}'55 yacc.compile_options = %q[-o "%{outfile}" "%{infile}"] 46 56 end 47 57 48 58 conf.gperf do |gperf| 49 59 gperf.command = 'gperf.exe' 50 gperf.compile_options = '-L ANSI-C -C -p -j1 -i 1 -g -o -t -N mrb_reserved_word -k"1,3,$" %{infile} > %{outfile}'60 gperf.compile_options = %q[-L ANSI-C -C -p -j1 -i 1 -g -o -t -N mrb_reserved_word -k"1,3,$" "%{infile}" > "%{outfile}"] 51 61 end 52 62 … … 57 67 end 58 68 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 <= 1764 m = "# VS2010/2012 support will be dropped after the next release! #"65 h = "#" * m.length66 puts h, m, h67 end68 end69 end70 71 69 end -
EcnlProtoTool/trunk/mruby-2.1.1/test/assert.rb
r331 r439 1 $undefined = Object.new 1 2 $ok_test = 0 2 3 $ko_test = 0 3 4 $kill_test = 0 5 $warning_test = 0 6 $skip_test = 0 4 7 $asserts = [] 5 8 $test_start = Time.now if Object.const_defined?(:Time) 6 9 7 # Implementation of print due to the reason that there might be no print 8 def t_print(*args) 9 i = 0 10 len = args.size 11 while i < len 12 str = args[i].to_s 13 __t_printstr__ str rescue print str 14 i += 1 10 # For bintest on Ruby 11 unless RUBY_ENGINE == "mruby" 12 def t_print(*args) 13 print(*args) 14 $stdout.flush 15 nil 16 end 17 18 def _str_match?(pattern, str) 19 File.fnmatch?(pattern, str, File::FNM_EXTGLOB|File::FNM_DOTMATCH) 20 end 21 end 22 23 class Array 24 def _assertion_join 25 join("-") 26 end 27 end 28 29 class String 30 def _assertion_indent(indent) 31 indent = indent.to_s 32 off = 0 33 str = self 34 while nl = index("\n", off) 35 nl += 1 36 nl += 1 while slice(nl) == "\n" 37 break if nl >= size 38 str = indent.dup if off == 0 39 str += slice(off, nl - off) + indent 40 off = nl 41 end 42 43 if off == 0 44 str = indent + self 45 else 46 str += slice(off..-1) 47 end 48 49 str 15 50 end 16 51 end … … 20 55 def assertion_string(err, str, iso=nil, e=nil, bt=nil) 21 56 msg = "#{err}#{str}" 22 msg += " [#{iso}]" if iso && iso != '' 23 msg += " => #{e.message}" if e 24 msg += " (mrbgems: #{GEMNAME})" if Object.const_defined?(:GEMNAME) 25 if $mrbtest_assert && $mrbtest_assert.size > 0 26 $mrbtest_assert.each do |idx, str, diff| 27 msg += "\n - Assertion[#{idx}] Failed: #{str}\n#{diff}" 28 end 29 end 30 msg += "\nbacktrace:\n\t#{bt.join("\n\t")}" if bt 57 msg += " [#{iso}]" if iso && !iso.empty? 58 msg += " => #{e}" if e && !e.to_s.empty? 59 msg += " (#{GEMNAME == 'mruby-test' ? 'core' : "mrbgems: #{GEMNAME}"})" 60 if $mrbtest_assert 61 $mrbtest_assert.each do |idx, assert_msg, diff| 62 msg += "\n - Assertion[#{idx}]" 63 msg += " #{assert_msg}." if assert_msg && !assert_msg.empty? 64 msg += "\n#{diff}" if diff && !diff.empty? 65 end 66 end 67 msg += "\nbacktrace:\n #{bt.join("\n ")}" if bt 31 68 msg 32 69 end … … 40 77 # which will be tested by this 41 78 # assertion 42 def assert(str = ' Assertion failed', iso = '')79 def assert(str = 'assert', iso = '') 43 80 t_print(str, (iso != '' ? " [#{iso}]" : ''), ' : ') if $mrbtest_verbose 44 81 begin 82 $mrbtest_child_noassert ||= [0] 83 $mrbtest_child_noassert << 0 84 parent_asserts = $asserts 85 $asserts = [] 86 parent_mrbtest_assert = $mrbtest_assert 45 87 $mrbtest_assert = [] 46 $mrbtest_assert_idx = 0 88 89 if $mrbtest_assert_idx && !$mrbtest_assert_idx.empty? 90 $mrbtest_assert_idx[-1] += 1 91 $mrbtest_assert_idx << 0 92 else 93 $mrbtest_assert_idx = [0] 94 class << $mrbtest_assert_idx 95 alias to_s _assertion_join 96 end 97 end 98 47 99 yield 48 if($mrbtest_assert.size > 0) 49 $asserts.push(assertion_string('Fail: ', str, iso, nil)) 50 $ko_test += 1 51 t_print('F') 100 if $mrbtest_assert.size > 0 101 if $mrbtest_assert.size == $mrbtest_child_noassert[-1] 102 $asserts.push(assertion_string('Skip: ', str, iso)) 103 $mrbtest_child_noassert[-2] += 1 104 $skip_test += 1 105 t_print('?') 106 else 107 $asserts.push(assertion_string('Fail: ', str, iso)) 108 $ko_test += 1 109 t_print('F') 110 end 111 elsif $mrbtest_assert_idx[-1] == 0 112 $asserts.push(assertion_string('Warn: ', str, iso, 'no assertion')) 113 $warning_test += 1 114 t_print('W') 52 115 else 53 116 $ok_test += 1 54 117 t_print('.') 55 118 end 119 rescue MRubyTestSkip => e 120 $asserts.push(assertion_string('Skip: ', str, iso, e)) 121 $skip_test += 1 122 $mrbtest_child_noassert[-2] += 1 123 t_print('?') 56 124 rescue Exception => e 57 125 bt = e.backtrace if $mrbtest_verbose 58 if e.class.to_s == 'MRubyTestSkip' 59 $asserts.push "Skip: #{str} #{iso} #{e.cause}" 60 t_print('?') 126 $asserts.push(assertion_string("#{e.class}: ", str, iso, e, bt)) 127 $kill_test += 1 128 t_print('X') 129 ensure 130 if $mrbtest_assert_idx.size > 1 131 $asserts.each do |mesg| 132 idx = $mrbtest_assert_idx[0..-2]._assertion_join 133 mesg = mesg._assertion_indent(" ") 134 135 # Give `mesg` as a `diff` argument to avoid adding extra periods. 136 parent_mrbtest_assert << [idx, nil, mesg] 137 end 61 138 else 62 $asserts.push(assertion_string("#{e.class}: ", str, iso, e, bt)) 63 $kill_test += 1 64 t_print('X') 65 end 66 ensure 67 $mrbtest_assert = nil 139 parent_asserts.concat $asserts 140 end 141 $asserts = parent_asserts 142 143 $mrbtest_assert = parent_mrbtest_assert 144 $mrbtest_assert_idx.pop 145 $mrbtest_assert_idx = nil if $mrbtest_assert_idx.empty? 146 $mrbtest_child_noassert.pop 147 148 nil 68 149 end 69 150 t_print("\n") if $mrbtest_verbose … … 71 152 72 153 def assertion_diff(exp, act) 73 " Expected: #{exp.inspect}\n" +154 " Expected: #{exp.inspect}\n" \ 74 155 " Actual: #{act.inspect}" 75 156 end 76 157 77 def assert_true(ret, msg = nil, diff = nil) 78 if $mrbtest_assert 79 $mrbtest_assert_idx += 1 80 unless ret 81 msg = "Expected #{ret.inspect} to be true" unless msg 82 diff = assertion_diff(true, ret) unless diff 83 $mrbtest_assert.push([$mrbtest_assert_idx, msg, diff]) 84 end 85 end 86 ret 87 end 88 89 def assert_false(ret, msg = nil, diff = nil) 90 if $mrbtest_assert 91 $mrbtest_assert_idx += 1 92 if ret 93 msg = "Expected #{ret.inspect} to be false" unless msg 94 diff = assertion_diff(false, ret) unless diff 95 96 $mrbtest_assert.push([$mrbtest_assert_idx, msg, diff]) 97 end 98 end 99 !ret 100 end 101 102 def assert_equal(arg1, arg2 = nil, arg3 = nil) 103 if block_given? 104 exp, act, msg = arg1, yield, arg2 105 else 106 exp, act, msg = arg1, arg2, arg3 107 end 108 109 msg = "Expected to be equal" unless msg 110 diff = assertion_diff(exp, act) 111 assert_true(exp == act, msg, diff) 112 end 113 114 def assert_not_equal(arg1, arg2 = nil, arg3 = nil) 115 if block_given? 116 exp, act, msg = arg1, yield, arg2 117 else 118 exp, act, msg = arg1, arg2, arg3 119 end 120 121 msg = "Expected to be not equal" unless msg 122 diff = assertion_diff(exp, act) 123 assert_false(exp == act, msg, diff) 158 def assert_true(obj, msg = nil, diff = nil) 159 if $mrbtest_assert_idx && $mrbtest_assert_idx.size > 0 160 $mrbtest_assert_idx[-1] += 1 161 unless obj == true 162 diff ||= " Expected #{obj.inspect} to be true." 163 $mrbtest_assert.push([$mrbtest_assert_idx.to_s, msg, diff]) 164 end 165 end 166 obj 167 end 168 169 def assert_false(obj, msg = nil, diff = nil) 170 unless obj == false 171 diff ||= " Expected #{obj.inspect} to be false." 172 end 173 assert_true(!obj, msg, diff) 174 end 175 176 def assert_equal(exp, act_or_msg = nil, msg = nil, &block) 177 ret, exp, act, msg = _eval_assertion(:==, exp, act_or_msg, msg, block) 178 unless ret 179 diff = assertion_diff(exp, act) 180 end 181 assert_true(ret, msg, diff) 182 end 183 184 def assert_not_equal(exp, act_or_msg = nil, msg = nil, &block) 185 ret, exp, act, msg = _eval_assertion(:==, exp, act_or_msg, msg, block) 186 if ret 187 diff = " Expected #{act.inspect} to not be equal to #{exp.inspect}." 188 end 189 assert_true(!ret, msg, diff) 190 end 191 192 def assert_same(*args); _assert_same(true, *args) end 193 def assert_not_same(*args); _assert_same(false, *args) end 194 def _assert_same(affirmed, exp, act, msg = nil) 195 unless ret = exp.equal?(act) == affirmed 196 exp_str, act_str = [exp, act].map do |o| 197 "#{o.inspect} (class=#{o.class}, oid=#{o.__id__})" 198 end 199 diff = " Expected #{act_str} to #{'not ' unless affirmed}be the same as #{exp_str}." 200 end 201 assert_true(ret, msg, diff) 124 202 end 125 203 126 204 def assert_nil(obj, msg = nil) 127 msg = "Expected #{obj.inspect} to be nil" unless msg 128 diff = assertion_diff(nil, obj) 129 assert_true(obj.nil?, msg, diff) 130 end 131 132 def assert_include(collection, obj, msg = nil) 133 msg = "Expected #{collection.inspect} to include #{obj.inspect}" unless msg 134 diff = " Collection: #{collection.inspect}\n" + 135 " Object: #{obj.inspect}" 136 assert_true(collection.include?(obj), msg, diff) 137 end 138 139 def assert_not_include(collection, obj, msg = nil) 140 msg = "Expected #{collection.inspect} to not include #{obj.inspect}" unless msg 141 diff = " Collection: #{collection.inspect}\n" + 142 " Object: #{obj.inspect}" 143 assert_false(collection.include?(obj), msg, diff) 144 end 145 146 def assert_raise(*exp) 147 ret = true 148 if $mrbtest_assert 149 $mrbtest_assert_idx += 1 150 msg = exp.last.class == String ? exp.pop : nil 151 msg = msg.to_s + " : " if msg 152 should_raise = false 153 begin 154 yield 155 should_raise = true 156 rescue Exception => e 157 msg = "#{msg}#{exp.inspect} exception expected, not" 158 diff = " Class: <#{e.class}>\n" + 159 " Message: #{e.message}" 160 if not exp.any?{|ex| ex.instance_of?(Module) ? e.kind_of?(ex) : ex == e.class } 161 $mrbtest_assert.push([$mrbtest_assert_idx, msg, diff]) 162 ret = false 163 end 164 end 165 166 exp = exp.first if exp.first 167 if should_raise 168 msg = "#{msg}#{exp.inspect} expected but nothing was raised." 169 $mrbtest_assert.push([$mrbtest_assert_idx, msg, nil]) 170 ret = false 171 end 172 end 173 ret 174 end 175 176 def assert_nothing_raised(*exp) 177 ret = true 178 if $mrbtest_assert 179 $mrbtest_assert_idx += 1 180 msg = exp.last.class == String ? exp.pop : "" 181 begin 182 yield 183 rescue Exception => e 184 msg = "#{msg} exception raised." 185 diff = " Class: <#{e.class}>\n" + 186 " Message: #{e.message}" 187 $mrbtest_assert.push([$mrbtest_assert_idx, msg, diff]) 188 ret = false 189 end 190 end 191 ret 205 unless ret = obj.nil? 206 diff = " Expected #{obj.inspect} to be nil." 207 end 208 assert_true(ret, msg, diff) 209 end 210 211 def assert_not_nil(obj, msg = nil) 212 if ret = obj.nil? 213 diff = " Expected #{obj.inspect} to not be nil." 214 end 215 assert_false(ret, msg, diff) 216 end 217 218 def assert_include(*args); _assert_include(true, *args) end 219 def assert_not_include(*args); _assert_include(false, *args) end 220 def _assert_include(affirmed, collection, obj, msg = nil) 221 unless ret = collection.include?(obj) == affirmed 222 diff = " Expected #{collection.inspect} to #{'not ' unless affirmed}include #{obj.inspect}." 223 end 224 assert_true(ret, msg, diff) 225 end 226 227 def assert_predicate(*args); _assert_predicate(true, *args) end 228 def assert_not_predicate(*args); _assert_predicate(false, *args) end 229 def _assert_predicate(affirmed, obj, op, msg = nil) 230 unless ret = obj.__send__(op) == affirmed 231 diff = " Expected #{obj.inspect} to #{'not ' unless affirmed}be #{op}." 232 end 233 assert_true(ret, msg, diff) 234 end 235 236 def assert_operator(*args); _assert_operator(true, *args) end 237 def assert_not_operator(*args); _assert_operator(false, *args) end 238 def _assert_operator(affirmed, obj1, op, obj2 = $undefined, msg = nil) 239 return _assert_predicate(affirmed, obj1, op, msg) if $undefined.equal?(obj2) 240 unless ret = obj1.__send__(op, obj2) == affirmed 241 diff = " Expected #{obj1.inspect} to #{'not ' unless affirmed}be #{op} #{obj2.inspect}." 242 end 243 assert_true(ret, msg, diff) 244 end 245 246 ## 247 # Fail unless +str+ matches against +pattern+. 248 # 249 # +pattern+ is interpreted as pattern for File.fnmatch?. It may contain the 250 # following metacharacters: 251 # 252 # <code>*</code> :: 253 # Matches any string. 254 # 255 # <code>?</code> :: 256 # Matches any one character. 257 # 258 # <code>[_SET_]</code>, <code>[^_SET_]</code> (<code>[!_SET_]</code>) :: 259 # Matches any one character in _SET_. Behaves like character sets in 260 # Regexp, including set negation (<code>[^a-z]</code>). 261 # 262 # <code>{_A_,_B_}</code> :: 263 # Matches pattern _A_ or pattern _B_. 264 # 265 # <code> \ </code> :: 266 # Escapes the next character. 267 def assert_match(*args); _assert_match(true, *args) end 268 def assert_not_match(*args); _assert_match(false, *args) end 269 def _assert_match(affirmed, pattern, str, msg = nil) 270 unless ret = _str_match?(pattern, str) == affirmed 271 diff = " Expected #{pattern.inspect} to #{'not ' unless affirmed}match #{str.inspect}." 272 end 273 assert_true(ret, msg, diff) 192 274 end 193 275 … … 195 277 # Fails unless +obj+ is a kind of +cls+. 196 278 def assert_kind_of(cls, obj, msg = nil) 197 msg = "Expected #{obj.inspect} to be a kind of #{cls}, not #{obj.class}" unless msg 198 diff = assertion_diff(cls, obj.class) 199 assert_true(obj.kind_of?(cls), msg, diff) 279 unless ret = obj.kind_of?(cls) 280 diff = " Expected #{obj.inspect} to be a kind of #{cls}, not #{obj.class}." 281 end 282 assert_true(ret, msg, diff) 200 283 end 201 284 … … 203 286 # Fails unless +exp+ is equal to +act+ in terms of a Float 204 287 def assert_float(exp, act, msg = nil) 205 msg = "Float #{exp} expected to be equal to float #{act}" unless msg 206 diff = assertion_diff(exp, act) 207 assert_true check_float(exp, act), msg, diff 288 e, a = exp.to_f, act.to_f 289 if e.finite? && a.finite? && (n = (e - a).abs) > Mrbtest::FLOAT_TOLERANCE 290 flunk(msg, " Expected |#{exp} - #{act}| (#{n}) to be <= #{Mrbtest::FLOAT_TOLERANCE}.") 291 elsif (e.infinite? || a.infinite?) && e != a || 292 e.nan? && !a.nan? || !e.nan? && a.nan? 293 flunk(msg, " Expected #{act} to be #{exp}.") 294 else 295 pass 296 end 297 end 298 299 def assert_raise(*exc) 300 msg = (exc.last.is_a? String) ? exc.pop : nil 301 exc = exc.empty? ? StandardError : exc.size == 1 ? exc[0] : exc 302 begin 303 yield 304 rescue *exc => e 305 pass 306 e 307 rescue Exception => e 308 diff = " #{exc} exception expected, not\n" \ 309 " Class: <#{e.class}>\n" \ 310 " Message: <#{e}>" 311 flunk(msg, diff) 312 else 313 diff = " #{exc} expected but nothing was raised." 314 flunk(msg, diff) 315 end 316 end 317 318 def assert_nothing_raised(msg = nil) 319 begin 320 yield 321 rescue Exception => e 322 diff = " Exception raised:\n" \ 323 " Class: <#{e.class}>\n" \ 324 " Message: <#{e}>" 325 flunk(msg, diff) 326 else 327 pass 328 end 329 end 330 331 def assert_raise_with_message(*args, &block) 332 _assert_raise_with_message(:plain, *args, &block) 333 end 334 def assert_raise_with_message_pattern(*args, &block) 335 _assert_raise_with_message(:pattern, *args, &block) 336 end 337 def _assert_raise_with_message(type, exc, exp_msg, msg = nil, &block) 338 e = msg ? assert_raise(exc, msg, &block) : assert_raise(exc, &block) 339 e ? ($mrbtest_assert_idx[-1]-=1) : (return e) 340 341 err_msg = e.message 342 unless ret = type == :pattern ? _str_match?(exp_msg, err_msg) : exp_msg == err_msg 343 diff = " Expected Exception(#{exc}) was raised, but the message doesn't match.\n" 344 if type == :pattern 345 diff += " Expected #{exp_msg.inspect} to match #{err_msg.inspect}." 346 else 347 diff += assertion_diff(exp_msg, err_msg) 348 end 349 end 350 assert_true(ret, msg, diff) 351 end 352 353 def pass 354 assert_true(true) 355 end 356 357 def flunk(msg = "Epic Fail!", diff = "") 358 assert_true(false, msg, diff) 208 359 end 209 360 … … 211 362 # Report the test result and print all assertions 212 363 # which were reported broken. 213 def report ()364 def report 214 365 t_print("\n") 215 366 216 367 $asserts.each do |msg| 217 t_print "#{msg}\n" 218 end 219 220 $total_test = $ok_test+$ko_test+$kill_test 221 t_print("Total: #{$total_test}\n") 222 223 t_print(" OK: #{$ok_test}\n") 224 t_print(" KO: #{$ko_test}\n") 225 t_print("Crash: #{$kill_test}\n") 368 t_print("#{msg}\n") 369 end 370 371 $total_test = $ok_test + $ko_test + $kill_test + $warning_test + $skip_test 372 t_print(" Total: #{$total_test}\n") 373 374 t_print(" OK: #{$ok_test}\n") 375 t_print(" KO: #{$ko_test}\n") 376 t_print(" Crash: #{$kill_test}\n") 377 t_print("Warning: #{$warning_test}\n") 378 t_print(" Skip: #{$skip_test}\n") 226 379 227 380 if Object.const_defined?(:Time) 228 381 t_time = Time.now - $test_start 229 t_print(" Time: #{t_time.round(2)} seconds\n") 230 end 231 end 232 233 ## 234 # Performs fuzzy check for equality on methods returning floats 235 def check_float(a, b) 236 tolerance = Mrbtest::FLOAT_TOLERANCE 237 a = a.to_f 238 b = b.to_f 239 if a.finite? and b.finite? 240 (a-b).abs < tolerance 382 t_print(" Time: #{t_time.round(2)} seconds\n") 383 end 384 385 $ko_test == 0 && $kill_test == 0 386 end 387 388 def _eval_assertion(meth, exp, act_or_msg, msg, block) 389 if block 390 exp, act, msg = exp, block.call, act_or_msg 241 391 else 242 true 243 end 392 exp, act, msg = exp, act_or_msg, msg 393 end 394 return exp.__send__(meth, act), exp, act, msg 244 395 end 245 396 246 397 ## 247 398 # Skip the test 248 class MRubyTestSkip < NotImplementedError 249 attr_accessor :cause 250 def initialize(cause) 251 @cause = cause 252 end 253 end 399 class MRubyTestSkip < NotImplementedError; end 254 400 255 401 def skip(cause = "") -
EcnlProtoTool/trunk/mruby-2.1.1/test/bintest.rb
r331 r439 1 1 $:.unshift File.dirname(File.dirname(File.expand_path(__FILE__))) 2 2 require 'test/assert.rb' 3 4 GEMNAME = "" 3 5 4 6 def cmd(s) … … 20 22 end 21 23 24 print "bintest - Command Binary Test\n\n" 25 22 26 ARGV.each do |gem| 27 case gem 28 when '-v'; $mrbtest_verbose = true 29 end 30 23 31 case RbConfig::CONFIG['host_os'] 24 32 when /mswin(?!ce)|mingw|bccwin/ … … 27 35 28 36 Dir["#{gem}/bintest/**/*.rb"].each do |file| 37 GEMNAME.replace(File.basename(gem)) 29 38 load file 30 39 end 31 40 end 32 41 33 load 'test/report.rb' 42 exit report -
EcnlProtoTool/trunk/mruby-2.1.1/test/t/array.rb
r331 r439 56 56 57 57 a = [ "a", "b", "c", "d", "e" ] 58 assert_equal("b", a[1.1])59 58 assert_equal(["b", "c"], a[1,2]) 60 59 assert_equal(["b", "c", "d"], a[1..-2]) 60 skip unless Object.const_defined?(:Float) 61 assert_equal("b", a[1.1]) 61 62 end 62 63 … … 238 239 assert_equal([1,2], a) 239 240 assert_equal(3, b) 241 242 assert_raise(FrozenError) { [].freeze.pop } 240 243 end 241 244 … … 285 288 assert_equal([2,3], a) 286 289 assert_equal(1, b) 290 291 assert_raise(FrozenError) { [].freeze.shift } 287 292 end 288 293 … … 294 299 295 300 assert('Array#slice', '15.2.12.5.29') do 296 a = "12345".slice(1, 3) 297 b = a.slice(0) 298 299 assert_equal("2:", "#{b}:") 300 assert_equal(2, [1,2,3].[](1)) 301 a = [*(1..100)] 302 b = a.dup 303 304 assert_equal(1, a.slice(0)) 305 assert_equal(100, a.slice(99)) 306 assert_nil(a.slice(100)) 307 assert_equal(100, a.slice(-1)) 308 assert_equal(99, a.slice(-2)) 309 assert_equal(1, a.slice(-100)) 310 assert_nil(a.slice(-101)) 311 assert_equal([1], a.slice(0,1)) 312 assert_equal([100], a.slice(99,1)) 313 assert_equal([], a.slice(100,1)) 314 assert_equal([100], a.slice(99,100)) 315 assert_equal([100], a.slice(-1,1)) 316 assert_equal([99], a.slice(-2,1)) 317 assert_equal([10, 11, 12], a.slice(9, 3)) 318 assert_equal([10, 11, 12], a.slice(-91, 3)) 319 assert_nil(a.slice(-101, 2)) 320 assert_equal([1], a.slice(0..0)) 321 assert_equal([100], a.slice(99..99)) 322 assert_equal([], a.slice(100..100)) 323 assert_equal([100], a.slice(99..200)) 324 assert_equal([100], a.slice(-1..-1)) 325 assert_equal([99], a.slice(-2..-2)) 326 assert_equal([10, 11, 12], a.slice(9..11)) 327 assert_equal([10, 11, 12], a.slice(-91..-89)) 328 assert_equal([10, 11, 12], a.slice(-91..-89)) 329 assert_nil(a.slice(-101..-1)) 330 assert_nil(a.slice(10, -3)) 331 assert_equal([], a.slice(10..7)) 332 assert_equal(b, a) 301 333 end 302 334 … … 315 347 assert('Array#to_s', '15.2.12.5.31 / 15.2.12.5.32') do 316 348 a = [2, 3, 4, 5] 349 a[4] = a 317 350 r1 = a.to_s 318 351 r2 = a.inspect 319 352 320 353 assert_equal(r2, r1) 321 assert_equal("[2, 3, 4, 5 ]", r1)354 assert_equal("[2, 3, 4, 5, [...]]", r1) 322 355 end 323 356 … … 356 389 357 390 # Not ISO specified 358 359 assert("Array (Shared Array Corruption)") do360 a = [ "a", "b", "c", "d", "e", "f" ]361 b = a.slice(1, 3)362 a.clear363 b.clear364 end365 391 366 392 assert("Array (Longish inline array)") do … … 383 409 end 384 410 411 assert('Array#sort!') do 412 a = [3, 2, 1] 413 assert_equal a, a.sort! # sort! returns self. 414 assert_equal [1, 2, 3], a # it is sorted. 415 end 416 385 417 assert('Array#freeze') do 386 418 a = [].freeze 387 assert_raise( RuntimeError) do419 assert_raise(FrozenError) do 388 420 a[0] = 1 389 421 end -
EcnlProtoTool/trunk/mruby-2.1.1/test/t/bs_block.rb
r321 r439 337 337 assert('BS Block 28') do 338 338 assert_equal(10) do 339 3.times{ |bl|339 3.times{ 340 340 break 10 341 341 } … … 409 409 410 410 assert('BS Block [ruby-core:14395]') do 411 class Controller 412 def respond_to(&block) 413 responder = Responder.new 414 block.call(responder) 415 responder.respond 416 end 417 def test_for_bug 418 respond_to{|format| 419 format.js{ 420 "in test" 421 render{|obj| 422 obj 411 assert_nothing_raised do 412 class Controller 413 def respond_to(&block) 414 responder = Responder.new 415 block.call(responder) 416 responder.respond 417 end 418 def test_for_bug 419 respond_to{|format| 420 format.js{ 421 "in test" 422 render{|obj| 423 obj 424 } 423 425 } 424 426 } 425 } 426 end 427 def render(&block) 428 "in render" 429 end 430 end 431 432 class Responder 433 def method_missing(symbol, &block) 434 "enter method_missing" 435 @response = Proc.new{ 436 'in method missing' 437 block.call 438 } 439 "leave method_missing" 440 end 441 def respond 442 @response.call 443 end 444 end 445 t = Controller.new 446 assert_true t.test_for_bug 427 end 428 def render(&block) 429 "in render" 430 end 431 end 432 class Responder 433 def method_missing(symbol, &block) 434 "enter method_missing" 435 @response = Proc.new{ 436 'in method missing' 437 block.call 438 } 439 "leave method_missing" 440 end 441 def respond 442 @response.call 443 end 444 end 445 t = Controller.new 446 t.test_for_bug 447 end 447 448 end 448 449 -
EcnlProtoTool/trunk/mruby-2.1.1/test/t/class.rb
r331 r439 37 37 assert('Class#new', '15.2.3.3.3') do 38 38 assert_raise(TypeError, 'Singleton should raise TypeError') do 39 "a".singleton_class.new39 (class <<"a"; self; end).new 40 40 end 41 41 … … 237 237 end 238 238 239 assert('class to return nil if body is empty') do 240 assert_nil(class C end) 241 assert_nil(class << self; end) 242 end 243 239 244 assert('raise when superclass is not a class') do 240 245 module FirstModule; end … … 294 299 end 295 300 296 assert_false baz.singleton_methods.include? :run_foo_mod 297 assert_false baz.singleton_methods.include? :run_baz 298 299 assert_raise(NoMethodError, 'should raise NoMethodError') do 300 baz.run_foo_mod 301 end 302 assert_raise(NoMethodError, 'should raise NoMethodError') do 303 baz.run_baz 304 end 301 assert_equal :run_baz, baz 305 302 306 303 assert_raise(NoMethodError, 'should raise NoMethodError') do … … 319 316 end 320 317 321 assert_true baz. singleton_methods.include? :run_baz322 assert_true baz. singleton_methods.include? :run_foo_mod318 assert_true baz.respond_to? :run_baz 319 assert_true baz.respond_to? :run_foo_mod 323 320 assert_equal 100, baz.run_foo_mod 324 321 assert_equal 300, baz.run_baz … … 359 356 end 360 357 end 361 end 358 end if Object.const_defined?(:Float) 359 360 o = Object.new 361 sc = class << o; self end 362 o.freeze 363 assert_predicate(sc, :frozen?) 364 365 assert_predicate(class << Object.new.freeze; self end, :frozen?) 362 366 end 363 367 … … 369 373 end 370 374 371 Foo.clone.new.func375 assert_true(Foo.clone.new.func) 372 376 end 373 377 … … 437 441 end 438 442 443 assert('class variable for frozen class/module') do 444 module CVarForFrozenModule 445 freeze 446 assert_raise(FrozenError) { @@cv = 1 } 447 end 448 449 class CVarForFrozenClassA 450 @@a = nil 451 freeze 452 end 453 class CVarForFrozenClassB < CVarForFrozenClassA 454 def a=(v) 455 @@a = v 456 end 457 end 458 b = CVarForFrozenClassB.new 459 assert_raise(FrozenError) { b.a = 1 } 460 end 461 439 462 assert('class with non-class/module outer raises TypeError') do 440 463 assert_raise(TypeError) { class 0::C1; end } 441 464 assert_raise(TypeError) { class []::C2; end } 442 465 end 443 444 assert("remove_method doesn't segfault if the passed in argument isn't a symbol") do445 klass = Class.new446 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-2.1.1/test/t/codegen.rb
r331 r439 74 74 assert_equal [2], a 75 75 end 76 77 assert('register window of calls (#3783)') do 78 # NODE_FOR 79 assert_nothing_raised do 80 for i in []; end 81 end 82 83 # NODE_SYMBOLS 84 assert_nothing_raised do 85 %i(sym) 86 end 87 88 # NODE_SCALL 89 assert_nothing_raised do 90 Object.new&.__id__ 91 end 92 93 # NODE_RESCUE with splat 94 assert_nothing_raised do 95 begin 96 raise 97 rescue *[Exception] 98 end 99 end 100 101 # NODE_CASE 102 assert_nothing_raised do 103 case 1 104 when nil 105 end 106 end 107 108 # NODE_CASE with splat 109 assert_nothing_raised do 110 case 1 111 when *nil 112 end 113 end 114 115 # NODE_HASH 116 assert_nothing_raised do 117 {}.merge( 118 0=>0, 1=>1, 2=>2, 3=>3, 4=>4, 5=>5, 6=>6, 7=>7, 8=>8, 9=>9, 119 10=>10, 11=>11, 12=>12, 13=>13, 14=>14, 15=>15, 16=>16, 17=>17, 18=>18, 19=>19, 120 20=>20, 21=>21, 22=>22, 23=>23, 24=>24, 25=>25, 26=>26, 27=>27, 28=>28, 29=>29, 121 30=>30, 31=>31, 32=>32, 33=>33, 34=>34, 35=>35, 36=>36, 37=>37, 38=>38, 39=>39, 122 40=>40, 41=>41, 42=>42, 43=>43, 44=>44, 45=>45, 46=>46, 47=>47, 48=>48, 49=>49, 123 50=>50, 51=>51, 52=>52, 53=>53, 54=>54, 55=>55, 56=>56, 57=>57, 58=>58, 59=>59, 124 60=>60, 61=>61, 62=>62, 63=>63, 64=>64, 65=>65, 66=>66, 67=>67, 68=>68, 69=>69, 125 70=>70, 71=>71, 72=>72, 73=>73, 74=>74, 75=>75, 76=>76, 77=>77, 78=>78, 79=>79, 126 80=>80, 81=>81, 82=>82, 83=>83, 84=>84, 85=>85, 86=>86, 87=>87, 88=>88, 89=>89, 127 90=>90, 91=>91, 92=>92, 93=>93, 94=>94, 95=>95, 96=>96, 97=>97, 98=>98, 99=>99, 128 100=>100, 101=>101, 102=>102, 103=>103, 104=>104, 105=>105, 106=>106, 107=>107, 108=>108, 109=>109, 129 110=>110, 111=>111, 112=>112, 113=>113, 114=>114, 115=>115, 116=>116, 117=>117, 118=>118, 119=>119, 130 120=>120, 121=>121, 122=>122, 123=>123, 124=>124, 125=>125, 126=>126) 131 end 132 133 # NODE_OP_ASGN 134 o = Object.new 135 class << o 136 attr_accessor :a 137 end 138 139 o.a = 1 140 assert_nothing_raised{ o.a += 1 } 141 o.a = 1 142 assert_nothing_raised{ o.a <<= 1 } 143 o.a = 1 144 assert_nothing_raised{ o.a &&= 1 } 145 146 o = { k: 1 } 147 assert_nothing_raised{ o[:k] += 1 } 148 o = { k: 1 } 149 assert_nothing_raised{ o[:k] <<= 1 } 150 o = { k: 1 } 151 assert_nothing_raised{ o[:k] &&= 1 } 152 153 o = { k: 1 } 154 assert_nothing_raised{ o[*[:k]] += 1 } 155 o = { k: 1 } 156 assert_nothing_raised{ o[*[:k]] <<= 1 } 157 o = { k: 1 } 158 assert_nothing_raised{ o[*[:k]] &&= 1 } 159 160 # NODE_YIELD 161 def check_node_yield 162 yield 163 end 164 assert_nothing_raised do 165 check_node_yield{} 166 end 167 168 # NODE_DXSTR 169 assert_raise(NotImplementedError){ `#{:dynamic}` } 170 171 # NODE_XSTR 172 assert_raise(NotImplementedError){ `static` } 173 174 # NODE_DREGX 175 class Regexp; end 176 assert_raise(NoMethodError){ /#{'dynamic'}tail/ } 177 assert_raise(NoMethodError){ /#{'dynamic'}tail/iu } 178 179 # NODE_REGX 180 assert_raise(NoMethodError){ /static/ } 181 assert_raise(NoMethodError){ /static/iu } 182 Object.remove_const :Regexp 183 184 # NODE_UNDEF 185 assert_nothing_raised do 186 class << Object.new 187 undef inspect 188 end 189 end 190 191 # NODE_ALIAS 192 assert_nothing_raised do 193 class << Object.new 194 alias inspect2 inspect 195 end 196 end 197 end -
EcnlProtoTool/trunk/mruby-2.1.1/test/t/enumerable.rb
r321 r439 46 46 assert('Enumerable#detect', '15.3.2.2.4') do 47 47 assert_equal 1, [1,2,3].detect() { true } 48 assert_equal 'a', [1,2,3].detect( "a") { false }48 assert_equal 'a', [1,2,3].detect(->{"a"}) { false } 49 49 end 50 50 … … 65 65 assert('Enumerable#find', '15.3.2.2.7') do 66 66 assert_equal 1, [1,2,3].find() { true } 67 assert_equal 'a', [1,2,3].find( "a") { false }67 assert_equal 'a', [1,2,3].find(->{"a"}) { false } 68 68 end 69 69 70 70 assert('Enumerable#find_all', '15.3.2.2.8') do 71 assert_ true [1,2,3,4,5,6,7,8,9].find_all() {|i| i%2 == 0}, [2,4,6,8]71 assert_equal [2,4,6,8], [1,2,3,4,5,6,7,8,9].find_all() {|i| i%2 == 0} 72 72 end 73 73 -
EcnlProtoTool/trunk/mruby-2.1.1/test/t/exception.rb
r331 r439 264 264 265 265 assert('Exception 14') do 266 def exception_test14; UnknownConstant;end266 def (o = Object.new).exception_test14; UnknownConstant end 267 267 a = :ng 268 268 begin 269 send(:exception_test14)269 o.__send__(:exception_test14) 270 270 rescue 271 271 a = :ok … … 353 353 end 354 354 355 assert('Exception#inspect without message') do355 assert('Exception#inspect') do 356 356 assert_equal "Exception", Exception.new.inspect 357 assert_equal "Exception", Exception.new("").inspect 358 assert_equal "error! (Exception)", Exception.new("error!").inspect 357 359 end 358 360 … … 399 401 rescue => exception 400 402 GC.start 401 assert_equal("#{__FILE__}:#{line} :in call",403 assert_equal("#{__FILE__}:#{line}", 402 404 exception.backtrace.first) 403 405 end … … 417 419 [3].each do 418 420 end 419 assert_equal("#{__FILE__}:#{line} :in call",421 assert_equal("#{__FILE__}:#{line}", 420 422 exception.backtrace.first) 421 423 end -
EcnlProtoTool/trunk/mruby-2.1.1/test/t/float.rb
r331 r439 1 1 ## 2 2 # Float ISO Test 3 4 if Object.const_defined?(:Float) 3 5 4 6 assert('Float', '15.2.9') do … … 81 83 82 84 assert('Float#finite?', '15.2.9.3.9') do 83 assert_ true 3.123456789.finite?84 assert_ false (1.0 / 0.0).finite?85 assert_predicate 3.123456789, :finite? 86 assert_not_predicate 1.0 / 0.0, :finite? 85 87 end 86 88 … … 138 140 assert_raise(FloatDomainError){ nan.round } 139 141 assert_raise(FloatDomainError){ nan.round(-1) } 140 assert_ true(nan.round(1).nan?)142 assert_predicate(nan.round(1), :nan?) 141 143 end 142 144 … … 177 179 178 180 assert('Float#nan?') do 179 assert_ true (0.0/0.0).nan?180 assert_ false 0.0.nan?181 assert_ false (1.0/0.0).nan?182 assert_ false (-1.0/0.0).nan?181 assert_predicate(0.0/0.0, :nan?) 182 assert_not_predicate(0.0, :nan?) 183 assert_not_predicate(1.0/0.0, :nan?) 184 assert_not_predicate(-1.0/0.0, :nan?) 183 185 end 184 186 … … 204 206 assert_equal(-1, -23.0 >> 128) 205 207 end 208 209 assert('Float#to_s') do 210 uses_float = 4e38.infinite? # enable MRB_USE_FLOAT? 211 212 assert_equal("Infinity", Float::INFINITY.to_s) 213 assert_equal("-Infinity", (-Float::INFINITY).to_s) 214 assert_equal("NaN", Float::NAN.to_s) 215 assert_equal("0", 0.0.to_s) 216 assert_equal("-0", -0.0.to_s) 217 assert_equal("-3.25", -3.25.to_s) 218 assert_equal("50", 50.0.to_s) 219 assert_equal("0.0125", 0.0125.to_s) 220 assert_equal("-0.0125", -0.0125.to_s) 221 assert_equal("1.0e-10", 0.0000000001.to_s) 222 assert_equal("-1.0e-10", -0.0000000001.to_s) 223 assert_equal("1.0e+20", 1e20.to_s) 224 assert_equal("-1.0e+20", -1e20.to_s) 225 assert_equal("1.0e+16", 10000000000000000.0.to_s) 226 assert_equal("-1.0e+16", -10000000000000000.0.to_s) 227 assert_equal("100000", 100000.0.to_s) 228 assert_equal("-100000", -100000.0.to_s) 229 if uses_float 230 assert_equal("1.0e+08", 100000000.0.to_s) 231 assert_equal("-1.0e+08", -100000000.0.to_s) 232 assert_equal("1.0e+07", 10000000.0.to_s) 233 assert_equal("-1.0e+07", -10000000.0.to_s) 234 else 235 assert_equal("1.0e+15", 1000000000000000.0.to_s) 236 assert_equal("-1.0e+15", -1000000000000000.0.to_s) 237 assert_equal("100000000000000", 100000000000000.0.to_s) 238 assert_equal("-100000000000000", -100000000000000.0.to_s) 239 end 240 end 241 242 assert('Float#eql?') do 243 assert_operator(5.0, :eql?, 5.0) 244 assert_not_operator(5.0, :eql?, 5) 245 assert_not_operator(5.0, :eql?, "5.0") 246 end 247 248 end # const_defined?(:Float) -
EcnlProtoTool/trunk/mruby-2.1.1/test/t/hash.rb
r331 r439 9 9 assert_true({ 'abc' => 'abc' } == { 'abc' => 'abc' }) 10 10 assert_false({ 'abc' => 'abc' } == { 'cba' => 'cba' }) 11 assert_false({ :a => 1 } == true) 12 skip unless Object.const_defined?(:Float) 11 13 assert_true({ :equal => 1 } == { :equal => 1.0 }) 12 assert_false({ :a => 1 } == true)13 14 end 14 15 … … 83 84 84 85 assert('Hash#delete', '15.2.13.4.8') do 85 a = { 'abc' => ' abc' }86 b = { 'abc' => ' abc' }86 a = { 'abc' => 'ABC' } 87 b = { 'abc' => 'ABC' } 87 88 b_tmp_1 = false 88 89 b_tmp_2 = false 89 90 90 a .delete('abc')91 assert_equal 'ABC', a.delete('abc') 91 92 b.delete('abc') do |k| 92 93 b_tmp_1 = true … … 352 353 assert('Hash#inspect') do 353 354 h = { "c" => 300, "a" => 100, "d" => 400, "c" => 300 } 355 h["recur"] = h 354 356 ret = h.to_s 355 357 … … 357 359 assert_include ret, '"a"=>100' 358 360 assert_include ret, '"d"=>400' 361 assert_include ret, '"recur"=>{...}' 359 362 end 360 363 … … 370 373 assert('Hash#freeze') do 371 374 h = {}.freeze 372 assert_raise( RuntimeError) do375 assert_raise(FrozenError) do 373 376 h[:a] = 'b' 374 377 end -
EcnlProtoTool/trunk/mruby-2.1.1/test/t/integer.rb
r331 r439 8 8 assert('Integer#+', '15.2.8.3.1') do 9 9 a = 1+1 10 b = 1+1.0 10 b = 1+1.0 if Object.const_defined?(:Float) 11 11 12 12 assert_equal 2, a 13 assert_equal 2.0, b 13 assert_equal 2.0, b if Object.const_defined?(:Float) 14 14 15 15 assert_raise(TypeError){ 0+nil } … … 18 18 c = Mrbtest::FIXNUM_MAX + 1 19 19 d = Mrbtest::FIXNUM_MAX.__send__(:+, 1) 20 21 skip unless Object.const_defined?(:Float) 20 22 e = Mrbtest::FIXNUM_MAX + 1.0 21 23 assert_equal Float, c.class … … 27 29 assert('Integer#-', '15.2.8.3.2') do 28 30 a = 2-1 29 b = 2-1.0 31 b = 2-1.0 if Object.const_defined?(:Float) 30 32 31 33 assert_equal 1, a 32 assert_equal 1.0, b 34 assert_equal 1.0, b if Object.const_defined?(:Float) 33 35 34 36 c = Mrbtest::FIXNUM_MIN - 1 35 37 d = Mrbtest::FIXNUM_MIN.__send__(:-, 1) 38 39 skip unless Object.const_defined?(:Float) 36 40 e = Mrbtest::FIXNUM_MIN - 1.0 37 41 assert_equal Float, c.class … … 43 47 assert('Integer#*', '15.2.8.3.3') do 44 48 a = 1*1 45 b = 1*1.0 49 b = 1*1.0 if Object.const_defined?(:Float) 46 50 47 51 assert_equal 1, a 48 assert_equal 1.0, b 52 assert_equal 1.0, b if Object.const_defined?(:Float) 49 53 50 54 assert_raise(TypeError){ 0*nil } … … 53 57 c = Mrbtest::FIXNUM_MAX * 2 54 58 d = Mrbtest::FIXNUM_MAX.__send__(:*, 2) 59 60 skip unless Object.const_defined?(:Float) 55 61 e = Mrbtest::FIXNUM_MAX * 2.0 56 62 assert_equal Float, c.class … … 149 155 assert_equal 23, 46 << -1 150 156 151 # Left Shift by 31 is bitShift overflow to SignedInt152 assert_equal 2147483648, 1 << 31 153 154 # -3 Left Shift by 30 is bitShift overflow to SignedInt155 assert_ equal(-3221225472, -3 << 30)157 skip unless Object.const_defined?(:Float) 158 159 # Overflow to Fixnum 160 assert_float 9223372036854775808.0, 1 << 63 161 assert_float(-13835058055282163712.0, -3 << 62) 156 162 end 157 163 … … 218 224 219 225 assert('Integer#to_f', '15.2.8.3.23') do 226 skip unless Object.const_defined?(:Float) 220 227 assert_equal 1.0, 1.to_f 221 228 end … … 226 233 227 234 assert('Integer#to_s', '15.2.8.3.25') do 228 assert_equal '1', 1.to_s 229 assert_equal("-1", -1.to_s) 235 assert_equal "1", 1.to_s 236 assert_equal "-1", -1.to_s 237 assert_equal "1010", 10.to_s(2) 238 assert_equal "a", 10.to_s(36) 239 assert_equal "-a", -10.to_s(36) 240 assert_equal "30071", 12345.to_s(8) 241 assert_raise(ArgumentError) { 10.to_s(-1) } 242 assert_raise(ArgumentError) { 10.to_s(0) } 243 assert_raise(ArgumentError) { 10.to_s(1) } 244 assert_raise(ArgumentError) { 10.to_s(37) } 230 245 end 231 246 … … 251 266 assert_equal [ 1, -6], -13.divmod(-7) 252 267 end 253 254 # Not ISO specified255 256 assert('Integer#step') do257 a = []258 b = []259 1.step(3) do |i|260 a << i261 end262 1.step(6, 2) do |i|263 b << i264 end265 266 assert_equal [1, 2, 3], a267 assert_equal [1, 3, 5], b268 end -
EcnlProtoTool/trunk/mruby-2.1.1/test/t/kernel.rb
r331 r439 32 32 # Kernel.eval is provided by the mruby-gem mrbgem. '15.3.1.2.3' 33 33 34 assert('Kernel.global_variables', '15.3.1.2.4') do35 assert_equal Array, Kernel.global_variables.class36 end37 38 34 assert('Kernel.iterator?', '15.3.1.2.5') do 39 35 assert_false Kernel.iterator? … … 52 48 assert_equal Proc, m.class 53 49 end 54 55 # Not implemented at the moment56 #assert('Kernel.local_variables', '15.3.1.2.7') do57 # Kernel.local_variables.class == Array58 #end59 50 60 51 assert('Kernel.loop', '15.3.1.2.8') do … … 109 100 assert_true __send__(:respond_to?, :nil?) 110 101 # test without argument and without block 111 assert_equal Array, __send__(:public_methods).class102 assert_equal String, __send__(:to_s).class 112 103 end 113 104 … … 177 168 assert_false b.respond_to?(:test) 178 169 assert_true c.respond_to?(:test) 170 171 a.freeze 172 d = a.clone 173 assert_true d.frozen? 179 174 end 180 175 … … 246 241 assert_true a.respond_to?(:test_method) 247 242 assert_false b.respond_to?(:test_method) 243 244 assert_raise(FrozenError) { Object.new.freeze.extend(Test4ExtendModule) } 245 assert_raise(FrozenError, TypeError) { :sym.extend(Test4ExtendModule) } 248 246 end 249 247 … … 263 261 assert_equal 0, 0.freeze 264 262 assert_equal :a, :a.freeze 265 end 266 267 assert('Kernel#global_variables', '15.3.1.3.14') do 268 assert_equal Array, global_variables.class 263 assert_equal true, true.freeze 264 assert_equal false, false.freeze 265 assert_equal nil, nil.freeze 266 skip unless Object.const_defined?(:Float) 267 assert_equal 0.0, 0.0.freeze 268 end 269 270 assert('Kernel#frozen?') do 271 assert_false "".frozen? 272 assert_true "".freeze.frozen? 273 assert_true 0.frozen? 274 assert_true :a.frozen? 275 assert_true true.frozen? 276 assert_true false.frozen? 277 assert_true nil.frozen? 278 skip unless Object.const_defined?(:Float) 279 assert_true 0.0.frozen? 269 280 end 270 281 … … 278 289 assert_equal String, s.class 279 290 assert_equal "main", s 280 end281 282 assert('Kernel#instance_variable_defined?', '15.3.1.3.20') do283 o = Object.new284 o.instance_variable_set(:@a, 1)285 286 assert_true o.instance_variable_defined?("@a")287 assert_false o.instance_variable_defined?("@b")288 assert_true o.instance_variable_defined?("@a"[0,2])289 assert_true o.instance_variable_defined?("@abc"[0,2])290 end291 292 assert('Kernel#instance_variables', '15.3.1.3.23') do293 o = Object.new294 o.instance_eval do295 @a = 11296 @b = 12297 end298 ivars = o.instance_variables299 300 assert_equal Array, ivars.class,301 assert_equal(2, ivars.size)302 assert_true ivars.include?(:@a)303 assert_true ivars.include?(:@b)304 291 end 305 292 … … 335 322 end 336 323 337 # Not implemented yet338 #assert('Kernel#local_variables', '15.3.1.3.28') do339 # local_variables.class == Array340 #end341 342 324 assert('Kernel#loop', '15.3.1.3.29') do 343 325 i = 0 … … 360 342 assert_equal 'A call to no_method_named_this', mm_test.no_method_named_this 361 343 344 class SuperMMTestClass < MMTestClass 345 def no_super_method_named_this 346 super 347 end 348 end 349 super_mm_test = SuperMMTestClass.new 350 assert_equal 'A call to no_super_method_named_this', super_mm_test.no_super_method_named_this 351 352 class NoSuperMethodTestClass 353 def no_super_method_named_this 354 super 355 end 356 end 357 no_super_test = NoSuperMethodTestClass.new 358 msg = "undefined method 'no_super_method_named_this'" 359 assert_raise_with_message(NoMethodError, msg) do 360 no_super_test.no_super_method_named_this 361 end 362 362 363 a = String.new 363 begin 364 msg = "undefined method 'no_method_named_this'" 365 assert_raise_with_message(NoMethodError, msg) do 364 366 a.no_method_named_this 365 rescue NoMethodError => e 366 assert_equal "undefined method 'no_method_named_this' for \"\"", e.message 367 end 368 369 class ShortInspectClass 370 def inspect 371 'An inspect string' 372 end 373 end 374 b = ShortInspectClass.new 375 begin 376 b.no_method_named_this 377 rescue NoMethodError => e 378 assert_equal "undefined method 'no_method_named_this' for An inspect string", e.message 379 end 380 381 class LongInspectClass 382 def inspect 383 "A" * 70 384 end 385 end 386 c = LongInspectClass.new 387 begin 388 c.no_method_named_this 389 rescue NoMethodError => e 390 assert_equal "undefined method 'no_method_named_this' for #{c.to_s}", e.message 391 end 392 393 class NoInspectClass 394 undef inspect 395 end 396 d = NoInspectClass.new 397 begin 398 d.no_method_named_this 399 rescue NoMethodError => e 400 assert_equal "undefined method 'no_method_named_this' for #{d.to_s}", e.message 401 end 402 end 403 404 assert('Kernel#methods', '15.3.1.3.31') do 405 assert_equal Array, methods.class 367 end 406 368 end 407 369 … … 429 391 # Kernel#print is defined in mruby-print mrbgem. '15.3.1.3.35' 430 392 431 assert('Kernel#private_methods', '15.3.1.3.36') do432 assert_equal Array, private_methods.class433 end434 435 assert('Kernel#protected_methods', '15.3.1.3.37') do436 assert_equal Array, protected_methods.class437 end438 439 assert('Kernel#public_methods', '15.3.1.3.38') do440 assert_equal Array, public_methods.class441 class Foo442 def foo443 end444 end445 assert_equal [:foo], Foo.new.public_methods(false)446 end447 448 393 # Kernel#puts is defined in mruby-print mrbgem. '15.3.1.3.39' 449 394 … … 471 416 tri = Test4RemoveInstanceVar.new 472 417 assert_equal 99, tri.var 473 tri.remove418 assert_equal 99, tri.remove 474 419 assert_equal nil, tri.var 475 assert_raise NameError do 476 tri.remove 477 end 420 assert_raise(NameError) { tri.remove } 421 assert_raise(NameError) { tri.remove_instance_variable(:var) } 422 assert_raise(FrozenError) { tri.freeze.remove } 423 assert_raise(FrozenError, NameError) { :a.remove_instance_variable(:@v) } 478 424 end 479 425 … … 506 452 end 507 453 508 assert('Kernel#send', '15.3.1.3.44') do509 # test with block510 l = send(:lambda) do511 true512 end513 514 assert_true l.call515 assert_equal l.class, Proc516 # test with argument517 assert_true send(:respond_to?, :nil?)518 # test without argument and without block519 assert_equal send(:public_methods).class, Array520 end521 522 assert('Kernel#singleton_methods', '15.3.1.3.45') do523 assert_equal singleton_methods.class, Array524 end525 526 454 assert('Kernel#to_s', '15.3.1.3.46') do 527 455 assert_equal to_s.class, String 528 end529 530 assert('Kernel#to_s on primitives') do531 begin532 Fixnum.alias_method :to_s_, :to_s533 Fixnum.remove_method :to_s534 535 assert_nothing_raised do536 # segfaults if mrb_cptr is used537 1.to_s538 end539 ensure540 Fixnum.alias_method :to_s, :to_s_541 Fixnum.remove_method :to_s_542 end543 end544 545 assert('Kernel.local_variables', '15.3.1.2.7') do546 a, b = 0, 1547 a += b548 549 vars = Kernel.local_variables.sort550 assert_equal [:a, :b, :vars], vars551 552 assert_equal [:a, :b, :c, :vars], Proc.new { |a, b|553 c = 2554 Kernel.local_variables.sort555 }.call(-1, -2)556 456 end 557 457 … … 598 498 end 599 499 600 assert('Kernel#global_variables') do601 variables = global_variables602 1.upto(9) do |i|603 assert_equal variables.include?(:"$#{i}"), true604 end605 end606 607 assert('Kernel#define_singleton_method') do608 o = Object.new609 ret = o.define_singleton_method(:test_method) do610 :singleton_method_ok611 end612 assert_equal :test_method, ret613 assert_equal :singleton_method_ok, o.test_method614 end615 616 500 assert('stack extend') do 617 501 def recurse(count, stop) -
EcnlProtoTool/trunk/mruby-2.1.1/test/t/lang.rb
r331 r439 9 9 # For example, the following mruby code: 10 10 # 11 # if i > 0 and i < 10 then11 # if i > 0 and i < 10 12 12 # 13 13 # compiles to the following byte code: … … 28 28 assert('and', '11.2.3') do 29 29 a = 1 30 if a > 0 and a < 10 then30 if a > 0 and a < 10 31 31 b = 1 32 32 else … … 35 35 assert_equal 1, b 36 36 37 if a < 0 and a < 10 then37 if a < 0 and a < 10 38 38 b = 1 39 39 else … … 42 42 assert_equal 0, b 43 43 44 if a < 0 and a > 10 then44 if a < 0 and a > 10 45 45 b = 1 46 46 else … … 52 52 assert('or','11.2.4') do 53 53 a = 1 54 if a > 0 or a < 10 then54 if a > 0 or a < 10 55 55 b = 1 56 56 else … … 59 59 assert_equal 1, b 60 60 61 if a < 0 or a < 10 then61 if a < 0 or a < 10 62 62 b = 1 63 63 else … … 66 66 assert_equal 1, b 67 67 68 if a < 0 or a > 10 then68 if a < 0 or a > 10 69 69 b = 1 70 70 else -
EcnlProtoTool/trunk/mruby-2.1.1/test/t/literals.rb
r331 r439 23 23 assert_equal 999, 0d999 24 24 assert_equal 999, 0D999 25 # decimal sep erator25 # decimal separator 26 26 assert_equal 10000000, 10_000_000 27 27 assert_equal 10, 1_0 -
EcnlProtoTool/trunk/mruby-2.1.1/test/t/module.rb
r331 r439 4 4 def labeled_module(name, &block) 5 5 Module.new do 6 singleton_class.class_eval do6 (class <<self; self end).class_eval do 7 7 define_method(:to_s) { name } 8 8 alias_method :inspect, :to_s … … 14 14 def labeled_class(name, supklass = Object, &block) 15 15 Class.new(supklass) do 16 singleton_class.class_eval do16 (class <<self; self end).class_eval do 17 17 define_method(:to_s) { name } 18 18 alias_method :inspect, :to_s … … 22 22 end 23 23 24 def assert_uninitialized_const(&block) 25 assert_raise_with_message_pattern(NameError, "uninitialized constant *", &block) 26 end 27 28 def assert_wrong_const_name(&block) 29 assert_raise_with_message_pattern(NameError, "wrong constant name *", &block) 30 end 31 24 32 assert('Module', '15.2.2') do 25 33 assert_equal Class, Module.class 26 34 end 27 35 36 assert('Module#alias_method', '15.2.2.4.8') do 37 cls = Class.new do 38 def foo 39 "FOO" 40 end 41 end 42 43 assert_same(cls, cls.alias_method(:bar, :foo)) 44 assert_equal("FOO", cls.new.bar) 45 end 46 28 47 # TODO not implemented ATM assert('Module.constants', '15.2.2.3.1') do 29 30 # TODO not implemented ATM assert('Module.nesting', '15.2.2.3.2') do31 48 32 49 assert('Module#ancestors', '15.2.2.4.9') do 33 50 class Test4ModuleAncestors 34 51 end 35 sc = Test4ModuleAncestors.singleton_class36 52 r = String.ancestors 37 53 … … 52 68 53 69 assert_equal Test4AppendFeatures2, Test4AppendFeatures2.const_get(:Const4AppendFeatures2) 70 assert_raise(FrozenError) { Module.new.append_features Class.new.freeze } 54 71 end 55 72 … … 202 219 end 203 220 end 204 r = Test4ClassEval.instance_methods205 206 221 assert_equal 11, Test4ClassEval.class_eval{ @a } 207 222 assert_equal 12, Test4ClassEval.class_eval{ @b } 208 assert_equal Array, r.class 209 assert_true r.include?(:method1) 210 end 211 212 assert('Module#class_variable_defined?', '15.2.2.4.16') do 213 class Test4ClassVariableDefined 214 @@cv = 99 215 end 216 217 assert_true Test4ClassVariableDefined.class_variable_defined?(:@@cv) 218 assert_false Test4ClassVariableDefined.class_variable_defined?(:@@noexisting) 219 end 220 221 assert('Module#class_variable_get', '15.2.2.4.17') do 222 class Test4ClassVariableGet 223 @@cv = 99 224 end 225 226 assert_equal 99, Test4ClassVariableGet.class_variable_get(:@@cv) 227 end 228 229 assert('Module#class_variable_set', '15.2.2.4.18') do 230 class Test4ClassVariableSet 231 @@foo = 100 232 def foo 233 @@foo 234 end 235 end 236 237 assert_true Test4ClassVariableSet.class_variable_set(:@@cv, 99) 238 assert_true Test4ClassVariableSet.class_variable_set(:@@foo, 101) 239 assert_true Test4ClassVariableSet.class_variables.include? :@@cv 240 assert_equal 99, Test4ClassVariableSet.class_variable_get(:@@cv) 241 assert_equal 101, Test4ClassVariableSet.new.foo 242 end 243 244 assert('Module#class_variables', '15.2.2.4.19') do 245 class Test4ClassVariables1 246 @@var1 = 1 247 end 248 class Test4ClassVariables2 < Test4ClassVariables1 249 @@var2 = 2 250 end 251 252 assert_equal [:@@var1], Test4ClassVariables1.class_variables 253 assert_equal [:@@var2, :@@var1], Test4ClassVariables2.class_variables 223 assert_equal true, Test4ClassEval.new.respond_to?(:method1) 254 224 end 255 225 … … 261 231 assert_true Test4ConstDefined.const_defined?(:Const4Test4ConstDefined) 262 232 assert_false Test4ConstDefined.const_defined?(:NotExisting) 233 assert_wrong_const_name{ Test4ConstDefined.const_defined?(:wrong_name) } 263 234 end 264 235 … … 269 240 270 241 assert_equal 42, Test4ConstGet.const_get(:Const4Test4ConstGet) 242 assert_equal 42, Test4ConstGet.const_get("Const4Test4ConstGet") 243 assert_equal 42, Object.const_get("Test4ConstGet::Const4Test4ConstGet") 244 245 assert_raise(TypeError){ Test4ConstGet.const_get(123) } 246 assert_uninitialized_const{ Test4ConstGet.const_get(:I_DO_NOT_EXIST) } 247 assert_uninitialized_const{ Test4ConstGet.const_get("I_DO_NOT_EXIST::ME_NEITHER") } 248 assert_wrong_const_name{ Test4ConstGet.const_get(:wrong_name) } 249 end 250 251 assert('Module#const_set', '15.2.2.4.23') do 252 module Test4ConstSet 253 Const4Test4ConstSet = 42 254 end 255 256 assert_equal 23, Test4ConstSet.const_set(:Const4Test4ConstSet, 23) 257 assert_equal 23, Test4ConstSet.const_get(:Const4Test4ConstSet) 258 ["", "wrongNAME", "Wrong-Name"].each do |n| 259 assert_wrong_const_name { Test4ConstSet.const_set(n, 1) } 260 end 261 end 262 263 assert('Module#remove_const', '15.2.2.4.40') do 264 module Test4RemoveConst 265 ExistingConst = 23 266 end 267 268 assert_equal 23, Test4RemoveConst.remove_const(:ExistingConst) 269 assert_false Test4RemoveConst.const_defined?(:ExistingConst) 270 assert_raise_with_message_pattern(NameError, "constant * not defined") do 271 Test4RemoveConst.remove_const(:NonExistingConst) 272 end 273 %i[x X!].each do |n| 274 assert_wrong_const_name { Test4RemoveConst.remove_const(n) } 275 end 276 assert_raise(FrozenError) { Test4RemoveConst.freeze.remove_const(:A) } 271 277 end 272 278 … … 281 287 end 282 288 283 assert('Module#const_get', '15.2.2.4.23') do 284 module Test4ConstSet 285 Const4Test4ConstSet = 42 286 end 287 288 assert_true Test4ConstSet.const_set(:Const4Test4ConstSet, 23) 289 assert_equal 23, Test4ConstSet.const_get(:Const4Test4ConstSet) 290 end 291 292 assert('Module#constants', '15.2.2.4.24') do 293 $n = [] 294 module TestA 295 C = 1 296 end 297 class TestB 298 include TestA 299 C2 = 1 300 $n = constants.sort 301 end 302 303 assert_equal [ :C ], TestA.constants 304 assert_equal [ :C, :C2 ], $n 289 assert('Module#extend_object', '15.2.2.4.25') do 290 cls = Class.new 291 mod = Module.new { def foo; end } 292 a = cls.new 293 b = cls.new 294 mod.extend_object(b) 295 assert_false a.respond_to?(:foo) 296 assert_true b.respond_to?(:foo) 297 assert_raise(FrozenError) { mod.extend_object(cls.new.freeze) } 298 assert_raise(FrozenError, TypeError) { mod.extend_object(1) } 305 299 end 306 300 … … 310 304 end 311 305 module Test4Include2 312 include Test4Include 306 @include_result = include Test4Include 307 class << self 308 attr_reader :include_result 309 end 313 310 end 314 311 315 312 assert_equal 42, Test4Include2.const_get(:Const4Include) 313 assert_equal Test4Include2, Test4Include2.include_result 314 assert_raise(FrozenError) { Module.new.freeze.include Test4Include } 316 315 end 317 316 … … 345 344 end 346 345 347 assert('Module#included_modules', '15.2.2.4.30') do348 module Test4includedModules349 end350 module Test4includedModules2351 include Test4includedModules352 end353 r = Test4includedModules2.included_modules354 355 assert_equal Array, r.class356 assert_true r.include?(Test4includedModules)357 end358 359 346 assert('Module#initialize', '15.2.2.4.31') do 360 347 assert_kind_of Module, Module.new 361 348 mod = Module.new { def hello; "hello"; end } 362 assert_equal [:hello], mod.instance_methods 349 cls = Class.new{include mod} 350 assert_true cls.new.respond_to?(:hello) 363 351 a = nil 364 352 mod = Module.new { |m| a = m } 365 353 assert_equal mod, a 366 end367 368 assert('Module#instance_methods', '15.2.2.4.33') do369 module Test4InstanceMethodsA370 def method1() end371 end372 class Test4InstanceMethodsB373 def method2() end374 end375 class Test4InstanceMethodsC < Test4InstanceMethodsB376 def method3() end377 end378 379 r = Test4InstanceMethodsC.instance_methods(true)380 381 assert_equal [:method1], Test4InstanceMethodsA.instance_methods382 assert_equal [:method2], Test4InstanceMethodsB.instance_methods(false)383 assert_equal [:method3], Test4InstanceMethodsC.instance_methods(false)384 assert_equal Array, r.class385 assert_true r.include?(:method3)386 assert_true r.include?(:method2)387 354 end 388 355 … … 410 377 end 411 378 412 413 379 assert('Module#module_eval', '15.2.2.4.35') do 414 380 module Test4ModuleEval … … 419 385 assert_equal 11, Test4ModuleEval.module_eval{ @a } 420 386 assert_equal 12, Test4ModuleEval.module_eval{ @b } 421 end422 423 assert('Module#remove_class_variable', '15.2.2.4.39') do424 class Test4RemoveClassVariable425 @@cv = 99426 end427 428 assert_equal 99, Test4RemoveClassVariable.remove_class_variable(:@@cv)429 assert_false Test4RemoveClassVariable.class_variables.include? :@@cv430 end431 432 assert('Module#remove_const', '15.2.2.4.40') do433 module Test4RemoveConst434 ExistingConst = 23435 end436 437 result = Test4RemoveConst.module_eval { remove_const :ExistingConst }438 439 name_error = false440 begin441 Test4RemoveConst.module_eval { remove_const :NonExistingConst }442 rescue NameError443 name_error = true444 end445 446 # Constant removed from Module447 assert_false Test4RemoveConst.const_defined? :ExistingConst448 # Return value of binding449 assert_equal 23, result450 # Name Error raised when Constant doesn't exist451 assert_true name_error452 end453 454 assert('Module#remove_method', '15.2.2.4.41') do455 module Test4RemoveMethod456 class Parent457 def hello458 end459 end460 461 class Child < Parent462 def hello463 end464 end465 end466 467 assert_true Test4RemoveMethod::Child.class_eval{ remove_method :hello }468 assert_true Test4RemoveMethod::Child.instance_methods.include? :hello469 assert_false Test4RemoveMethod::Child.instance_methods(false).include? :hello470 387 end 471 388 … … 490 407 assert_false Test4UndefMethod::Child.new.respond_to?(:hello) 491 408 assert_false Test4UndefMethod::GrandChild.new.respond_to?(:hello) 492 assert_false Test4UndefMethod::Child.instance_methods(false).include? :hello493 409 end 494 410 495 411 # Not ISO specified 412 413 assert('Module#dup') do 414 module TestModuleDup 415 @@cvar = :cvar 416 class << self 417 attr_accessor :cattr 418 def cmeth; :cmeth end 419 end 420 def cvar; @@cvar end 421 def imeth; :imeth end 422 self.cattr = :cattr 423 end 424 425 m = TestModuleDup.dup 426 o = Object.include(m).new 427 assert_equal(:cattr, m.cattr) 428 assert_equal(:cmeth, m.cmeth) 429 assert_equal(:cvar, o.cvar) 430 assert_equal(:imeth, o.imeth) 431 assert_match("#<Module:0x*>", m.to_s) 432 assert_not_predicate(m, :frozen?) 433 assert_not_predicate(TestModuleDup.freeze.dup, :frozen?) 434 end 496 435 497 436 assert('Module#define_method') do … … 507 446 end 508 447 448 assert 'Module#prepend_features' do 449 mod = Module.new { def m; :mod end } 450 cls = Class.new { def m; :cls end } 451 assert_equal :cls, cls.new.m 452 mod.prepend_features(cls) 453 assert_equal :mod, cls.new.m 454 assert_raise(FrozenError) { Module.new.prepend_features(Class.new.freeze) } 455 end 456 509 457 # @!group prepend 510 458 assert('Module#prepend') do … … 539 487 expected = [:M2,[:M3,[:C1,[:M4,[:M1,[:C0,[:M0],:C0],:M1],:M4],:C1],:M3],:M2] 540 488 assert_equal(expected, obj.m1) 489 end 490 491 assert('Module#prepend result') do 492 module TestPrepended; end 493 module TestPrependResult 494 @prepend_result = prepend TestPrepended 495 class << self 496 attr_reader :prepend_result 497 end 498 end 499 500 assert_equal TestPrependResult, TestPrependResult.prepend_result 541 501 end 542 502 … … 573 533 bug8357 = '[ruby-core:54742] [Bug #8357]' 574 534 assert_kind_of(b, c.new, bug8357) 575 end576 577 assert('Moduler#prepend + #instance_methods') do578 bug6655 = '[ruby-core:45915]'579 assert_equal(Object.instance_methods, Class.new {prepend Module.new}.instance_methods, bug6655)580 end581 582 assert 'Module#prepend + #singleton_methods' do583 o = Object.new584 o.singleton_class.class_eval {prepend Module.new}585 assert_equal([], o.singleton_methods)586 end587 588 assert 'Module#prepend + #remove_method' do589 c = Class.new do590 prepend Module.new { def foo; end }591 end592 assert_raise(NameError) do593 c.class_eval do594 remove_method(:foo)595 end596 end597 c.class_eval do598 def foo; end599 end600 removed = nil601 c.singleton_class.class_eval do602 define_method(:method_removed) {|id| removed = id}603 end604 assert_nothing_raised(NoMethodError, NameError, '[Bug #7843]') do605 c.class_eval do606 remove_method(:foo)607 end608 end609 assert_equal(:foo, removed)610 535 end 611 536 … … 650 575 end 651 576 652 assert 'Module#prepend #instance_methods(false)' do653 bug6660 = '[ruby-dev:45863]'654 assert_equal([:m1], Class.new{ prepend Module.new; def m1; end }.instance_methods(false), bug6660)655 assert_equal([:m1], Class.new(Class.new{def m2;end}){ prepend Module.new; def m1; end }.instance_methods(false), bug6660)656 end657 658 577 assert 'cyclic Module#prepend' do 659 578 bug7841 = '[ruby-core:52205] [Bug #7841]' … … 666 585 end 667 586 668 # these assertions will not run without a #assert_sep erately method587 # these assertions will not run without a #assert_separately method 669 588 #assert 'test_prepend_optmethod' do 670 589 # bug7983 = '[ruby-dev:47124] [Bug #7983]' … … 682 601 683 602 # mruby has no visibility control 684 assert 'Module#prepend visibility' do685 bug8005 = '[ruby-core:53106] [Bug #8005]'686 c = Class.new do687 prepend Module.new {}688 def foo() end689 protected :foo690 end691 a = c.new692 assert_true a.respond_to?(:foo), bug8005693 assert_nothing_raised(NoMethodError,bug8005) {a.send :foo}694 end603 # assert 'Module#prepend visibility' do 604 # bug8005 = '[ruby-core:53106] [Bug #8005]' 605 # c = Class.new do 606 # prepend Module.new {} 607 # def foo() end 608 # protected :foo 609 # end 610 # a = c.new 611 # assert_true a.respond_to?(:foo), bug8005 612 # assert_nothing_raised(bug8005) {a.send :foo} 613 # end 695 614 696 615 # mruby has no visibility control 697 assert 'Module#prepend inherited visibility' do 698 bug8238 = '[ruby-core:54105] [Bug #8238]' 699 module Test4PrependVisibilityInherited 700 class A 701 def foo() A; end 702 private :foo 703 end 704 class B < A 705 public :foo 706 prepend Module.new 707 end 708 end 709 assert_equal(Test4PrependVisibilityInherited::A, Test4PrependVisibilityInherited::B.new.foo, "#{bug8238}") 710 end 711 712 assert 'Module#prepend + #included_modules' do 713 bug8025 = '[ruby-core:53158] [Bug #8025]' 714 mixin = labeled_module("mixin") 715 c = labeled_module("c") {prepend mixin} 716 im = c.included_modules 717 assert_not_include(im, c, bug8025) 718 assert_include(im, mixin, bug8025) 719 c1 = labeled_class("c1") {prepend mixin} 720 c2 = labeled_class("c2", c1) 721 im = c2.included_modules 722 assert_not_include(im, c1, bug8025) 723 assert_not_include(im, c2, bug8025) 724 assert_include(im, mixin, bug8025) 725 end 726 727 assert 'Module#prepend super in alias' do 728 skip "super does not currently work in aliased methods" 729 bug7842 = '[Bug #7842]' 730 731 p = labeled_module("P") do 732 def m; "P"+super; end 733 end 734 735 a = labeled_class("A") do 736 def m; "A"; end 737 end 738 739 b = labeled_class("B", a) do 740 def m; "B"+super; end 741 alias m2 m 742 prepend p 743 alias m3 m 744 end 745 746 assert_nothing_raised do 747 assert_equal("BA", b.new.m2, bug7842) 748 end 749 750 assert_nothing_raised do 751 assert_equal("PBA", b.new.m3, bug7842) 752 end 753 end 616 # assert 'Module#prepend inherited visibility' do 617 # bug8238 = '[ruby-core:54105] [Bug #8238]' 618 # module Test4PrependVisibilityInherited 619 # class A 620 # def foo() A; end 621 # private :foo 622 # end 623 # class B < A 624 # public :foo 625 # prepend Module.new 626 # end 627 # end 628 # assert_equal(Test4PrependVisibilityInherited::A, Test4PrependVisibilityInherited::B.new.foo, "#{bug8238}") 629 # end 630 631 # assert 'Module#prepend super in alias' do 632 # skip "super does not currently work in aliased methods" 633 # bug7842 = '[Bug #7842]' 634 635 # p = labeled_module("P") do 636 # def m; "P"+super; end 637 # end 638 639 # a = labeled_class("A") do 640 # def m; "A"; end 641 # end 642 643 # b = labeled_class("B", a) do 644 # def m; "B"+super; end 645 # alias m2 m 646 # prepend p 647 # alias m3 m 648 # end 649 650 # assert_nothing_raised do 651 # assert_equal("BA", b.new.m2, bug7842) 652 # end 653 654 # assert_nothing_raised do 655 # assert_equal("PBA", b.new.m3, bug7842) 656 # end 657 # end 754 658 755 659 assert 'Module#prepend each class' do … … 774 678 end 775 679 776 # requires #assert_sep erately680 # requires #assert_separately 777 681 #assert 'Module#prepend call super' do 778 682 # assert_separately([], <<-'end;') #do … … 785 689 # end; 786 690 #end 691 692 assert 'Module#prepend to frozen class' do 693 assert_raise(FrozenError) { Class.new.freeze.prepend Module.new } 694 end 787 695 # @!endgroup prepend 788 696 789 697 assert('Module#to_s') do 790 module Test4to_sModules 791 end 792 793 assert_equal 'Test4to_sModules', Test4to_sModules.to_s 698 module Outer 699 class Inner; end 700 const_set :SetInner, Class.new 701 end 702 703 assert_equal 'Outer', Outer.to_s 704 assert_equal 'Outer::Inner', Outer::Inner.to_s 705 assert_equal 'Outer::SetInner', Outer::SetInner.to_s 706 707 outer = Module.new do 708 const_set :SetInner, Class.new 709 end 710 Object.const_set :SetOuter, outer 711 712 assert_equal 'SetOuter', SetOuter.to_s 713 assert_equal 'SetOuter::SetInner', SetOuter::SetInner.to_s 714 715 assert_match "#<Module:0x*>", Module.new.to_s 716 assert_match "#<Class:0x*>", Class.new.to_s 717 718 assert_equal "FrozenClassToS", (FrozenClassToS = Class.new.freeze).to_s 719 assert_equal "Outer::A", (Outer::A = Module.new.freeze).to_s 720 assert_match "#<Module:0x*>::A", (Module.new::A = Class.new.freeze).to_s 794 721 end 795 722 … … 819 746 end 820 747 821 C1.new822 C2.new748 assert_kind_of(M1, C1.new) 749 assert_kind_of(M1, C2.new) 823 750 end 824 751 … … 834 761 end 835 762 836 B.new.foo763 assert_true(B.new.foo) 837 764 end 838 765 … … 849 776 assert_raise(TypeError) { module 0::M1 end } 850 777 assert_raise(TypeError) { module []::M2 end } 778 end 779 780 assert('module to return the last value') do 781 m = module M; :m end 782 assert_equal(m, :m) 783 end 784 785 assert('module to return nil if body is empty') do 786 assert_nil(module M end) 851 787 end 852 788 -
EcnlProtoTool/trunk/mruby-2.1.1/test/t/numeric.rb
r321 r439 2 2 # Numeric ISO Test 3 3 4 def assert_step(exp, receiver, args, inf: false) 5 act = [] 6 ret = receiver.step(*args) do |i| 7 act << i 8 break if inf && exp.size == act.size 9 end 10 expr = "#{receiver.inspect}.step(#{args.map(&:inspect).join(', ')})" 11 assert "assert_step" do 12 assert_true(exp.eql?(act), "#{expr}: counters", assertion_diff(exp, act)) 13 assert_same(receiver, ret, "#{expr}: return value") unless inf 14 end 15 end 16 4 17 assert('Numeric', '15.2.7') do 5 assert_equal Class, Numeric.class18 assert_equal(Class, Numeric.class) 6 19 end 7 20 … … 16 29 assert('Numeric#abs', '15.2.7.4.3') do 17 30 assert_equal(1, 1.abs) 31 skip unless Object.const_defined?(:Float) 18 32 assert_equal(1.0, -1.abs) 19 end20 21 assert('Numeric#pow') do22 assert_equal(8, 2 ** 3)23 assert_equal(-8, -2 ** 3)24 assert_equal(1, 2 ** 0)25 assert_equal(1, 2.2 ** 0)26 assert_equal(0.5, 2 ** -1)27 33 end 28 34 … … 40 46 41 47 assert('Numeric#**') do 42 assert_equal 8.0, 2.0**3 48 assert_equal(8, 2 ** 3) 49 assert_equal(-8, -2 ** 3) 50 assert_equal(1, 2 ** 0) 51 skip unless Object.const_defined?(:Float) 52 assert_equal(1.0, 2.2 ** 0) 53 assert_equal(0.5, 2 ** -1) 54 assert_equal(8.0, 2.0**3) 43 55 end 56 57 assert('Numeric#step') do 58 assert_raise(ArgumentError) { 1.step(2, 0) { break } } 59 assert_step([2, 3, 4], 2, [4]) 60 assert_step([10, 8, 6, 4, 2], 10, [1, -2]) 61 assert_step([], 2, [1, 3]) 62 assert_step([], -2, [-1, -3]) 63 assert_step([10, 11, 12, 13], 10, [], inf: true) 64 assert_step([10, 7, 4], 10, [nil, -3], inf: true) 65 66 skip unless Object.const_defined?(:Float) 67 inf = Float::INFINITY 68 assert_raise(ArgumentError) { 1.step(2, 0.0) { break } } 69 assert_step([2.0, 3.0, 4.0], 2, [4.0]) 70 assert_step([7.0, 4.0, 1.0, -2.0], 7, [-4, -3.0]) 71 assert_step([2.0, 3.0, 4.0], 2.0, [4]) 72 assert_step([10.0, 11.0, 12.0, 13.0], 10.0, [], inf: true) 73 assert_step([10.0, 7.0, 4.0], 10, [nil, -3.0], inf: true) 74 assert_step([1.0], 1, [nil, inf]) 75 assert_step([1.0], 1, [nil, -inf]) 76 assert_step([1.0], 1, [3, inf]) 77 assert_step([], 1, [-3, inf]) 78 assert_step([], 1, [3, -inf]) 79 assert_step([1.0], 1, [-3, -inf]) 80 assert_step([1.0], 1, [inf, inf]) 81 assert_step([], 1, [inf, -inf]) 82 assert_step([], 1, [-inf, inf]) 83 assert_step([1.0], 1, [-inf, -inf]) 84 assert_step([], inf, [2]) 85 assert_step([], inf, [-2]) 86 assert_step([], inf, [2, 3]) 87 assert_step([inf, inf, inf], inf, [2, -3], inf: true) 88 assert_step([], inf, [2, inf]) 89 assert_step([inf], inf, [2, -inf]) 90 assert_step([], inf, [-2, inf]) 91 assert_step([inf], inf, [-2, -inf]) 92 assert_step([], inf, [-2, 3]) 93 assert_step([inf, inf, inf], inf, [-2, -3], inf: true) 94 assert_step([inf], inf, [inf]) 95 assert_step([], inf, [-inf]) 96 assert_step([inf], inf, [inf, inf]) 97 assert_step([inf], inf, [inf, -inf]) 98 assert_step([inf], inf, [-inf, -inf]) 99 assert_step([-inf, -inf, -inf], -inf, [2], inf: true) 100 assert_step([-inf, -inf, -inf], -inf, [-2], inf: true) 101 assert_step([-inf, -inf, -inf], -inf, [2, 3], inf: true) 102 assert_step([], -inf, [2, -3]) 103 assert_step([-inf], -inf, [2, inf]) 104 assert_step([], -inf, [2, -inf]) 105 assert_step([-inf], -inf, [-2, inf]) 106 assert_step([], -inf, [-2, -inf]) 107 assert_step([-inf, -inf, -inf], -inf, [-2, 3], inf: true) 108 assert_step([], -inf, [-2, -3]) 109 assert_step([-inf, -inf, -inf], -inf, [inf], inf: true) 110 assert_step([-inf], -inf, [-inf]) 111 assert_step([-inf], -inf, [inf, inf]) 112 assert_step([], -inf, [inf, -inf]) 113 assert_step([-inf], -inf, [-inf, -inf]) 114 end -
EcnlProtoTool/trunk/mruby-2.1.1/test/t/proc.rb
r331 r439 12 12 13 13 assert_equal (Proc.new {}).class, Proc 14 15 assert_raise LocalJumpError do 16 Proc.new{ break }.call 17 end 14 18 end 15 19 … … 154 158 b 155 159 end 156 assert_ equal pr.object_id, mock(&pr).object_id160 assert_same pr, mock(&pr) 157 161 assert_equal pr, mock(&pr) 158 162 … … 165 169 assert_raise(TypeError){ mock(&(Object.new)) } 166 170 end 171 172 assert('Creation of a proc through the block of a method') do 173 def m(&b) b end 174 175 assert_equal m{}.class, Proc 176 177 assert_raise LocalJumpError do 178 m{ break }.call 179 end 180 end -
EcnlProtoTool/trunk/mruby-2.1.1/test/t/range.rb
r331 r439 9 9 assert_true (1..10) == (1..10) 10 10 assert_false (1..10) == (1..100) 11 skip unless Object.const_defined?(:Float) 11 12 assert_true (1..10) == Range.new(1.0, 10.0) 12 13 end … … 60 61 assert_false b.exclude_end? 61 62 62 assert_raise(NameError) { (0..1). send(:initialize, 1, 3) }63 assert_raise(NameError) { (0..1).__send__(:initialize, 1, 3) } 63 64 end 64 65 … … 94 95 assert_false (1..10).eql? "1..10" 95 96 end 97 98 assert('Range#initialize_copy', '15.2.14.4.15') do 99 assert_raise(NameError) { (0..1).__send__(:initialize_copy, 1..3) } 100 end 101 102 assert('Range#dup') do 103 r = (1..3).dup 104 assert_equal 1, r.begin 105 assert_equal 3, r.end 106 assert_false r.exclude_end? 107 108 r = ("a"..."z").dup 109 assert_equal "a", r.begin 110 assert_equal "z", r.end 111 assert_true r.exclude_end? 112 end -
EcnlProtoTool/trunk/mruby-2.1.1/test/t/string.rb
r331 r439 3 3 # String ISO Test 4 4 5 UTF8STRING = ("\343\201\202".size == 1)5 UTF8STRING = __ENCODING__ == "UTF-8" 6 6 7 7 assert('String', '15.2.10') do … … 21 21 assert_equal(-1, d) 22 22 assert_equal 1, e 23 assert_nil 'a' <=> 1024 23 24 end 24 25 … … 37 38 assert_equal 'aaaaa', 'a' * 5 38 39 assert_equal '', 'a' * 0 39 assert_raise(ArgumentError) do 40 'a' * -1 41 end 40 assert_raise(ArgumentError) { 'a' * -1 } 41 assert_raise(TypeError) { 'a' * '1' } 42 assert_raise(TypeError) { 'a' * nil } 43 44 skip unless Object.const_defined?(:Float) 45 assert_equal 'aa', 'a' * 2.1 46 assert_raise(RangeError) { '' * 1e30 } 47 assert_raise(RangeError) { '' * Float::INFINITY } 48 assert_raise(RangeError) { '' * Float::NAN } 42 49 end 43 50 44 51 assert('String#[]', '15.2.10.5.6') do 45 52 # length of args is 1 46 a ='abc'[0]47 b ='abc'[-1]48 c ='abc'[10]49 d ='abc'[-10]50 e = 'abc'[1.1]53 assert_equal 'a', 'abc'[0] 54 assert_equal 'c', 'abc'[-1] 55 assert_nil 'abc'[10] 56 assert_nil 'abc'[-10] 57 assert_equal 'b', 'abc'[1.1] if Object.const_defined?(:Float) 51 58 52 59 # length of args is 2 53 a1 = 'abc'[0, -1] 54 b1 = 'abc'[10, 0] 55 c1 = 'abc'[-10, 0] 56 d1 = 'abc'[0, 0] 57 e1 = 'abc'[1, 2] 58 59 # args is RegExp 60 # It will be tested in mrbgems. 60 assert_nil 'abc'[0, -1] 61 assert_nil 'abc'[10, 0] 62 assert_nil 'abc'[-10, 0] 63 assert_equal '', 'abc'[0, 0] 64 assert_equal 'bc', 'abc'[1, 2] 61 65 62 66 # args is String 63 a3 = 'abc'['bc'] 64 b3 = 'abc'['XX'] 65 66 assert_equal 'a', 'a' 67 # assert_equal 'c', b 68 # assert_nil c 69 # assert_nil d 70 # assert_equal 'b', e 71 # assert_nil a1 72 # assert_nil b1 73 # assert_nil c1 74 # assert_equal '', d1 75 # assert_equal 'bc', e1 76 # assert_equal 'bc', a3 77 # assert_nil b3 78 79 # assert_raise(TypeError) do 80 # a[nil] 81 # end 67 assert_equal 'bc', 'abc'['bc'] 68 assert_nil 'abc'['XX'] 69 70 assert_raise(TypeError) { 'abc'[nil] } 82 71 end 83 72 … … 155 144 end 156 145 157 e = 'abc' 158 e[1.1] = 'X' 159 assert_equal 'aXc', e 160 146 if Object.const_defined?(:Float) 147 e = 'abc' 148 e[1.1] = 'X' 149 assert_equal 'aXc', e 150 end 151 152 assert_raise(TypeError) { 'a'[0] = 1 } 153 assert_raise(TypeError) { 'a'[:a] = '1' } 161 154 162 155 # length of args is 2 … … 196 189 b3['XX'] = 'Y' 197 190 end 198 end 191 192 assert_raise(TypeError) { 'a'[:a, 0] = '1' } 193 assert_raise(TypeError) { 'a'[0, :a] = '1' } 194 assert_raise(TypeError) { 'a'[0, 1] = 1 } 195 end 196 197 assert('String[]=(UTF-8)') do 198 a = "➀➁➂➃➄" 199 a[3] = "⚃" 200 assert_equal "➀➁➂⚃➄", a 201 202 b = "➀➁➂➃➄" 203 b[3, 0] = "⛄" 204 assert_equal "➀➁➂⛄➃➄", b 205 206 c = "➀➁➂➃➄" 207 c[3, 2] = "⚃⚄" 208 assert_equal "➀➁➂⚃⚄", c 209 210 d = "➀➁➂➃➄" 211 d[5] = "⛄" 212 assert_equal "➀➁➂➃➄⛄", d 213 214 e = "➀➁➂➃➄" 215 e[5, 0] = "⛄" 216 assert_equal "➀➁➂➃➄⛄", e 217 218 f = "➀➁➂➃➄" 219 f[5, 2] = "⛄" 220 assert_equal "➀➁➂➃➄⛄", f 221 222 g = "➀➁➂➃➄" 223 assert_raise(IndexError) { g[6] = "⛄" } 224 225 h = "➀➁➂➃➄" 226 assert_raise(IndexError) { h[6, 0] = "⛄" } 227 228 i = "➀➁➂➃➄" 229 assert_raise(IndexError) { i[6, 2] = "⛄" } 230 231 j = "➀➁➂➃➄" 232 j["➃"] = "⚃" 233 assert_equal "➀➁➂⚃➄", j 234 235 k = "➀➁➂➃➄" 236 assert_raise(IndexError) { k["⛄"] = "⛇" } 237 238 l = "➀➁➂➃➄" 239 assert_nothing_raised { l["➂"] = "" } 240 assert_equal "➀➁➃➄", l 241 242 m = "➀➁➂➃➄" 243 assert_raise(TypeError) { m["➂"] = nil } 244 assert_equal "➀➁➂➃➄", m 245 end if UTF8STRING 199 246 200 247 assert('String#capitalize', '15.2.10.5.7') do … … 252 299 end 253 300 254 assert('String#chomp! uses the correct length') do255 class A256 def to_str257 $s.replace("AA")258 "A"259 end260 end261 262 $s = "AAA"263 $s.chomp!(A.new)264 assert_equal $s, "A"265 end266 267 301 assert('String#chop', '15.2.10.5.11') do 268 302 a = ''.chop … … 367 401 assert_equal('aBcaBc', 'abcabc'.gsub('b'){|w| w.capitalize }, 'gsub with block') 368 402 assert_equal('$a$a$', '#a#a#'.gsub('#', '$'), 'mruby/mruby#847') 369 assert_equal('$a$a$', '#a#a#'.gsub('#'){| w| '$' }, 'mruby/mruby#847 with block')403 assert_equal('$a$a$', '#a#a#'.gsub('#'){|_w| '$' }, 'mruby/mruby#847 with block') 370 404 assert_equal('$$a$$', '##a##'.gsub('##', '$$'), 'mruby/mruby#847 another case') 371 assert_equal('$$a$$', '##a##'.gsub('##'){| w| '$$' }, 'mruby/mruby#847 another case with block')405 assert_equal('$$a$$', '##a##'.gsub('##'){|_w| '$$' }, 'mruby/mruby#847 another case with block') 372 406 assert_equal('A', 'a'.gsub('a', 'A')) 373 407 assert_equal('A', 'a'.gsub('a'){|w| w.capitalize }) … … 418 452 assert_equal 5, "hello".index("", 5) 419 453 assert_equal nil, "hello".index("", 6) 420 end 454 assert_equal 3, "hello".index("l", -2) 455 assert_raise(ArgumentError) { "hello".index } 456 assert_raise(TypeError) { "hello".index(101) } 457 end 458 459 assert('String#index(UTF-8)', '15.2.10.5.22') do 460 assert_equal 0, '⓿➊➋➌➍➎'.index('⓿') 461 assert_nil '⓿➊➋➌➍➎'.index('➓') 462 assert_equal 6, '⓿➊➋➌➍➎⓿➊➋➌➍➎'.index('⓿', 1) 463 assert_equal 6, '⓿➊➋➌➍➎⓿➊➋➌➍➎'.index('⓿', -7) 464 assert_equal 6, "⓿➊➋➌➍➎".index("", 6) 465 assert_equal nil, "⓿➊➋➌➍➎".index("", 7) 466 assert_equal 0, '⓿➊➋➌➍➎'.index("\xe2") 467 assert_equal nil, '⓿➊➋➌➍➎'.index("\xe3") 468 assert_equal 6, "\xd1\xd1\xd1\xd1\xd1\xd1⓿➊➋➌➍➎".index('⓿') 469 end if UTF8STRING 421 470 422 471 assert('String#initialize', '15.2.10.5.23') do … … 476 525 477 526 assert('String#reverse(UTF-8)', '15.2.10.5.29') do 478 a ssert_equal "ち", "こんにちは世界"[3]479 a ssert_equal nil, "こんにちは世界"[20]480 assert_equal "世", "こんにちは世界"[-2] 481 assert_equal "世界", "こんにちは世界"[-2..-1]482 assert_equal "んに", "こんにちは世界"[1,2]483 assert_equal "世", "こんにちは世界"["世"]527 a = 'こんにちは世界!' 528 a.reverse 529 530 assert_equal 'こんにちは世界!', a 531 assert_equal '!界世はちにんこ', 'こんにちは世界!'.reverse 532 assert_equal 'あ', 'あ'.reverse 484 533 end if UTF8STRING 485 534 … … 498 547 assert_equal '!界世はちにんこ', a 499 548 assert_equal '!界世はちにんこ', 'こんにちは世界!'.reverse! 549 550 b = 'あ' 551 b.reverse! 552 assert_equal 'あ', b 500 553 end if UTF8STRING 501 554 502 555 assert('String#rindex', '15.2.10.5.31') do 503 556 assert_equal 0, 'abc'.rindex('a') 557 assert_equal 0, 'abc'.rindex('a', 3) 558 assert_nil 'abc'.rindex('a', -4) 504 559 assert_nil 'abc'.rindex('d') 560 assert_equal 6, 'abcabc'.rindex('') 561 assert_equal 3, 'abcabc'.rindex('a') 505 562 assert_equal 0, 'abcabc'.rindex('a', 1) 506 563 assert_equal 3, 'abcabc'.rindex('a', 4) 564 assert_equal 0, 'abcabc'.rindex('a', -4) 565 assert_raise(ArgumentError) { "hello".rindex } 566 assert_raise(TypeError) { "hello".rindex(101) } 507 567 end 508 568 509 569 assert('String#rindex(UTF-8)', '15.2.10.5.31') do 510 570 str = "こんにちは世界!\nこんにちは世界!" 511 assert_nil str.index('さ') 512 assert_equal 3, str.index('ち') 513 assert_equal 12, str.index('ち', 10) 514 assert_equal nil, str.index("さ") 515 end if UTF8STRING 516 517 # 'String#scan', '15.2.10.5.32' will be tested in mrbgems. 571 assert_nil str.rindex('さ') 572 assert_equal 12, str.rindex('ち') 573 assert_equal 3, str.rindex('ち', 10) 574 assert_equal 3, str.rindex('ち', -6) 575 576 broken = "\xf0☀\xf1☁\xf2☂\xf3☃\xf0☀\xf1☁\xf2☂\xf3☃" 577 assert_nil broken.rindex("\x81") # "\x81" is a part of "☁" ("\xe2\x98\x81") 578 assert_equal 11, broken.rindex("☁") 579 assert_equal 11, broken.rindex("☁", 12) 580 assert_equal 11, broken.rindex("☁", 11) 581 assert_equal 3, broken.rindex("☁", 10) 582 end if UTF8STRING 583 584 # assert('String#scan', '15.2.10.5.32') do 585 # # Not implemented yet 586 # end 518 587 519 588 assert('String#size', '15.2.10.5.33') do … … 591 660 miss = str.sub("X", "Z") 592 661 assert_equal str, miss 593 assert_not_ equal str.object_id, miss.object_id662 assert_not_same str, miss 594 663 595 664 a = [] … … 619 688 620 689 assert('String#to_f', '15.2.10.5.38') do 621 a = ''.to_f 622 b = '123456789'.to_f 623 c = '12345.6789'.to_f 624 d = '1e-2147483648'.to_f 625 e = '1e2147483648'.to_f 626 627 assert_float(0.0, a) 628 assert_float(123456789.0, b) 629 assert_float(12345.6789, c) 630 assert_float(0, d) 631 assert_float(Float::INFINITY, e) 632 end 690 assert_operator(0.0, :eql?, ''.to_f) 691 assert_operator(123456789.0, :eql?, '123456789'.to_f) 692 assert_operator(12345.6789, :eql?, '12345.6789'.to_f) 693 assert_operator(0.0, :eql?, '1e-2147483648'.to_f) 694 assert_operator(Float::INFINITY, :eql?, '1e2147483648'.to_f) 695 assert_operator(0.0, :eql?, 'a'.to_f) 696 assert_operator(4.0, :eql?, '4a5'.to_f) 697 assert_operator(12.0, :eql?, '1_2__3'.to_f) 698 assert_operator(123.0, :eql?, '1_2_3'.to_f) 699 assert_operator(68.0, :eql?, '68_'.to_f) 700 assert_operator(68.0, :eql?, '68._7'.to_f) 701 assert_operator(68.7, :eql?, '68.7_'.to_f) 702 assert_operator(68.7, :eql?, '68.7_ '.to_f) 703 assert_operator(6.0, :eql?, '6 8.7'.to_f) 704 assert_operator(68.0, :eql?, '68. 7'.to_f) 705 assert_operator(0.0, :eql?, '_68'.to_f) 706 assert_operator(0.0, :eql?, ' _68'.to_f) 707 assert_operator(12.34, :eql?, '1_2.3_4'.to_f) 708 assert_operator(12.3, :eql?, '1_2.3__4'.to_f) 709 assert_operator(0.9, :eql?, '.9'.to_f) 710 assert_operator(0.9, :eql?, "\t\r\n\f\v .9 \t\r\n\f\v".to_f) 711 end if Object.const_defined?(:Float) 633 712 634 713 assert('String#to_i', '15.2.10.5.39') do 635 a = ''.to_i 636 b = '32143'.to_i 637 c = 'a'.to_i(16) 638 d = '100'.to_i(2) 639 e = '1_000'.to_i 640 641 assert_equal 0, a 642 assert_equal 32143, b 643 assert_equal 10, c 644 assert_equal 4, d 645 assert_equal 1_000, e 714 assert_operator 0, :eql?, ''.to_i 715 assert_operator 32143, :eql?, '32143'.to_i 716 assert_operator 10, :eql?, 'a'.to_i(16) 717 assert_operator 4, :eql?, '100'.to_i(2) 718 assert_operator 1_000, :eql?, '1_000'.to_i 719 assert_operator 0, :eql?, 'a'.to_i 720 assert_operator 4, :eql?, '4a5'.to_i 721 assert_operator 12, :eql?, '1_2__3'.to_i 722 assert_operator 123, :eql?, '1_2_3'.to_i 723 assert_operator 68, :eql?, '68_'.to_i 724 assert_operator 68, :eql?, '68_ '.to_i 725 assert_operator 0, :eql?, '_68'.to_i 726 assert_operator 0, :eql?, ' _68'.to_i 727 assert_operator 68, :eql?, "\t\r\n\f\v 68 \t\r\n\f\v".to_i 728 assert_operator 6, :eql?, ' 6 8 '.to_i 646 729 end 647 730 … … 680 763 681 764 assert('String#inspect', '15.2.10.5.46') do 765 assert_equal "\"\\x00\"", "\0".inspect 766 assert_equal "\"foo\"", "foo".inspect 767 if UTF8STRING 768 assert_equal '"る"', "る".inspect 769 else 770 assert_equal '"\xe3\x82\x8b"', "る".inspect 771 end 772 682 773 # should not raise an exception - regress #1210 683 774 assert_nothing_raised do 684 ("\1" * 100).inspect 685 end 686 687 assert_equal "\"\\000\"", "\0".inspect 775 ("\1" * 100).inspect 776 end 688 777 end 689 778 … … 693 782 a = "A" * 32 694 783 assert_equal "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA:", "#{a}:" 695 end696 697 assert('Check the usage of a NUL character') do698 "qqq\0ppp"699 784 end 700 785 … … 724 809 str.freeze 725 810 726 assert_raise(RuntimeError) { str.upcase! } 727 end 811 assert_raise(FrozenError) { str.upcase! } 812 end 813 814 assert('String literal concatenation') do 815 assert_equal 2, ("A" "B").size 816 assert_equal 3, ('A' "B" 'C').size 817 assert_equal 4, (%(A) "B#{?C}" "D").size 818 end 819 820 assert('String#getbyte') do 821 str1 = "hello" 822 bytes1 = [104, 101, 108, 108, 111] 823 assert_equal bytes1[0], str1.getbyte(0) 824 assert_equal bytes1[-1], str1.getbyte(-1) 825 assert_equal bytes1[6], str1.getbyte(6) 826 827 str2 = "\xFF" 828 bytes2 = [0xFF] 829 assert_equal bytes2[0], str2.getbyte(0) 830 end 831 832 assert('String#setbyte') do 833 str1 = "hello" 834 h = "H".getbyte(0) 835 str1.setbyte(0, h) 836 assert_equal(h, str1.getbyte(0)) 837 assert_equal("Hello", str1) 838 end 839 840 assert('String#byteslice') do 841 str1 = "hello" 842 str2 = "\u3042ab" # "\xE3\x81\x82ab" 843 844 assert_equal("h", str1.byteslice(0)) 845 assert_equal("e", str1.byteslice(1)) 846 assert_equal(nil, str1.byteslice(5)) 847 assert_equal("o", str1.byteslice(-1)) 848 assert_equal(nil, str1.byteslice(-6)) 849 assert_equal("\xE3", str2.byteslice(0)) 850 assert_equal("\x81", str2.byteslice(1)) 851 assert_equal(nil, str2.byteslice(5)) 852 assert_equal("b", str2.byteslice(-1)) 853 assert_equal(nil, str2.byteslice(-6)) 854 855 assert_equal("", str1.byteslice(0, 0)) 856 assert_equal(str1, str1.byteslice(0, 6)) 857 assert_equal("el", str1.byteslice(1, 2)) 858 assert_equal("", str1.byteslice(5, 1)) 859 assert_equal("o", str1.byteslice(-1, 6)) 860 assert_equal(nil, str1.byteslice(-6, 1)) 861 assert_equal(nil, str1.byteslice(0, -1)) 862 assert_equal("", str2.byteslice(0, 0)) 863 assert_equal(str2, str2.byteslice(0, 6)) 864 assert_equal("\x81\x82", str2.byteslice(1, 2)) 865 assert_equal("", str2.byteslice(5, 1)) 866 assert_equal("b", str2.byteslice(-1, 6)) 867 assert_equal(nil, str2.byteslice(-6, 1)) 868 assert_equal(nil, str2.byteslice(0, -1)) 869 870 assert_equal("ell", str1.byteslice(1..3)) 871 assert_equal("el", str1.byteslice(1...3)) 872 assert_equal("h", str1.byteslice(0..0)) 873 assert_equal("", str1.byteslice(5..0)) 874 assert_equal("o", str1.byteslice(4..5)) 875 assert_equal(nil, str1.byteslice(6..0)) 876 assert_equal("", str1.byteslice(-1..0)) 877 assert_equal("llo", str1.byteslice(-3..5)) 878 assert_equal("\x81\x82a", str2.byteslice(1..3)) 879 assert_equal("\x81\x82", str2.byteslice(1...3)) 880 assert_equal("\xE3", str2.byteslice(0..0)) 881 assert_equal("", str2.byteslice(5..0)) 882 assert_equal("b", str2.byteslice(4..5)) 883 assert_equal(nil, str2.byteslice(6..0)) 884 assert_equal("", str2.byteslice(-1..0)) 885 assert_equal("\x82ab", str2.byteslice(-3..5)) 886 887 assert_raise(ArgumentError) { str1.byteslice } 888 assert_raise(ArgumentError) { str1.byteslice(1, 2, 3) } 889 assert_raise(TypeError) { str1.byteslice("1") } 890 assert_raise(TypeError) { str1.byteslice("1", 2) } 891 assert_raise(TypeError) { str1.byteslice(1, "2") } 892 assert_raise(TypeError) { str1.byteslice(1..2, 3) } 893 894 skip unless Object.const_defined?(:Float) 895 assert_equal("o", str1.byteslice(4.0)) 896 assert_equal("\x82ab", str2.byteslice(2.0, 3.0)) 897 end -
EcnlProtoTool/trunk/mruby-2.1.1/test/t/superclass.rb
r321 r439 24 24 [:StandardError, :Exception, '15.2.23.2'], 25 25 [:ArgumentError, :StandardError, '15.2.24.2'], 26 [:LocalJumpError, :StandardError, '15.2.25.2'], 26 # [:LocalJumpError, :StandardError, '15.2.25.2'], 27 [:LocalJumpError, :ScriptError, '15.2.25.2'], # mruby specific 27 28 [:RangeError, :StandardError, '12.2.26.2'], 28 29 [:RegexpError, :StandardError, '12.2.27.2'], -
EcnlProtoTool/trunk/mruby-2.1.1/test/t/symbol.rb
r331 r439 14 14 15 15 assert('Symbol#===', '15.2.11.3.1') do 16 assert_true :abc == :abc17 assert_false :abc == :cba16 assert_true :abc === :abc 17 assert_false :abc === :cba 18 18 end 19 19 … … 29 29 assert_equal :abc, :abc.to_sym 30 30 end 31 32 assert('Symbol#to_proc') do 33 assert_equal 5, :abs.to_proc[-5] 34 end -
EcnlProtoTool/trunk/mruby-2.1.1/test/t/syntax.rb
r331 r439 404 404 assert_equal ['test', 'test dynamic `', 'test', 'test dynamic `'], results 405 405 406 results = [] 407 assert_equal 'test sym test sym test', `test #{:sym} test #{:sym} test` 408 406 409 alias_method sym, :old_cmd 407 410 end … … 421 424 422 425 assert('method definition in cmdarg') do 423 if false 426 result = class MethodDefinitionInCmdarg 427 def self.bar(arg); arg end 424 428 bar def foo; self.each do end end 425 429 end 426 true430 assert_equal(:foo, result) 427 431 end 428 432 … … 448 452 end 449 453 454 assert('local variable definition in default value and subsequent arguments') do 455 def m(a = b = 1, c) [a, b, c] end 456 assert_equal([1, 1, :c], m(:c)) 457 assert_equal([:a, nil, :c], m(:a, :c)) 458 459 def m(a = b = 1, &c) [a, b, c ? true : nil] end 460 assert_equal([1, 1, nil], m) 461 assert_equal([1, 1, true], m{}) 462 assert_equal([:a, nil, nil], m(:a)) 463 assert_equal([:a, nil, true], m(:a){}) 464 end 465 450 466 assert('multiline comments work correctly') do 451 467 =begin 452 468 this is a comment with nothing after begin and end 453 469 =end 454 =begin this is a comment 470 =begin this is a comment 455 471 this is a comment with extra after =begin 456 472 =end 457 473 =begin 458 474 this is a comment that has =end with spaces after it 459 =end 475 =end 460 476 =begin this is a comment 461 477 this is a comment that has extra after =begin and =end with spaces after it 462 =end 478 =end 463 479 line = __LINE__ 464 480 =begin this is a comment … … 467 483 assert_equal(line + 4, __LINE__) 468 484 end 485 486 assert 'keyword arguments' do 487 def m(a, b:1) [a, b] end 488 assert_equal [1, 1], m(1) 489 assert_equal [1, 2], m(1, b: 2) 490 491 def m(a, b:) [a, b] end 492 assert_equal [1, 2], m(1, b: 2) 493 assert_raise(ArgumentError) { m b: 1 } 494 assert_raise(ArgumentError) { m 1 } 495 496 def m(a:) a end 497 assert_equal 1, m(a: 1) 498 assert_raise(ArgumentError) { m } 499 assert_raise(ArgumentError) { m 'a' => 1, a: 1 } 500 h = { a: 1 } 501 assert_equal 1, m(h) 502 assert_equal({ a: 1 }, h) 503 504 def m(a: 1) a end 505 assert_equal 1, m 506 assert_equal 2, m(a: 2) 507 assert_raise(ArgumentError) { m 1 } 508 509 def m(**) end 510 assert_nil m 511 assert_nil m a: 1, b: 2 512 assert_raise(ArgumentError) { m 2 } 513 514 def m(a, **) a end 515 assert_equal 1, m(1) 516 assert_equal 1, m(1, a: 2, b: 3) 517 assert_equal({ 'a' => 1, b: 2 }, m('a' => 1, b: 2)) 518 519 def m(a, **k) [a, k] end 520 assert_equal [1, {}], m(1) 521 assert_equal [1, {a: 2, b: 3}], m(1, a: 2, b: 3) 522 assert_equal [{'a' => 1, b: 2}, {}], m('a' => 1, b: 2) 523 524 def m(a=1, **) a end 525 assert_equal 1, m 526 assert_equal 2, m(2, a: 1, b: 0) 527 assert_raise(ArgumentError) { m('a' => 1, a: 2) } 528 529 def m(a=1, **k) [a, k] end 530 assert_equal [1, {}], m 531 assert_equal [1, {a: 1}], m(a: 1) 532 assert_equal [2, {a: 1, b: 2}], m(2, a: 1, b: 2) 533 assert_equal [{a: 1}, {b: 2}], m({a: 1}, {b: 2}) 534 535 def m(*, a:) a end 536 assert_equal 1, m(a: 1) 537 assert_equal 3, m(1, 2, a: 3) 538 assert_raise(ArgumentError) { m('a' => 1, a: 2) } 539 540 def m(*a, b:) [a, b] end 541 assert_equal [[], 1], m(b: 1) 542 assert_equal [[1, 2], 3], m(1, 2, b: 3) 543 assert_raise(ArgumentError) { m('a' => 1, b: 2) } 544 545 def m(*a, b: 1) [a, b] end 546 assert_equal [[], 1], m 547 assert_equal [[1, 2, 3], 4], m(1, 2, 3, b: 4) 548 assert_raise(ArgumentError) { m('a' => 1, b: 2) } 549 550 def m(*, **) end 551 assert_nil m() 552 assert_nil m(a: 1, b: 2) 553 assert_nil m(1, 2, 3, a: 4, b: 5) 554 555 def m(*a, **) a end 556 assert_equal [], m() 557 assert_equal [1, 2, 3], m(1, 2, 3, a: 4, b: 5) 558 assert_raise(ArgumentError) { m("a" => 1, a: 1) } 559 assert_equal [1], m(1, **{a: 2}) 560 561 def m(*, **k) k end 562 assert_equal({}, m()) 563 assert_equal({a: 4, b: 5}, m(1, 2, 3, a: 4, b: 5)) 564 assert_raise(ArgumentError) { m("a" => 1, a: 1) } 565 566 def m(a = nil, b = nil, **k) [a, k] end 567 assert_equal [nil, {}], m() 568 assert_equal([nil, {a: 1}], m(a: 1)) 569 assert_raise(ArgumentError) { m("a" => 1, a: 1) } 570 assert_equal([{"a" => 1}, {a: 1}], m({ "a" => 1 }, a: 1)) 571 assert_equal([{a: 1}, {}], m({a: 1}, {})) 572 assert_equal([nil, {}], m({})) 573 574 def m(*a, **k) [a, k] end 575 assert_equal([[], {}], m()) 576 assert_equal([[1], {}], m(1)) 577 assert_equal([[], {a: 1, b: 2}], m(a: 1, b: 2)) 578 assert_equal([[1, 2, 3], {a: 2}], m(1, 2, 3, a: 2)) 579 assert_raise(ArgumentError) { m("a" => 1, a: 1) } 580 assert_raise(ArgumentError) { m("a" => 1) } 581 assert_equal([[], {a: 1}], m(a: 1)) 582 assert_raise(ArgumentError) { m("a" => 1, a: 1) } 583 assert_equal([[{"a" => 1}], {a: 1}], m({ "a" => 1 }, a: 1)) 584 assert_equal([[{a: 1}], {}], m({a: 1}, {})) 585 assert_raise(ArgumentError) { m({a: 1}, {"a" => 1}) } 586 587 def m(a:, b:) [a, b] end 588 assert_equal([1, 2], m(a: 1, b: 2)) 589 assert_raise(ArgumentError) { m("a" => 1, a: 1, b: 2) } 590 591 def m(a:, b: 1) [a, b] end 592 assert_equal([1, 1], m(a: 1)) 593 assert_equal([1, 2], m(a: 1, b: 2)) 594 assert_raise(ArgumentError) { m("a" => 1, a: 1, b: 2) } 595 596 def m(a:, **) a end 597 assert_equal(1, m(a: 1)) 598 assert_equal(1, m(a: 1, b: 2)) 599 assert_raise(ArgumentError) { m("a" => 1, a: 1, b: 2) } 600 601 def m(a:, **k) [a, k] end 602 assert_equal([1, {}], m(a: 1)) 603 assert_equal([1, {b: 2, c: 3}], m(a: 1, b: 2, c: 3)) 604 assert_raise(ArgumentError) { m("a" => 1, a: 1, b: 2) } 605 606 =begin 607 def m(a:, &b) [a, b] end 608 assert_equal([1, nil], m(a: 1)) 609 assert_equal([1, l], m(a: 1, &(l = ->{}))) 610 =end 611 612 def m(a: 1, b:) [a, b] end 613 assert_equal([1, 0], m(b: 0)) 614 assert_equal([3, 2], m(b: 2, a: 3)) 615 assert_raise(ArgumentError) { m a: 1 } 616 617 def m(a: def m(a: 1) a end, b:) 618 [a, b] 619 end 620 assert_equal([2, 3], m(a: 2, b: 3)) 621 assert_equal([:m, 1], m(b: 1)) 622 # Note the default value of a: in the original method. 623 assert_equal(1, m()) 624 625 def m(a: 1, b: 2) [a, b] end 626 assert_equal([1, 2], m()) 627 assert_equal([4, 3], m(b: 3, a: 4)) 628 629 def m(a: 1, **) a end 630 assert_equal(1, m()) 631 assert_equal(2, m(a: 2, b: 1)) 632 633 def m(a: 1, **k) [a, k] end 634 assert_equal([1, {b: 2, c: 3}], m(b: 2, c: 3)) 635 636 def m(a:, **) yield end 637 assert_raise(ArgumentError) { m { :blk } } 638 assert_equal :blk, m(a: 1){ :blk } 639 640 def m(a:, **k, &b) [b.call, k] end 641 assert_raise(ArgumentError) { m { :blk } } 642 assert_equal [:blk, {b: 2}], m(a: 1, b: 2){ :blk } 643 644 def m(**k, &b) [k, b] end 645 assert_equal([{ a: 1, b: 2}, nil], m(a: 1, b: 2)) 646 assert_equal :blk, m{ :blk }[1].call 647 648 def m(hsh = {}) hsh end 649 assert_equal({ a: 1, b: 2 }, m(a: 1, b: 2)) 650 assert_equal({ a: 1, 'b' => 2 }, m(a: 1, 'b' => 2)) 651 652 def m(hsh) hsh end 653 assert_equal({ a: 1, b: 2 }, m(a: 1, b: 2)) 654 assert_equal({ a: 1, 'b' => 2 }, m(a: 1, 'b' => 2)) 655 656 =begin 657 def m(a, b=1, *c, (*d, (e)), f: 2, g:, h:, **k, &l) 658 [a, b, c, d, e, f, g, h, k, l] 659 end 660 result = m(9, 8, 7, 6, f: 5, g: 4, h: 3, &(l = ->{})) 661 assert_equal([9, 8, [7], [], 6, 5, 4, 3, {}, l], result) 662 663 def m a, b=1, *c, d, e:, f: 2, g:, **k, &l 664 [a, b, c, d, e, f, g, k, l] 665 end 666 result = m(1, 2, e: 3, g: 4, h: 5, i: 6, &(l = ->{})) 667 assert_equal([1, 1, [], 2, 3, 2, 4, { h: 5, i: 6 }, l], result) 668 =end 669 670 def m(a: b = 1, c:) [a, b, c] end 671 assert_equal([1, 1, :c], m(c: :c)) 672 assert_equal([:a, nil, :c], m(a: :a, c: :c)) 673 end 674 675 assert('numbered parameters') do 676 assert_equal(15, [1,2,3,4,5].reduce {_1+_2}) 677 assert_equal(45, Proc.new do _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 end.call(*[1, 2, 3, 4, 5, 6, 7, 8, 9])) 678 end 679 680 assert('_0 is not numbered parameter') do 681 _0 = :l 682 assert_equal(:l, ->{_0}.call) 683 end -
EcnlProtoTool/trunk/mruby-2.1.1/travis_config.rb
r321 r439 1 MRuby::Build.new(' debug') do |conf|1 MRuby::Build.new('full-debug') do |conf| 2 2 toolchain :gcc 3 3 enable_debug … … 6 6 conf.gembox 'full-core' 7 7 conf.cc.flags += %w(-Werror=declaration-after-statement) 8 conf.compilers.each do |c| 9 c.defines += %w(MRB_GC_STRESS MRB_GC_FIXED_ARENA) 10 end 11 12 build_mrbc_exec 13 end 14 15 MRuby::Build.new('full-debug') do |conf| 16 toolchain :gcc 17 enable_debug 18 19 # include all core GEMs 20 conf.gembox 'full-core' 21 conf.cc.defines = %w(MRB_ENABLE_DEBUG_HOOK) 8 conf.cc.defines += %w(MRB_GC_STRESS MRB_METHOD_CACHE MRB_ENABLE_DEBUG_HOOK) 22 9 23 10 conf.enable_test … … 41 28 42 29 conf.gembox 'full-core' 43 conf.cc.flags += %w(- Werror=declaration-after-statement)30 conf.cc.flags += %w(-fpermissive) 44 31 conf.compilers.each do |c| 45 32 c.defines += %w(MRB_GC_FIXED_ARENA)
Note:
See TracChangeset
for help on using the changeset viewer.