aboutsummaryrefslogtreecommitdiffstats
path: root/object.c
Commit message (Collapse)AuthorAgeFilesLines
* Annotate Kernel#class as inline (#3250)Takashi Kokubun2020-06-231-17/+0
| | | | | | | | | | | | | | | | | | | | | | | | | | ``` $ benchmark-driver -v --rbenv 'before;after;before --jit;after --jit' benchmark/mjit_class.yml --repeat-count=4 before: ruby 2.8.0dev (2020-06-23T07:09:54Z master 37a2e48d76) [x86_64-linux] after: ruby 2.8.0dev (2020-06-23T17:29:56Z inline-class 0ff147c007) [x86_64-linux] before --jit: ruby 2.8.0dev (2020-06-23T07:09:54Z master 37a2e48d76) +JIT [x86_64-linux] after --jit: ruby 2.8.0dev (2020-06-23T17:29:56Z inline-class 0ff147c007) +JIT [x86_64-linux] Calculating ------------------------------------- before after before --jit after --jit mjit_class(self) 39.219M 40.060M 53.502M 69.202M i/s - 40.000M times in 1.019915s 0.998495s 0.747631s 0.578021s mjit_class(1) 39.567M 41.242M 52.100M 68.895M i/s - 40.000M times in 1.010935s 0.969885s 0.767749s 0.580591s Comparison: mjit_class(self) after --jit: 69201690.7 i/s before --jit: 53502336.4 i/s - 1.29x slower after: 40060289.1 i/s - 1.73x slower before: 39218939.2 i/s - 1.76x slower mjit_class(1) after --jit: 68895358.6 i/s before --jit: 52100353.0 i/s - 1.32x slower after: 41241993.6 i/s - 1.67x slower before: 39567314.0 i/s - 1.74x slower ```
* Fix a typo in instance_variable_set documentationJean byroot Boussier2020-06-101-1/+1
|
* Change language used in instance_variable_set documentation [ci skip]Jeremy Evans2020-06-101-3/+3
| | | | | | | This uses less harsh language recommended by duerst. Fixes [Misc #15265] Fixes [Misc #15748]
* sed -i 's|ruby/impl|ruby/internal|'卜部昌平2020-05-111-1/+1
| | | | To fix build failures.
* sed -i s|ruby/3|ruby/impl|g卜部昌平2020-05-111-1/+1
| | | | This shall fix compile errors.
* Classes made from Struct should have default `new` singleton method.Marc-Andre Lafortune2020-05-081-3/+3
| | | | | | | | | | | | | | | [Bug #16465] [Bug #16801] [Fix GH-2795] [Fix GH-2944] [Fix GH-3045] [Fix GH-3093] Note: Backporting shouldn't modify object.h and instead can use struct_new_kw which is basically a duplicate implementation of rb_class_new_instance_pass_kw Co-authored-by: Yusuke Endoh <mame@ruby-lang.org> Co-authored-by: John Hawthorn <john@hawthorn.email> Co-authored-by: Adam Hess <HParker@github.com> Co-authored-by: Jose Cortinas <jacortinas@gmail.com> Co-authored-by: Jean Boussier <jean.boussier@gmail.com>
* Share logically equivalent functionsNobuyoshi Nakada2020-05-071-12/+2
|
* [DOC] Removed no longer meaningful part [ci skip]Nobuyoshi Nakada2020-05-061-3/+0
| | | | | As now `Object#===` document is separated from `rb_equal`, this note no longer makes sense.
* Removed unnecessary duplicate codeNobuyoshi Nakada2020-05-061-4/+1
| | | | | `rb_equal` may be inlined in `case_equal` and actually same code is generated twice.
* Generalize the explanation of the side effect of the rb_equal() optimizationBenoit Daloze2020-05-061-2/+4
|
* Document rb_equal() and clarify the relation with Kernel#===Benoit Daloze2020-05-061-4/+19
| | | | | | | * Multiple times people have been confused and believed rb_equal() called #=== but it does not, it calls #==. * This optimization has a subtle side effect for Float::NAN, which is now documented.
* Remove redundant check in rb_obj_cmp()Benoit Daloze2020-05-061-1/+1
| | | | * rb_equal() already checks using `obj1 == obj2`.
* support builtin for Kernel#FloatS.H2020-04-221-25/+3
| | | | | | | | | | | | | # Iteration per second (i/s) | |compare-ruby|built-ruby| |:------------|-----------:|---------:| |float | 30.395M| 38.314M| | | -| 1.26x| |float_true | 3.833M| 27.322M| | | -| 7.13x| |float_false | 4.182M| 24.938M| | | -| 5.96x|
* Removed NIL/TRUE/FALSENobuyoshi Nakada2020-04-171-15/+0
| | | | Deprerecated constants which had been warned since 2.4.
* Suppress -Wswitch warningsNobuyoshi Nakada2020-04-081-0/+6
|
* Merge pull request #2991 from shyouhei/ruby.h卜部昌平2020-04-081-1/+1
| | | Split ruby.h
* Support obj.clone(freeze: true) for freezing cloneJeremy Evans2020-03-221-24/+50
| | | | | | | | | | | | | | | | | | This freezes the clone even if the receiver is not frozen. It is only for consistency with freeze: false not freezing the clone even if the receiver is frozen. Because Object#clone is now partially implemented in Ruby and not fully implemented in C, freeze: nil must be supported to provide the default behavior of only freezing the clone if the receiver is frozen. This requires modifying delegate and set, to set freeze: nil instead of freeze: true as the keyword parameter for initialize_clone. Those are the two libraries in stdlib that override initialize_clone. Implements [Feature #16175]
* Check if `freeze` option is givenNobuyoshi Nakada2020-03-171-1/+1
|
* support builtin for Kernel#cloneS.H2020-03-171-33/+18
|
* Pass keyword argument by RB_PASS_KEYWORDSNobuyoshi Nakada2020-03-121-1/+1
| | | | | | To pass `false` as `freeze:` keyword argument, `kw_splat` argument should be true. Also `rb_keyword_given_p()` should return true here as `false` has been given as a keyword argument.
* [DOC] fixed line numbers [ci skip]Nobuyoshi Nakada2020-01-241-6/+6
| | | | | Fix up the example of const_source_location at 2bde7919a0a8302c344e9bb9ddc217958fcbd3c7.
* Clarify const_source_location docszverok2020-01-231-9/+13
|
* Added rb_warn_deprecated_to_removeNobuyoshi Nakada2020-01-231-7/+7
| | | | | Warn the deprecation and future removal, with obeying the warning flag.
* Make taint warnings non-verbose instead of verboseJeremy Evans2020-01-221-7/+7
|
* Call initialize_clone with freeze: false if clone called with freeze: falseJeremy Evans2020-01-031-8/+44
| | | | | | | | | | | | | | | | | | | This makes it possible to initialize_clone to correctly not freeze internal state if the freeze: false keyword is passed to clone. If clone is called with freeze: true or no keyword, do not pass a second argument to initialize_clone to keep backwards compatibility. This makes it so that external libraries that override initialize_clone but do not support the freeze keyword will fail with ArgumentError if passing freeze: false to clone. I think that is better than the current behavior, which succeeds but results in an unfrozen object with frozen internals. Fix related issues in set and delegate in stdlib. Fixes [Bug #14266]
* Fully separate positional arguments and keyword argumentsJeremy Evans2020-01-021-3/+1
| | | | | | | | | | | | | | | | | | | | | | | | This removes the warnings added in 2.7, and changes the behavior so that a final positional hash is not treated as keywords or vice-versa. To handle the arg_setup_block splat case correctly with keyword arguments, we need to check if we are taking a keyword hash. That case didn't have a test, but it affects real-world code, so add a test for it. This removes rb_empty_keyword_given_p() and related code, as that is not needed in Ruby 3. The empty keyword case is the same as the no keyword case in Ruby 3. This changes rb_scan_args to implement keyword argument separation for C functions when the : character is used. For backwards compatibility, it returns a duped hash. This is a bad idea for performance, but not duping the hash breaks at least Enumerator::ArithmeticSequence#inspect. Instead of having RB_PASS_CALLED_KEYWORDS be a number, simplify the code by just making it be rb_keyword_given_p().
* Fix Object#inspect documentationJoao Fernandes2019-12-311-1/+1
| | | | | Starting from ruby 2.7.0, there's no longer a connection between the hexadecimal number that #inspect shows and the object's ID.
* Use the more popular word [ci skip]Nobuyoshi Nakada2019-12-271-2/+2
| | | | [Bug #16437]
* decouple internal.h headers卜部昌平2019-12-261-7/+20
| | | | | | | | | | | | | | | | | | Saves comitters' daily life by avoid #include-ing everything from internal.h to make each file do so instead. This would significantly speed up incremental builds. We take the following inclusion order in this changeset: 1. "ruby/config.h", where _GNU_SOURCE is defined (must be the very first thing among everything). 2. RUBY_EXTCONF_H if any. 3. Standard C headers, sorted alphabetically. 4. Other system headers, maybe guarded by #ifdef 5. Everything else, sorted alphabetically. Exceptions are those win32-related headers, which tend not be self- containing (headers have inclusion order dependencies).
* `Object#=~` warning also obeys `Warning[:deprecated]`Nobuyoshi Nakada2019-12-241-2/+4
|
* Document Module#const_source_locationzverok2019-12-231-0/+47
|
* Deprecate taint/trust and related methods, and make the methods no-opsJeremy Evans2019-11-181-101/+21
| | | | | | This removes the related tests, and puts the related specs behind version guards. This affects all code in lib, including some libraries that may want to support older versions of Ruby.
* Prohibit calling undefined allocator [Bug #16297]Nobuyoshi Nakada2019-11-061-2/+29
|
* [EXPERIMENTAL] Make NilClass#to_s, TrueClass#to_s and FalseClass#to_s return ↵Jean Boussier2019-09-271-3/+13
| | | | | | | | a frozen String * Always the same frozen String for each of these values. * Avoids extra allocations whenever calling these 3 methods. * See [Feature #16150]
* Make passing empty keywords to dig pass empty keywords to next dig methodJeremy Evans2019-09-201-2/+5
| | | | | | | | | | | | | | | | If defined in Ruby, dig would be defined as def dig(arg, *rest) end, it would not use keywords. If the last dig argument was an empty hash, it could be treated as keyword arguments by the next dig method. Allow dig to pass along the empty keyword flag if called with an empty keyword, to suppress the previous behavior and force treating the hash as a positional argument and not keywords. Also handle the case where dig calls method_missing, passing the empty keyword flag to that as well. This requires adding rb_check_funcall_with_hook_kw functions, so that dig can specify how arguments are treated. It also adds kw_splat arguments to a couple static functions.
* Only set RB_PASS_CALLED_KEYWORDS in C functions called directly from RubyJeremy Evans2019-09-141-2/+19
| | | | | | | | | | | It is not safe to set this in C functions that can be called from other C functions, as in the non argument-delegation case, you can end up calling a Ruby method with a flag indicating keywords are set without passing keywords. Introduce some new *_kw functions that take a kw_splat flag and use these functions to set RB_PASS_CALLED_KEYWORDS in places where we know we are delegating methods (e.g. Class#new, Method#call)
* drop-in type check for rb_define_private_method卜部昌平2019-08-291-12/+24
| | | | | | | We can check the function pointer passed to rb_define_private_method like how we do so in rb_define_method. Doing so revealed some problematic usages of rb_obj_dummy. They had to be split according to their arity.
* move docs around [ci skip]卜部昌平2019-08-291-0/+261
| | | | To properly generate documents.
* drop-in type check for rb_define_global_function卜部昌平2019-08-291-2/+8
| | | | | | We can check the function pointer passed to rb_define_global_function like we do so in rb_define_method. It turns out that almost anybody is misunderstanding the API.
* Minor documentation fixes [ci skip]Jeremy Evans2019-08-241-5/+5
| | | | | | From zverok (Victor Shepelev) Fixes [Misc #16126]
* Move Object#hash rdoc to hash.c [ci skip]Jeremy Evans2019-08-241-20/+1
| | | | | | This gets RDoc to pick up the documentation correctly. Problem pointed out by zverok (Victor Shepelev).
* Fix doc in Object#respond_to_missing? (#2239)songhuangcn2019-08-161-1/+1
|
* Revert "Revert "Add a specialized instruction for `.nil?` calls""Yusuke Endoh2019-08-021-1/+1
| | | | | | This reverts commit a0980f2446c0db735b8ffeb37e241370c458a626. Retry for macOS Mojave.
* Revert "Add a specialized instruction for `.nil?` calls"Yusuke Endoh2019-08-021-1/+1
| | | | | | | | | | This reverts commit 9faef3113fb4331524b81ba73005ba13fa0ef6c6. It seemed to cause a failure on macOS Mojave, though I'm unsure how. https://rubyci.org/logs/rubyci.s3.amazonaws.com/osx1014/ruby-master/log/20190802T034503Z.fail.html.gz This tentative revert is to check if the issue is actually caused by the change or not.
* Update object.cAaron Patterson2019-07-311-1/+1
| | | | Co-Authored-By: Takashi Kokubun <takashikkbn@gmail.com>
* Add a specialized instruction for `.nil?` callsAaron Patterson2019-07-311-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This commit adds a specialized instruction for called to `.nil?`. It is about 27% faster than master in the case where the object is nil or not nil. In the case where an object implements `nil?`, I think it may be slightly slower. Here is a benchmark: ```ruby require "benchmark/ips" class Niller def nil?; true; end end not_nil = Object.new xnil = nil niller = Niller.new Benchmark.ips do |x| x.report("nil?") { xnil.nil? } x.report("not nil") { not_nil.nil? } x.report("niller") { niller.nil? } end ``` On Ruby master: ``` [aaron@TC ~/g/ruby (master)]$ ./ruby compil.rb Warming up -------------------------------------- nil? 429.195k i/100ms not nil 437.889k i/100ms niller 437.935k i/100ms Calculating ------------------------------------- nil? 20.166M (± 8.1%) i/s - 100.002M in 5.002794s not nil 20.046M (± 7.6%) i/s - 99.839M in 5.020086s niller 22.467M (± 6.1%) i/s - 112.111M in 5.013817s [aaron@TC ~/g/ruby (master)]$ ./ruby compil.rb Warming up -------------------------------------- nil? 449.660k i/100ms not nil 433.836k i/100ms niller 443.073k i/100ms Calculating ------------------------------------- nil? 19.997M (± 8.8%) i/s - 99.375M in 5.020458s not nil 20.529M (± 7.0%) i/s - 102.385M in 5.020689s niller 21.796M (± 8.0%) i/s - 108.110M in 5.002300s [aaron@TC ~/g/ruby (master)]$ ./ruby compil.rb Warming up -------------------------------------- nil? 402.119k i/100ms not nil 438.968k i/100ms niller 398.226k i/100ms Calculating ------------------------------------- nil? 20.050M (±12.2%) i/s - 98.519M in 5.008817s not nil 20.614M (± 8.0%) i/s - 102.280M in 5.004531s niller 22.223M (± 8.8%) i/s - 110.309M in 5.013106s ``` On this branch: ``` [aaron@TC ~/g/ruby (specialized-nilp)]$ ./ruby compil.rb Warming up -------------------------------------- nil? 468.371k i/100ms not nil 456.517k i/100ms niller 454.981k i/100ms Calculating ------------------------------------- nil? 27.849M (± 7.8%) i/s - 138.169M in 5.001730s not nil 26.417M (± 8.7%) i/s - 131.020M in 5.011674s niller 21.561M (± 7.5%) i/s - 107.376M in 5.018113s [aaron@TC ~/g/ruby (specialized-nilp)]$ ./ruby compil.rb Warming up -------------------------------------- nil? 477.259k i/100ms not nil 428.712k i/100ms niller 446.109k i/100ms Calculating ------------------------------------- nil? 28.071M (± 7.3%) i/s - 139.837M in 5.016590s not nil 25.789M (±12.9%) i/s - 126.470M in 5.011144s niller 20.002M (±12.2%) i/s - 98.144M in 5.001737s [aaron@TC ~/g/ruby (specialized-nilp)]$ ./ruby compil.rb Warming up -------------------------------------- nil? 467.676k i/100ms not nil 445.791k i/100ms niller 415.024k i/100ms Calculating ------------------------------------- nil? 26.907M (± 8.0%) i/s - 133.755M in 5.013915s not nil 25.319M (± 7.9%) i/s - 125.713M in 5.007758s niller 19.569M (±11.8%) i/s - 96.286M in 5.008533s ``` Co-Authored-By: Ashe Connor <kivikakk@github.com>
* Add more documentation on #eql?/#hash relationship [ci skip]Jeremy Evans2019-07-261-1/+5
| | | | Fixes [Bug #14263]
* Restore documentation for Object#hash [ci skip]Jeremy Evans2019-07-261-0/+19
| | | | | Object#hash documentation was removed (probably by accident) in 7b19e6f3fdf8b0238752cb1561dfe42a283f5308.
* Check exception flag as a bool [Bug #15987]Nobuyoshi Nakada2019-07-111-8/+21
|
* Moved error messagesNobuyoshi Nakada2019-07-091-13/+15
|