Age | Commit message (Collapse) | Author |
|
|
|
There are two styles that argv contains keyword arguments: one is
VM_CALL_KWARG which contains value elements in argv (to avoid a hash
object creation if possible), and the other is VM_CALL_KW_SPLAT which
contains one last hash in argv.
vm_caller_setup_arg_kw translates argv from the VM_CALL_KWARG style to
the VM_CALL_KW_SPLAT style.
`calling->kw_splat` means that argv is the VM_CALL_KW_SPLAT style.
So, instead of setting `calling->kw_splat` at many places, it would be
better to do so when vm_caller_setup_arg_kw is called.
|
|
This is needed for C functions to call methods with keyword arguments.
This is a copy of rb_funcall_with_block with an extra argument for
the keyword flag.
There isn't a clean way to implement this that doesn't involve
changing a lot of function signatures, because rb_call doesn't
support a way to mark that the call has keyword arguments. So hack
this in using a CALL_PUBLIC_KW call_type, which we switch for
CALL_PUBLIC later in the call stack.
We do need to modify rm_vm_call0 to take an argument for whether
keyword arguments are used, since the call_type is no longer
available at that point. Use the passed in value to set the
appropriate keyword flag in both calling and ci_entry.
|
|
The kw_splat flag is whether the original call passes keyword or not.
Some types of methods (e.g., bmethod and sym_proc) drops the
information. This change tries to propagate the flag to the final
callee, as far as I can.
|
|
|
|
This wraps iseq_location and should fix the leaked global test.
|
|
This shows locations in places it didn't before, such as for
proc calls, and fixes the location for super calls.
This requires making iseq_location non-static and MJIT exported,
which I hope will not cause problems.
|
|
parameters
Previously, there was no warning in this case, even though we will
be changing the behavior in Ruby 3.
Fixes [Bug #14130]
|
|
This warns about a case that we will continue to support.
|
|
Notes:
Merged: https://github.com/ruby/ruby/pull/2395
|
|
For methods that accept keyword arguments but do not accept a
keyword splat, if a keyword splat is passed, or keywords are
used with a non-symbol key, check the hash. If the hash contains
all symbols, keep the same behavior as before. If the hash
contains all non-symbols, move the hash to the last positional
hash and warn. If the hash contains symbols and non-Symbols, split
the hash and use the symbol keys for the keyword hash and non-symbol
keys for the positional hash and warn.
Notes:
Merged: https://github.com/ruby/ruby/pull/2395
|
|
Notes:
Merged: https://github.com/ruby/ruby/pull/2395
|
|
This syntax means the method should be treated as a method that
uses keyword arguments, but no specific keyword arguments are
supported, and therefore calling the method with keyword arguments
will raise an ArgumentError. It is still allowed to double splat
an empty hash when calling the method, as that does not pass
any keyword arguments.
Notes:
Merged: https://github.com/ruby/ruby/pull/2395
|
|
This restores compatibility with Ruby 2.6, splitting the last
positional hash into positional and keyword arguments if it
contains both symbol and non-symbol keys. However, in this case
it will warn, as the behavior in Ruby 3 will be to not split the
hash and keep it as a positional argument.
This does not affect the handling of mixed symbol and non-symbol
keys in bare keywords. Those are still treated as keywords now,
as they were before this patch. This results in different
behavior than Ruby 2.6, which would split the bare keywords and
use the non-Symbol keys as a positional arguments.
Notes:
Merged: https://github.com/ruby/ruby/pull/2395
|
|
If all keys are not symbols, then the non-symbol keys would not
be treated as keywords in previous versions. It doesn't make
sense to treat these hashes as keywords to break compatibility and
warn about behavior changes in Ruby 2.7 when the Ruby 3.0 behavior
will be the same as the Ruby 2.6 for these hashes.
Notes:
Merged: https://github.com/ruby/ruby/pull/2395
|
|
Previously, it only applied if the call had more positional
arguments than the method it was calling accepted.
Notes:
Merged: https://github.com/ruby/ruby/pull/2395
|
|
Treat the ** syntax as passing a copy of the hash as the last
positional argument. If the hash being double splatted is empty, do
not add a positional argument.
Remove rb_no_keyword_hash, no longer needed.
Notes:
Merged: https://github.com/ruby/ruby/pull/2395
|
|
And, allow non-symbol keys as a keyword arugment
Notes:
Merged: https://github.com/ruby/ruby/pull/2395
|
|
ARRAY_ASET() does not change the length of array, so
use rb_ary_push() instead of ARRAY_ASET(). It prevents
updating reference on GC.compact.
|
|
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@67504 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
|
|
Because hard to specify commits related to r67479 only.
So please commit again.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@67499 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
|
|
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@67493 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
|
|
In addition to detect dead canary, we try to detect the very moment
when we smash the stack top. Requested by k0kubun:
https://twitter.com/k0kubun/status/1085180749899194368
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@66981 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
|
|
* vm_args.c (refine_sym_proc_call): traverse ancestors to search
inherited methods for symbol proc.
[ruby-dev:50741] [Bug #15489]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@66658 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
|
|
These send and its variant instructions are the most frequently called
paths in the entire process. Reducing macro expansions to make them
dedicated function called vm_sendish() is the main goal of this
changeset. It reduces the size of vm_exec_coref from 25,552 bytes to
23,728 bytes on my machine.
I see no significant slowdown.
Fix: [GH-2056]
vanilla: ruby 2.6.0dev (2018-12-19 trunk 66449) [x86_64-darwin15]
ours: ruby 2.6.0dev (2018-12-19 refactor-send 66449) [x86_64-darwin15]
last_commit=insns.def: refactor to avoid CALL_METHOD macro
Calculating -------------------------------------
vanilla ours
vm2_defined_method 2.645M 2.823M i/s - 6.000M times in 5.109888s 4.783254s
vm2_method 8.553M 8.873M i/s - 6.000M times in 1.579892s 1.524026s
vm2_method_missing 3.772M 3.858M i/s - 6.000M times in 3.579482s 3.499220s
vm2_method_with_block 8.494M 8.944M i/s - 6.000M times in 1.589774s 1.509463s
vm2_poly_method 0.571 0.607 i/s - 1.000 times in 3.947570s 3.733528s
vm2_poly_method_ov 5.514 5.168 i/s - 1.000 times in 0.408156s 0.436169s
vm3_clearmethodcache 2.875 2.837 i/s - 1.000 times in 0.783018s 0.793493s
Comparison:
vm2_defined_method
ours: 2822555.4 i/s
vanilla: 2644878.1 i/s - 1.07x slower
vm2_method
ours: 8872947.8 i/s
vanilla: 8553433.1 i/s - 1.04x slower
vm2_method_missing
ours: 3858192.3 i/s
vanilla: 3772296.3 i/s - 1.02x slower
vm2_method_with_block
ours: 8943825.1 i/s
vanilla: 8493955.0 i/s - 1.05x slower
vm2_poly_method
ours: 0.6 i/s
vanilla: 0.6 i/s - 1.06x slower
vm2_poly_method_ov
vanilla: 5.5 i/s
ours: 5.2 i/s - 1.07x slower
vm3_clearmethodcache
vanilla: 2.9 i/s
ours: 2.8 i/s - 1.01x slower
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@66565 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
|
|
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@66440 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
|
|
* vm_args.c (refine_sym_proc_call): resolve refinements when the
proc is invoked, instead of resolving at making the proc, to
enable refinements on symbol-proc in ruby-level methods
* vm.c (vm_cref_dup): clear cached symbol-procs when duplicating.
[Bug #15114] [Fix GH-2039]
From: manga_osyo <[email protected]>
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@66439 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
|
|
Due to assertion failures when VM_CHECK_MODE >= 2.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@66182 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
|
|
* vm_args.c (refine_sym_proc_call): enalbe accidentally disabled
refinements in Symbol#to_proc. [Bug #15114]
From: osyo (manga osyo) <[email protected]>
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@66181 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
|
|
Due to assertion failures when VM_CHECK_MODE >= 2.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@66155 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
|
|
* vm_args.c (refine_sym_proc_call): enalbe accidentally disabled
refinements in Symbol#to_proc. [Bug #15114]
From: osyo (manga osyo) <[email protected]>
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@66151 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
|
|
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@66150 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
|
|
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@66149 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
|
|
* transient_heap.c, transient_heap.h: implement TransientHeap (theap).
theap is designed for Ruby's object system. theap is like Eden heap
on generational GC terminology. theap allocation is very fast because
it only needs to bump up pointer and deallocation is also fast because
we don't do anything. However we need to evacuate (Copy GC terminology)
if theap memory is long-lived. Evacuation logic is needed for each type.
See [Bug #14858] for details.
* array.c: Now, theap for T_ARRAY is supported.
ary_heap_alloc() tries to allocate memory area from theap. If this trial
sccesses, this array has theap ptr and RARRAY_TRANSIENT_FLAG is turned on.
We don't need to free theap ptr.
* ruby.h: RARRAY_CONST_PTR() returns malloc'ed memory area. It menas that
if ary is allocated at theap, force evacuation to malloc'ed memory.
It makes programs slow, but very compatible with current code because
theap memory can be evacuated (theap memory will be recycled).
If you want to get transient heap ptr, use RARRAY_CONST_PTR_TRANSIENT()
instead of RARRAY_CONST_PTR(). If you can't understand when evacuation
will occur, use RARRAY_CONST_PTR().
(re-commit of r65444)
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@65449 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
|
|
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@65448 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
|
|
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@65447 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
|
|
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@65445 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
|
|
* transient_heap.c, transient_heap.h: implement TransientHeap (theap).
theap is designed for Ruby's object system. theap is like Eden heap
on generational GC terminology. theap allocation is very fast because
it only needs to bump up pointer and deallocation is also fast because
we don't do anything. However we need to evacuate (Copy GC terminology)
if theap memory is long-lived. Evacuation logic is needed for each type.
See [Bug #14858] for details.
* array.c: Now, theap for T_ARRAY is supported.
ary_heap_alloc() tries to allocate memory area from theap. If this trial
sccesses, this array has theap ptr and RARRAY_TRANSIENT_FLAG is turned on.
We don't need to free theap ptr.
* ruby.h: RARRAY_CONST_PTR() returns malloc'ed memory area. It menas that
if ary is allocated at theap, force evacuation to malloc'ed memory.
It makes programs slow, but very compatible with current code because
theap memory can be evacuated (theap memory will be recycled).
If you want to get transient heap ptr, use RARRAY_CONST_PTR_TRANSIENT()
instead of RARRAY_CONST_PTR(). If you can't understand when evacuation
will occur, use RARRAY_CONST_PTR().
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@65444 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
|
|
* vm_args.c: rb_ary_dup(args->rest) to be used at most once during
parameter setup. [Feature #15010]
A patch by chopraanmol1 (Anmol Chopra) <[email protected]>.
* array.c (rb_ary_behead): added to remove first n elements.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@64583 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
|
|
_mjit_compile_send.erb: simplify code using the change
insns.def: adapt to the interface change
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@64281 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
|
|
Repack rb_thread_struct, rb_execution_context_struct, args_info and
iseq_compile_data to save 1 word per struct.
re_pattern_buffer remains unpacked due to the possible binary
compatibility.
[Fix GH-1907]
Based on the patch
From: Lourens Naudé <[email protected]>
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@64096 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
|
|
because such inconsistency may result in the regression fixed in r64034.
vm_exec is not touched since renaming it may be controversial...
vm_args.c: ditto.
vm_eval.c: ditto.
vm_insnhelper.c: ditto.
vm_method.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@64035 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
|
|
* vm_args.c (setup_parameters_complex): refine the warning message
for a splat hash which was passed to a single variable instead
of keyword arguments. this behavior will be changed when the
"real" keyword argument is introduced in the future.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@63540 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
|
|
* vm_args.c (setup_parameters_complex): [EXPERIMENTAL] warn when
splat keyword arguments is passed as a single ordinary argument,
not as a keyword rest argument.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@62914 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
|
|
(IS_ARGS_SPLAT, IS_ARGS_KEYWORD) with vm_args.c.
vm_args.c: share them with mjit_compile.c.
vm_insnhelper.h: get those definitions, with CALLER_SETUP_ARG too
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@62254 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
|
|
* vm_args.c (vm_to_proc): enable #to_proc by refinements at Proc
passing as a block. patched by osyo (manga osyo).
[Feature #14223]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@62020 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
|
|
* vm_args.c (KW_SPECIFIED_BITS_MAX): subtracted 1bit for
FIXNUM_FLAG. [ruby-core:84921] [Bug #14373]
* vm_insnhelper.c (vm_check_keyword): unsigned for bit operation.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@61945 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
|
|
* vm_insnhelper.c (vm_check_keyword): if the index exceeds the
width of unspecified bits, that argument is specified.
`unspecified_bits` still be a fixnum if the actual arguments do
not exceed the limit, regardless the formal parameters size.
[ruby-core:84921] [Bug #14373]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@61940 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
|
|
* compile.c (setup_args): use `getblockparamproxy` (`rb_block_param_proxy`)
to represent a block parameter passing.
* vm_args.c (vm_caller_setup_arg_block): check `rb_block_param_proxy`
instead of using `VM_CALL_ARGS_BLOCKARG_BLOCKPARAM` call flag.
* vm_core.h (VM_CALL_ARGS_BLOCKARG_BLOCKPARAM): removed.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@61694 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
|
|
* vm_args.c (args_setup_kw_parameters): use same ec as the caller.
make arguments order consistent with other functions.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@60874 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
|