[#89555] [Ruby trunk Feature#15251] Hash aset should deduplicate non tainted string — chopraanmol1@...
Issue #15251 has been updated by chopraanmol1 (Anmol Chopra).
3 messages
2018/10/25
[#89583] [PATCH] vm_trace.c (postponed_job_register): only hit main thread — Eric Wong <normalperson@...>
@hsbt: I post here on ruby-core because I hit errors with
5 messages
2018/10/27
[#89584] Re: [PATCH] vm_trace.c (postponed_job_register): only hit main thread
— Koichi Sasada <ko1@...>
2018/10/27
thank you for you patch.
[#89590] Re: [PATCH] vm_trace.c (postponed_job_register): only hit main thread
— Eric Wong <normalperson@...>
2018/10/28
Koichi Sasada <ko1@atdot.net> wrote:
[#89621] [Ruby trunk Bug#14867] Process.wait can wait for MJIT compiler process — Greg.mpls@...
Issue #14867 has been updated by MSP-Greg (Greg L).
4 messages
2018/10/29
[#89622] Re: [Ruby trunk Bug#14867] Process.wait can wait for MJIT compiler process
— Eric Wong <normalperson@...>
2018/10/29
Greg.mpls@gmail.com wrote:
[#89627] [Ruby trunk Bug#14867] Process.wait can wait for MJIT compiler process — takashikkbn@...
Issue #14867 has been updated by k0kubun (Takashi Kokubun).
3 messages
2018/10/30
[#89654] [Ruby trunk Bug#14867] Process.wait can wait for MJIT compiler process — takashikkbn@...
Issue #14867 has been updated by k0kubun (Takashi Kokubun).
4 messages
2018/10/31
[#89655] Re: [Ruby trunk Bug#14867] Process.wait can wait for MJIT compiler process
— Eric Wong <normalperson@...>
2018/10/31
takashikkbn@gmail.com wrote:
[ruby-core:89599] [Ruby trunk Feature#14145] Proposal: Better Method#inspect
From:
Ruby-Lang@...
Date:
2018-10-28 09:10:04 UTC
List:
ruby-core #89599
Issue #14145 has been updated by jwmittag (J旦rg W Mittag).
guilhermereiscampos (Guilherme Reis Campos) wrote:
> zverok (Victor Shepelev) wrote:
> > ```ruby
> > # We can't extract default values, but at least we can say they are there
> > Addressable::URI.method(:heuristic_parse)
> > # => #<Method Addressable::URI.heuristic_parse(uri, hints = <default>)>
> > ```
> I wonder why is not possible to extract the default values?
Because they can be arbitrary Ruby code and Ruby is a Turing-complete language, which means that figuring out statically what the default value is, is equivalent to solving the Halting Problem. Additionally, Ruby is also capable of I/O and other side-effects, which means that the value can depend on external entities not visible to the documentation generator.
What would `Method#inspect` show for these:
```ruby
def foo(a = while true do; end) end
def bar(a = Time.now) end
def baz(a = if rand < 0.5 then 23 else 'fourty-two' end) end
def qux(a = File.read('somefile.txt')) end
```
And what about this:
```ruby
def crazy(a = FileUtils.rm_rf('/')) end
```
Would you expect `Method#inspect` to evaluate the default argument in order to be able to display its value?
Also, `Method#inspect` returns a `String`, but that loses all information about the type and structure of the default value:
```ruby
class Foo
def inspect; '42' end
end
def foo(a = Foo.new) end
def bar(a = 42) end
method(:foo).inspect
#=> #<Method: Object#foo(a = 42)>
method(:bar).inspect
#=> #<Method: Object#bar(a = 42)>
```
We could copy the source text used to define the default argument into the output of `Method#inspect`, but that would require the source code to be available at runtime, which is a massive memory overhead (one `String` for every optional parameter in the entire system, and there is no upper bound on the size of that `String`, since a default argument can be any arbitrarily large Ruby program). Plus, there is the additional complication that not all methods in a Ruby system even *have* (Ruby) source code.
----------------------------------------
Feature #14145: Proposal: Better Method#inspect
https://bugs.ruby-lang.org/issues/14145#change-74637
* Author: zverok (Victor Shepelev)
* Status: Open
* Priority: Normal
* Assignee:
* Target version:
----------------------------------------
The idea: When investigating (in example scripts, debugger or console) the library you are unfamiliar with, Ruby's reflection is very useful mechanism to understand "what it can": classes, modules, their constants, methods and so on.
I propose to expose a bit more information Ruby has internally in `Method#inspect`:
```ruby
# before:
some_interesting_object.method(:foo) # => #<Method Klass#foo>
# after:
some_interesting_object.method(:foo) # => #<Method Klass#foo(first_arg, *other_args, keyword_arg:)>
```
Dead-naive implementation:
```ruby
class Method
def signature
recv = case receiver
when Module
"#{receiver.name}."
else
"#{receiver.class}#"
end
parameters.map.with_index { |(type, name), i|
case type
when :req then "#{name || "param#{i+1}"}"
when :opt then "#{name || "param#{i+1}"} = <default>"
when :keyreq then "#{name || "kw#{i+1}"}:"
when :key then "#{name || "kwparam#{i+1}"}: <default>"
when :rest then "*#{name || "rest"}"
when :keyrest then "**#{name || "kwrest"}"
end
}.join(', ').prepend("#{recv}#{name}(") << ")"
end
def inspect
"#<#{self.class.name} #{signature}>"
end
end
```
This works "sub-optimal" for methods implemented in C, yet pretty decently for Ruby-implemented methods:
```ruby
# C method, default param names
[1,2,3].method(:at)
# => #<Method Array#at(param1)>
# Ruby method, proper param names
CGI.method(:escape)
# => #<Method CGI.escape(string)>
Addressable::URI.method(:parse)
# => #<Method Addressable::URI.parse(uri)>
Addressable::URI.method(:join)
=> #<Method Addressable::URI.join(*uris)>
# We can't extract default values, but at least we can say they are there
Addressable::URI.method(:heuristic_parse)
# => #<Method Addressable::URI.heuristic_parse(uri, hints = <default>)>
```
If the proposal is accepted, I am ready to implement it properly in C (for all callable objects: `Method`, `UnboundMethod`, `Proc`)
--
https://bugs.ruby-lang.org/
Unsubscribe: <mailto:ruby-core-request@ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>