Bug #7656 » ruby-docs-201301_PP-Debug-ENV.patch
| hash.c | ||
|---|---|---|
|
return ary;
|
||
|
}
|
||
|
/*
|
||
|
* call-seq:
|
||
|
* ENV.each_key { |name| } -> Hash
|
||
|
* ENV.each_key -> Enumerator
|
||
|
*
|
||
|
* Yields each environment variable name.
|
||
|
*
|
||
|
* An Enumerator is returned if no block is given.
|
||
|
*/
|
||
|
static VALUE
|
||
|
rb_env_size(VALUE ehash)
|
||
|
{
|
||
| ... | ... | |
|
return LONG2FIX(cnt);
|
||
|
}
|
||
|
/*
|
||
|
* Document-method: ENV.each_key
|
||
|
*
|
||
|
* call-seq:
|
||
|
* ENV.each_key { |name| } -> Hash
|
||
|
* ENV.each_key -> Enumerator
|
||
|
*
|
||
|
* Yields each environment variable name.
|
||
|
*
|
||
|
* An Enumerator is returned if no block is given.
|
||
|
*/
|
||
|
static VALUE
|
||
|
env_each_key(VALUE ehash)
|
||
|
{
|
||
| lib/debug.rb | ||
|---|---|---|
|
@stdout = STDOUT
|
||
|
class << DEBUGGER__
|
||
|
# Returns the IO used as stdout. Defaults to STDOUT
|
||
|
def stdout
|
||
|
@stdout
|
||
|
end
|
||
|
# Sets the IO used as stdout. Defaults to STDOUT
|
||
|
def stdout=(s)
|
||
|
@stdout = s
|
||
|
end
|
||
|
# Returns the display expression list
|
||
|
#
|
||
|
# See DEBUGGER__ for more useage
|
||
|
def display
|
||
|
@display
|
||
|
end
|
||
|
# Returns the list of break points to stop operation at
|
||
|
#
|
||
|
# See DEBUGGER__ for more useage
|
||
|
def break_points
|
||
|
@break_points
|
||
|
end
|
||
|
# Returns the list of waiting threads.
|
||
|
#
|
||
|
# When stepping through thre traces of a function, thread gets suspended, to be resumed later.
|
||
|
def waiting
|
||
|
@waiting
|
||
|
end
|
||
| lib/pp.rb | ||
|---|---|---|
|
end
|
||
|
module PPMethods
|
||
|
# Yields to a block
|
||
|
# and preserves the previous set of objects being printed.
|
||
|
def guard_inspect_key
|
||
|
if Thread.current[:__recursive_key__] == nil
|
||
|
Thread.current[:__recursive_key__] = {}.untrust
|
||
| ... | ... | |
|
end
|
||
|
end
|
||
|
# Check whether the object_id +id+ is in the current buffer of objects
|
||
|
# to be pretty printed. Used to break cycles in chains of objects to be
|
||
|
# pretty printed.
|
||
|
# As follows:
|
||
|
#
|
||
|
# obj = Object.new
|
||
|
# => #<Object:0x843a384>
|
||
|
# check_inspect_key(obj.object_id)
|
||
|
# => false
|
||
|
# push_inspect_key(obj.object_id)
|
||
|
# => true
|
||
|
# check_inspect_key(obj.object_id)
|
||
|
# => true
|
||
|
#
|
||
|
def check_inspect_key(id)
|
||
|
Thread.current[:__recursive_key__] &&
|
||
|
Thread.current[:__recursive_key__][:inspect] &&
|
||
|
Thread.current[:__recursive_key__][:inspect].include?(id)
|
||
|
end
|
||
|
# Adds the object_id +id+ to the set of objects being pretty printed, so
|
||
|
# as to not repeat objects.
|
||
|
def push_inspect_key(id)
|
||
|
Thread.current[:__recursive_key__][:inspect][id] = true
|
||
|
end
|
||
|
# Removes an object from the set of objects being pretty printed.
|
||
|
def pop_inspect_key(id)
|
||
|
Thread.current[:__recursive_key__][:inspect].delete id
|
||
|
end
|
||
| ... | ... | |
|
group(1, '#<' + obj.class.name, '>', &block)
|
||
|
end
|
||
|
# A mask used in formating object_id's into a hexadecimal id
|
||
|
PointerMask = (1 << ([""].pack("p").size * 8)) - 1
|
||
|
case Object.new.inspect
|
||
|
when /\A\#<Object:0x([0-9a-f]+)>\z/
|
||
|
# String Formating for hexadecimal id
|
||
|
PointerFormat = "%0#{$1.length}x"
|
||
|
else
|
||
|
PointerFormat = "%x"
|
||
|
end
|
||
|
def object_address_group(obj, &block)
|
||
|
# A convenience method, like object_group, but also reformats the Object's
|
||
|
# object_id.
|
||
|
def object_address_group(obj, &block) # :yield:
|
||
|
id = PointerFormat % (obj.object_id * 2 & PointerMask)
|
||
|
group(1, "\#<#{obj.class}:0x#{id}", '>', &block)
|
||
|
end
|
||
| ... | ... | |
|
}
|
||
|
end
|
||
|
# A present standard failsafe for pretty printing any given Object
|
||
|
def pp_object(obj)
|
||
|
object_address_group(obj) {
|
||
|
seplist(obj.pretty_print_instance_variables, lambda { text ',' }) {|v|
|
||
| ... | ... | |
|
}
|
||
|
end
|
||
|
# A pretty print for a Hash
|
||
|
def pp_hash(obj)
|
||
|
group(1, '{', '}') {
|
||
|
seplist(obj, nil, :each_pair) {|k, v|
|
||
| ... | ... | |
|
end
|
||
|
class Array
|
||
|
# Used by PP to show Array specific pretty printing
|
||
|
def pretty_print(q)
|
||
|
q.group(1, '[', ']') {
|
||
|
q.seplist(self) {|v|
|
||
| ... | ... | |
|
}
|
||
|
end
|
||
|
# Used by PP to show a cycle, or repitition, of Arrays
|
||
|
def pretty_print_cycle(q)
|
||
|
q.text(empty? ? '[]' : '[...]')
|
||
|
end
|
||
|
end
|
||
|
class Hash
|
||
|
# Used by PP to show Hash specific pretty printing
|
||
|
def pretty_print(q)
|
||
|
q.pp_hash self
|
||
|
end
|
||
|
# Used by PP to show a cycle, or repitition, of Hashes
|
||
|
def pretty_print_cycle(q)
|
||
|
q.text(empty? ? '{}' : '{...}')
|
||
|
end
|
||
|
end
|
||
|
class << ENV
|
||
|
# Used by PP to show ENV specific pretty printing
|
||
|
def pretty_print(q)
|
||
|
h = {}
|
||
|
ENV.keys.sort.each {|k|
|
||
| ... | ... | |
|
end
|
||
|
class Struct
|
||
|
# Used by PP to show Struct specific pretty printing
|
||
|
def pretty_print(q)
|
||
|
q.group(1, sprintf("#<struct %s", PP.mcall(self, Kernel, :class).name), '>') {
|
||
|
q.seplist(PP.mcall(self, Struct, :members), lambda { q.text "," }) {|member|
|
||
| ... | ... | |
|
}
|
||
|
end
|
||
|
# Used by PP to show a cycle, or repitition, of Structs
|
||
|
def pretty_print_cycle(q)
|
||
|
q.text sprintf("#<struct %s:...>", PP.mcall(self, Kernel, :class).name)
|
||
|
end
|
||
|
end
|
||
|
class Range
|
||
|
# Used by PP to show Range specific pretty printing
|
||
|
def pretty_print(q)
|
||
|
q.pp self.begin
|
||
|
q.breakable ''
|
||
| ... | ... | |
|
class File < IO
|
||
|
class Stat
|
||
|
# Used by PP to show File::Stat specific pretty printing
|
||
|
def pretty_print(q)
|
||
|
require 'etc.so'
|
||
|
q.object_group(self) {
|
||
| ... | ... | |
|
end
|
||
|
class MatchData
|
||
|
# Used by PP to show MatchData specific pretty printing
|
||
|
def pretty_print(q)
|
||
|
nc = []
|
||
|
self.regexp.named_captures.each {|name, indexes|
|
||