summaryrefslogtreecommitdiff
path: root/proc.c
Commit message (Collapse)AuthorAgeFilesLines
* Mark struct METHOD->owner for the GCBenoit Daloze2022-10-031-0/+2
| | | | | * Fixes https://github.com/ruby/ruby/commit/6b7d32a5e5 * See [Bug #18729]
* Reduce diff to proc.c @ b0b9f7201acab05c2a3ad92c3043a1f01df3e17fBenoit Daloze2022-09-291-47/+29
| | | | | | * So it's easy to review https://github.com/ruby/ruby/pull/6242 + https://github.com/ruby/ruby/pull/6467 and there are less changes overall.
* Resolve zsuper method during lookup but preserve owner separatelyBenoit Daloze2022-09-291-50/+59
| | | | | * See https://bugs.ruby-lang.org/issues/18729#note-34 * See [Bug #18729]
* Fix {Method,UnboundMethod}#super_method for zsuper methodsBenoit Daloze2022-09-291-12/+13
| | | | | * We need to resolve the zsuper method first, and then look the super method of that.
* Rework vm_core to use `int first_lineno` struct member.Samuel Williams2022-09-261-3/+3
|
* Reuse rb_method_call_kw functionS-H-GAMELINKS2022-09-251-2/+1
|
* Adjust styles [ci skip]Nobuyoshi Nakada2022-09-021-1/+2
|
* Consider resolved-through-zsuper methods equal for compatibilityBenoit Daloze2022-08-201-34/+31
| | | | * Fixes https://bugs.ruby-lang.org/issues/18751
* Make Object#method and Module#instance_method not skip ZSUPER methodsJeremy Evans2022-08-201-17/+46
| | | | | | | | | | | | | | | | | | | | | | | Based on https://github.com/jeremyevans/ruby/commit/c95e7e5329140f640b6497905485761f3336d967 Among other things, this fixes calling visibility methods (public?, protected?, and private?) on them. It also fixes #owner to show the class the zsuper method entry is defined in, instead of the original class it references. For some backwards compatibility, adjust #parameters and #source_location, to show the parameters and source location of the method originally defined. Also have the parameters and source location still be shown by #inspect. Clarify documentation of {Method,UnboundMethod}#owner. Add tests based on the description of https://bugs.ruby-lang.org/issues/18435 and based on https://github.com/ruby/ruby/pull/5356#issuecomment-1005298809 Fixes [Bug #18435] [Bug #18729] Co-authored-by: Benoit Daloze <eregontp@gmail.com>
* Do not clone method entries when bind_call is usedPenelope Phippen2022-08-151-4/+14
| | | | | | | | | | | | | | | I noticed that this site unconditionally clones the method entry, which means that `bind_call` always allocates a `T_IMEMO`. While this clone is necessary for `bind`, it is not necessary for `bind_call`. I work at Stripe, and the sorbet_runtime gem uses bind call as part of it's [call validation](https://github.com/sorbet/sorbet/blob/master/gems/sorbet-runtime/lib/types/private/methods/call_validation.rb#L157) so this can save us a lot of allocations. This patch adds a `clone` parameter to `convert_umethod_to_method_components`, which then controls whether or not we do this cloning. This patch passed Stripe CI and works in our QA environment. I reviewed it with @tenderlove to talk about correctness also.
* Revert "Add {Method,UnboundMethod}#{public?,private?,protected?}"Jeremy Evans2022-08-101-59/+1
| | | | | | | | | | | | This reverts commit 27278150685e738f84105d09843d3ba371146c7a and 58dc8bf8f15df9a33d191074e8a5d4946a3d59d5. Visibility is an attribute of the method entry in a class, not an attribute of the Method object. Fixes [#18729] Fixes [#18751] Fixes [#18435]
* Rename rb_ary_tmp_new to rb_ary_hidden_newPeter Zhu2022-07-261-1/+1
| | | | | | rb_ary_tmp_new suggests that the array is temporary in some way, but that's not true, it just creates an array that's hidden and not on the transient heap. This commit renames it to rb_ary_hidden_new.
* Expand tabs [ci skip]Takashi Kokubun2022-07-211-364/+364
| | | | [Misc #18891]
* Reuse `rb_proc_arity`S.H2022-04-241-7/+2
|
* [DOC] Move the documentations of moved Symbol methodsNobuyoshi Nakada2022-04-141-0/+15
|
* Fix a typo [ci skip]Kazuhiro NISHIYAMA2022-04-061-1/+1
|
* Make define_singleton_method always define a public methodJeremy Evans2022-03-291-50/+58
| | | | | | | In very unlikely cases, it could previously define a non-public method starting in Ruby 2.1. Fixes [Bug #18561]
* Add ISEQ_BODY macroPeter Zhu2022-03-241-16/+16
| | | | | | Use ISEQ_BODY macro to get the rb_iseq_constant_body of the ISeq. Using this macro will make it easier for us to change the allocation strategy of rb_iseq_constant_body when using Variable Width Allocation.
* Encourage arity argument in Proc#curry documentation for procs with variable ↵Jeremy Evans2022-03-171-0/+4
| | | | | | arguments This uses similar language to that used in Method#curry.
* Make Proc#parameters support lambda keyword for returning parameters as if ↵Jeremy Evans2022-03-171-6/+33
| | | | | | | | lambda This makes it easier to use Proc#parameters to build wrappers. Implements [Feature #15357]
* [DOC] Fix broken links to literals.rdocNobuyoshi Nakada2022-02-081-1/+1
|
* Fix {Method,UnboundMethod}#{public?,private?,protected?} for ZSUPER methodsJeremy Evans2022-01-141-4/+11
| | | | | | | | | | | | Add a visibility member to struct METHOD storing the original method visibility, and use that, instead of taking the visibility from the stored method entry (which may have different visibility for ZSUPER methods). Consider Method/UnboundMethod objects different if they have different visibilities. Fixes [Bug #18435]
* Negative RBOOL usageNobuyoshi Nakada2022-01-011-1/+1
|
* Add support for anonymous rest and keyword rest argument forwardingJeremy Evans2021-12-301-2/+14
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This allows for the following syntax: ```ruby def foo(*) bar(*) end def baz(**) quux(**) end ``` This is a natural addition after the introduction of anonymous block forwarding. Anonymous rest and keyword rest arguments were already supported in method parameters, this just allows them to be used as arguments to other methods. The same advantages of anonymous block forwarding apply to rest and keyword rest argument forwarding. This has some minor changes to #parameters output. Now, instead of `[:rest], [:keyrest]`, you get `[:rest, :*], [:keyrest, :**]`. These were already used for `...` forwarding, so I think it makes it more consistent to include them in other cases. If we want to use `[:rest], [:keyrest]` in both cases, that is also possible. I don't think the previous behavior of `[:rest], [:keyrest]` in the non-... case and `[:rest, :*], [:keyrest, :**]` in the ... case makes sense, but if we did want that behavior, we'll have to make more substantial changes, such as using a different ID in the ... forwarding case. Implements [Feature #18351]
* Fix typosKazuhiro NISHIYAMA2021-12-211-3/+3
|
* fix Struct's setter arityKoichi Sasada2021-12-131-1/+1
| | | | https://github.com/ruby/ruby/pull/5131/files#diff-b2553d23e6b1fe76e20608d06c25f6acca06279100f1a9c24febcd79a82fac3cR2689
* Struct setter's parameters == `[:req, :_]`Koichi Sasada2021-12-131-6/+65
| | | | | | | fix [Bug #18405] Note that the parameter name `_` is not a spec, so we shouldn't rely on this behavior.
* add `method_def_aritry()`Koichi Sasada2021-12-131-7/+11
|
* Add {Method,UnboundMethod}#{public?,private?,protected?}Jeremy Evans2021-12-091-0/+51
| | | | | | | These methods allow for checking whether the method has that visibility. Implements [Feature #11689]
* Adding links to literals and Kernel (#5192)Burdette Lamar2021-12-031-1/+2
| | | | * Adding links to literals and Kernel
* optimize `Struct` getter/setterKoichi Sasada2021-11-191-0/+6
| | | | | Introduce new optimized method type `OPTIMIZED_METHOD_TYPE_STRUCT_AREF/ASET` with index information.
* `rb_method_optimized_t` for further extensionKoichi Sasada2021-11-191-9/+5
| | | | | Now `rb_method_optimized_t optimized` field is added to represent optimized method type.
* Cleanup diff against upstream. Add commentsAlan Wu2021-10-201-2/+2
| | | | | I did a `git diff --stat` against upstream and looked at all the files that are outside of YJIT to come up with these minor changes.
* Collect statistics about binding allocations / local variable setAaron Patterson2021-10-201-0/+8
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This commit collects statistics about how many binding objects are allocated as well as the number of local variables set on bindings. Statistics are output along with other YJIT stats. Here is an example of the output: ``` ***YJIT: Printing runtime counters from yjit.rb*** Number of Bindings Allocated: 195 Number of locals modified through binding: 0 opt_send_without_block exit reasons: ivar_get_method 7515891 (40.4%) se_cc_klass_differ 3081330 (16.6%) iseq_argc_mismatch 1564578 ( 8.4%) se_receiver_not_heap 1557663 ( 8.4%) ic_empty 1407064 ( 7.6%) optimized_method 995823 ( 5.4%) iseq_not_simple 819413 ( 4.4%) alias_method 706972 ( 3.8%) bmethod 685253 ( 3.7%) callsite_not_simple 225983 ( 1.2%) kw_splat 25999 ( 0.1%) ivar_set_method 902 ( 0.0%) cfunc_toomany_args 394 ( 0.0%) refined_method 42 ( 0.0%) cfunc_ruby_array_varg 29 ( 0.0%) invalid_cme 4 ( 0.0%) leave exit reasons: se_finish_frame 4067107 (100.0%) se_interrupt 24 ( 0.0%) getinstancevariable exit reasons: undef 121177 (100.0%) idx_out_of_range 5 ( 0.0%) opt_aref exit reasons: (all relevant counters are zero) compiled_iseq_count: 3944 main_block_code_size: 1.1 MiB side_block_code_size: 0.6 MiB vm_insns_count: 1137268516 yjit_exec_insns_count: 414015644 ratio_in_yjit: 26.7% avg_len_in_yjit: 7.5 total_exit_count: 55491789 most frequent exit op: opt_send_without_block: 18587628 (33.5%) opt_getinlinecache: 11075822 (20.0%) send: 4949300 (8.9%) leave: 4067131 (7.3%) defined: 3975196 (7.2%) setinstancevariable: 3567315 (6.4%) invokesuper: 2982163 (5.4%) getblockparamproxy: 2168852 (3.9%) opt_nil_p: 2104524 (3.8%) opt_aref: 2013858 (3.6%) ``` Running RailsBench allocates 195 binding objects but doesn't set any local variables.
* Refactor rb_proc_call functionS-H-GAMELINKS2021-10-101-9/+1
|
* Assert not to be UNDEF visibilityNobuyoshi Nakada2021-09-011-0/+1
| | | | | Any defined methods, bound to any classes/modules and not being UNDEFINED_METHOD_ENTRY_P, should not be METHOD_VISI_UNDEF.
* Add keyrest to ruby2_keywords parameters [Bug #18011]Nobuyoshi Nakada2021-08-031-1/+6
|
* Using RBOOL macroS.H2021-08-021-14/+4
|
* Refactor rb_proc_call_with_block functionS-H-GAMELINKS2021-07-221-7/+1
|
* Emit deprecatation warnings for rb_iterate()Benoit Daloze2021-07-161-14/+2
| | | | | | * It is obsolete since 1.9, see https://github.com/ruby/ruby/blob/master/doc/extension.rdoc#label-Control+Structure and [Misc #18025]
* Remove shift of ep when computing Proc#hashJeremy Evans2021-06-241-1/+1
| | | | | | | | The shift was causing far fewer unique values of hash than expected. Fix pointed out by xtkoba (Tee KOBAYASHI) Fixes [Bug #17951]
* Adjust styles [ci skip]Nobuyoshi Nakada2021-06-171-1/+2
| | | | | | | | | * --braces-after-func-def-line * --dont-cuddle-else * --procnames-start-lines * --space-after-for * --space-after-if * --space-after-while
* [Bug #17780] Fix Method#super_method for module aliasPeter Zhu2021-04-071-1/+1
| | | | | | Method#super_method crashes for aliased module methods because they are not defined on a class. This bug was introduced in c60aaed1856b2b6f90de0992c34771830019e021 as part of bug #17130.
* proc.c: make bind_call use existing callable method entry when possibleJean Boussier2021-03-101-13/+21
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The most common use case for `bind_call` is to protect from core methods being redefined, for instance a typical use: ```ruby UNBOUND_METHOD_MODULE_NAME = Module.instance_method(:name) def real_mod_name(mod) UNBOUND_METHOD_MODULE_NAME.bind_call(mod) end ``` But it's extremely common that the method wasn't actually redefined. In such case we can avoid creating a new callable method entry, and simply delegate to the receiver. This result in a 1.5-2X speed-up for the fast path, and little to no impact on the slowpath: ``` compare-ruby: ruby 3.1.0dev (2021-02-05T06:33:00Z master b2674c1fd7) [x86_64-darwin19] built-ruby: ruby 3.1.0dev (2021-02-15T10:35:17Z bind-call-fastpath d687e06615) [x86_64-darwin19] | |compare-ruby|built-ruby| |:---------|-----------:|---------:| |fastpath | 11.325M| 16.393M| | | -| 1.45x| |slowpath | 10.488M| 10.242M| | | 1.02x| -| ```
* Split `mnew` into unbound and callableNobuyoshi Nakada2021-01-311-10/+16
| | | | | | It always branches by `obj` is `Qundef` or not, which is invariant for each functions; `obj_method` is the latter, and the other two are the former.
* kill CLONESETUP and DUPSETUP卜部昌平2021-01-271-0/+17
| | | | | | | | They are no longer how Object#clone/Object#dup are defined. In fact DUPSETUP is not used from anywhere. CLONESETUP has only one usage. Let's not expose them to extension libraries. cf https://github.com/ruby/ruby/pull/4100#discussion_r563481718
* [DOC] Update Proc.new without a block [ci skip]Nobuyoshi Nakada2021-01-041-9/+6
| | | | | [Feature #10499] [Feature #15554]
* [DOC] Fix typo in proc.cMarcus Stollsteimer2020-12-261-1/+1
|
* Fix class of method in Method#inspect for singleton classes of classesJeremy Evans2020-12-231-3/+6
| | | | | | | | | | | | | | | | | | | | | | | | Previously, due to a change to fix bug 15608, Method#inspect output changed for class methods: Ruby 2.7 "#<Method: String.prepend(*)>" Before change: "#<Method: #<Class:Object>(Module)#prepend(*)>" This is wrong because the Method object was created from String and not Object. This is because the fix for bug 15608 assumed it was being called on the singleton class of a instance, and would skip the first singleton class until it got to the class itself. For class methods, this results in always using the superclass. Fix behavior to not skip until the superclass if the singleton class is the singleton class of a module or class. After change: "#<Method: #<Class:Object>(Module)#prepend(*)>" Fixes [Bug #17428]
* Document Proc#==zverok2020-12-211-0/+26
|