summaryrefslogtreecommitdiffhomepage
AgeCommit message (Collapse)Author
2020-12-15refactor: remove trailing whitespace from C, Header, Ruby and YAML filesJohn Bampton
Lint
2020-12-15Ensure initialization of `RVALUE_zero` in `mrb_obj_alloc`KOBAYASHI Shuji
Union initialization initializes the first member. The first member of `RVALUE` is `struct free_obj`, but because it is only 4-words, it seems that initialization after the 5th word is not ensured. Therefore, I created 6-words `struct RVALUE_initializer` for initialization and made it the first member.
2020-12-13Merge pull request #5221 from jbampton/fix-spellingYukihiro "Matz" Matsumoto
Fix spelling
2020-12-13Fix spellingJohn Bampton
2020-12-13Improve source scanning for presymKOBAYASHI Shuji
The accuracy is greatly improved by using the C preprocessor to scan C sources for presym. C preprocessor can perfectly interpret all comments and preprocessor directives, so it can detect all symbols defined, for example `mrbgems/mruby-socket/src/const.cstub`. Also, as described later, this change will greatly improve the accuracy of presym detection from Ruby sources. ## Result The number of lines in the `presym` file for all gems is as follows: ```console Previous: 999 (false positive = 89, undetected = 297) New: 1207 ``` ## Build process The new build process (with presym) is as follows: 1. Build `mrbc` without presym (more on building without presym later). 2. Compile Ruby sources to C struct format with the `mrbc` created in step 1, and create` mrblib.c` and `gem_init.c`. Note that the symbols in the created files are output as `MRB_SYM` family macros or `mrb_intern_lit` instead of IDs (details will be described later). 3. C preprocessor processes C sources including the created files of step 2 and outputs them as `.i` files. In these files, for example, `MRB_IVSYM(foo)` is converted to `<@! "@" "foo" !@>` and `mrb_define_module(mrb, "Foo")` is converted to `<@! "Foo" !@>`. 4. Scan the files created in step 3 and create `presym` and` presym.inc` files. The files created in step 2 should output all static symbols defined in Ruby sources, including local variables, so we can detect all presyms by just scanning C sources without scanning Ruby sources directly. Further, by this process, the files to be scanned becomes the same as the files to be compiled, so that there is no excess or deficiency. ## Related changes The following changes have been made in relation to realizing this feature. ### Allow build without presym It enables build without presym to achieve the "Build process: 1". This incorporates #5202, see its issue for details. Note that when presym is enabled, even adding a local variable to a Ruby source may change contents of presym and require recompilation of almost all C sources. This is inconvenient, especially during trial and error in development, but this feature is also useful because it does not cause this problem if presym is disabled. ### Automatically create build target for `mrbc` without presym The `mrbc` used in the "Build process: 1" will be built by automatically creating a build target for it. The build name is `SOURCE_BUILD_NAME/mrbc`. ### Constantize output of C struct format by `mrbc` To realizing the "Build process: 2", as mentioned above, symbol IDs are not output directly in C struct format output by `mrbc`. As a result, the output becomes constant regardless of the state of presym at the time of `mrbc` build, and it is possible to detect symbols of Ruby sources in the same way as other C sources. Note that `mrb_intern_lit` is used for symbols that do not become presym, but in this state, the corresponding element in the symbol array cannot be statically initialized, so it is initialized at run time (therefore, in this case, the `const` qualifier is not added to the symbol array). ### Specify arbitrary `mrbc` file To realizing the "Build process: 2", enabled to specify `mrbc` created by another build target or pre-built` mrbc`. Use `MRuby::Build#mrbcfile =` to specify it explicitly. You can omit the "Build process: 1" by specifying pre-built `mrbc`, and you can always use an optimized build to compile Ruby sources faster. I think changes that affect the output of `mrbc` are rare, so in many cases it helps to improve efficiency. With presym, the build will be a little slower due to more build steps, but this feature will improve it a bit. ### Create presym files for each build target This feature was proposed at #5194 and merged once, but was reverted in 5c205e6e due to problems especially with cross-compilation. It has been introduced again because this change solves the problem. The presym files will be created below. * `build/NAME/presym` * `build/NAME/include/mruby/presym.inc` ### Other changes * Because presym detection accuracy is greatly improved as mentioned above, `MRuby::Gem::Specification#cdump?` is set to true by default, and `disable_cdump` is added instead of `enable_cdump`. Also, support for gem specific presym files has been discontinued (https://github.com/mruby/mruby/issues/5151#issuecomment-730967232). * Previously, `mrbc` was automatically created for the `host` build, but it will not be created if the build target for `mrbc` mentioned above is automatically created. At this time, `mrbc` file of the `mrbc` build is copied to` bin/`. * Two types of `.d` files will be created, `.o.d` and `.i.d`. oThis is because if `.i` depends on `presym.inc`, the dependency will circulate, so the `.d` file cannot be shared. * Changed file created with `enable_cxx_exception` to `X-cxx.cxx` from `X.cxx` to use the mruby standard Rake rule. ### Note Almost all C sources will need to be recompiled if there are any changes to `persym.inc` (if not recompiled properly, it will often result in run-time error). If `gcc` toolchain is used, dependencies are resolved by the `.d` file, so it become automatically recompile target, but if not (e.g. MSVC), it is necessary to manually make it recompile target. Also, even if `gcc` toolchain is used, it may not become recompile target if external gems does not use the mruby standard Rake rule. In particular, if the standard rule is overwritten, such as https://github.com/mruby/mruby/pull/5112/files, `.d` file will not be read, so be careful.
2020-12-12Remove positive check for unsigned integer; close #5218Yukihiro "Matz" Matsumoto
2020-12-09Argument forwarding with `...` now supports leading arguments.Yukihiro "Matz" Matsumoto
```ruby def method_missing(meth, ...) send(:"do_#{meth}", ...) end ```
2020-12-08Fix a bug caused by `tBDOT3` (argument forwarding).Yukihiro "Matz" Matsumoto
2020-12-07Make type of `pc` arguments in `debug.c` consistent; close #5218Yukihiro "Matz" Matsumoto
They used to be `size_t`, `uint32_t` and `ptrdiff_t`. Now all of them made to be `uint32_t`.
2020-12-06Merge pull request #5217 from ↵Yukihiro "Matz" Matsumoto
shuujii/call-super-before-creating-host-build-in-MRubyCrossBuild-initialize Call `super` before creating `host` build in `MRuby::CrossBuild#initialize`
2020-12-06Call `super` before creating `host` build in `MRuby::CrossBuild#initialize`KOBAYASHI Shuji
Call `super` (`block`) ahead so that creation of the `host` build can be skipped if pre-built `mrbc` can be specified in the future. close #5213.
2020-12-05Merge pull request #5214 from shuujii/allow-obsoluted-MRB_METHOD_T_STRUCTYukihiro "Matz" Matsumoto
Allow obsoluted `MRB_METHOD_T_STRUCT`
2020-12-05Merge pull request #5216 from ↵Yukihiro "Matz" Matsumoto
shuujii/remove-unused-@endian-in-MRubyCrossBuild-initialize Remove unused `@endian` in `MRuby::CrossBuild#initialize`
2020-12-05Merge pull request #5215 from ↵Yukihiro "Matz" Matsumoto
shuujii/update-Configuration-Options-Changed-in-doc-mruby3.md Update "Configuration Options Changed" in `doc/mruby3.md` [ci skip]
2020-12-05Remove unused `@endian` in `MRuby::CrossBuild#initialize`KOBAYASHI Shuji
2020-12-05Update "Configuration Options Changed" in `doc/mruby3.md` [ci skip]KOBAYASHI Shuji
2020-12-05Allow obsoluted `MRB_METHOD_T_STRUCT`KOBAYASHI Shuji
2020-12-05Fixed a memory leak bug on `codegen_error()` when `irep->rlen>255`.Yukihiro "Matz" Matsumoto
2020-12-05Merge pull request #5212 from ↵Yukihiro "Matz" Matsumoto
shuujii/make-it-possible-that-libmruby.a-is-not-created Make it possible that `libmruby.a` is not created
2020-12-05Make it possible that `libmruby.a` is not createdKOBAYASHI Shuji
Previously, `libmruby.a` was created even if only `mruby-bin-mrbc` or` mruby-compiler` was specified for gem, but by specifying `disable_libmruby`, the creation of `libmruby.a` can be suppressed. ### Note The https://github.com/mruby/mruby/pull/5084#issuecomment-723521971 incompatibility seems to be difficult for users to avoid, so the original behavior has been restored. Therefore, if we need `mrbc` other than the `host` build, we need to explicitly specify `mruby-bin-mrbc` gem. Due to the above changes, `build_config/boxing.rb` etc. will not work, but I have added` mruby-bin-mrbc` to `default.gembox` to fix it. I don't think this change is a big deal because originally `mruby-compiler` was included.
2020-12-05Fixed a bug with modules prepended many times.Yukihiro "Matz" Matsumoto
Adjust insertion point in `fix_prepend_module()`.
2020-12-04Make `Module#include` and `Module#prepend` behave like Ruby3.0.Yukihiro "Matz" Matsumoto
Module#include and Module#prepend now affect classes and modules that have already included or prepended the receiver, mirroring the behavior if the arguments were included in the receiver before the other modules and classes included or prepended the receiver. ```ruby class C; end module M1; end module M2; end C.include M1 M1.include M2 p C.ancestors #=> [C, M1, M2, Object, Kernel, BasicObject] ```
2020-12-04Merge pull request #5211 from ↵Yukihiro "Matz" Matsumoto
shuujii/move-mrbc-test-to-mruby-bin-mrbc-gem-from-mruby-compiler-gem Move `mrbc` test to `mruby-bin-mrbc` gem from `mruby-compiler` gem
2020-12-04Move `mrbc` test to `mruby-bin-mrbc` gem from `mruby-compiler` gemKOBAYASHI Shuji
2020-12-03Merge pull request #5209 from shuujii/remove-build-presym.inc-by-rake-cleanYukihiro "Matz" Matsumoto
Remove `build/presym{,.inc}` by `rake clean` [ci skip]
2020-12-02Remove `build/presym{,.inc}` by `rake clean` [ci skip]KOBAYASHI Shuji
Currently, adding gems to build configuration and rebuilding does not regenerate `presym`, which can lead to build errors. Therefore in this case we need to remove the `presym` file and then rebuild mruby, but when the` presym` file is regenerated we will need to recompile most of the files, so it seems useful to have the `presym` file deleted by `rake clean`.
2020-12-02Merge pull request #5208 from ↵Yukihiro "Matz" Matsumoto
shuujii/fix-build-for-C++11-when-enable_cxx_exception Fix build for C++ version >= C++11 when `enable_cxx_exception`; close #5199
2020-12-02Fix build for C++ version >= C++11 when `enable_cxx_exception`; close #5199KOBAYASHI Shuji
2020-12-02Merge pull request #5198 from shuujii/remove-unused-Rake-rulesYukihiro "Matz" Matsumoto
Remove unused Rake rules
2020-12-02Use `JMPLINK_START` instead of zero for a link start marker.Yukihiro "Matz" Matsumoto
2020-12-02Remove assertions to check catch handler offset to be in 16bits.Yukihiro "Matz" Matsumoto
2020-12-02Fixed memory leaks from `codegen_error`.Yukihiro "Matz" Matsumoto
2020-12-02Print implicit operands for some instructions.Yukihiro "Matz" Matsumoto
2020-12-02Remove a newline.Yukihiro "Matz" Matsumoto
2020-12-01Fix a ``OP_JMP` bug from `0` marker and address `0`.Yukihiro "Matz" Matsumoto
2020-12-01Merge pull request #5207 from ↵Yukihiro "Matz" Matsumoto
shuujii/revert-Create-presym-files-for-each-build-target Revert "Create presym files for each build target" (58ba883e)
2020-12-01Revert "Create presym files for each build target" (58ba883e)KOBAYASHI Shuji
Due to the above changes, it may not work with the existing build configurations in cross-compilation (even if we can build without presym), therefore revert it once (ref https://github.com/mruby/mruby/pull/5202#issuecomment-735412643). Sorry for the lack of consideration.
2020-12-01Fix `OP_JMPUW` address bug.Yukihiro "Matz" Matsumoto
2020-11-30Merge pull request #5206 from dearblue/dumpirepYukihiro "Matz" Matsumoto
Improves dump irep
2020-11-30Merge pull request #5205 from dearblue/codedumpYukihiro "Matz" Matsumoto
Fixed print catch handler address in codedump; ref #5200
2020-11-30Integrate the output of the catch handler table into iseqdearblue
Alleviates confusingness. ref #5203
2020-11-30Fixed irep size measurement by dump; ref #5203dearblue
2020-11-30Fixed print catch handler address in codedump; ref #5200dearblue
It became 32 bits in #5200, but only the upper 16 bits were printed.
2020-11-29Merge pull request #5204 from shuujii/use-MRB_SYM-in-src-gc.cYukihiro "Matz" Matsumoto
Use `MRB_SYM` in `src/gc.c`
2020-11-29Use `MRB_SYM` in `src/gc.c`KOBAYASHI Shuji
2020-11-29Merge pull request #5203 from komainu8/fix-heap-buffer-overflowYukihiro "Matz" Matsumoto
Fix heap buffer overflow when dump irep
2020-11-29Fix heap buffer overflow when dump irepHorimoto Yasuhiro
Currently, the size of writing in heap by write_irep_record() is bigger than The size that is calculated by get_irep_record_size. Therefore, irep is dumped over the size of allocating memory when we execute dump_irep().
2020-11-29Merge pull request #5200 from dearblue/catchhandler32Yukihiro "Matz" Matsumoto
Change the catch handler address to 32 bits
2020-11-29Change the catch handler address to 32 bitsdearblue
Follow commit 7150c6753933f12a2ba63769fb7b3a44cfcddd3d .
2020-11-28Remove unused Rake rulesKOBAYASHI Shuji
Currently, the source file language in the core is C only, and C++, Objective-C, and Assembly are not used, so Rake rules for them are removed.