Skip to content

Commit cc71299

Browse files
authored
Merge pull request jruby#8529 from enebo/data_fixes
Data fixes
2 parents 70b8ed6 + e66ce9f commit cc71299

File tree

1 file changed

+25
-2
lines changed
  • core/src/main/ruby/jruby/kernel

1 file changed

+25
-2
lines changed

core/src/main/ruby/jruby/kernel/data.rb

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ def self.define(*symbols, &)
1515
data_class = Class.new {
1616
self.define_singleton_method(:members) { members }
1717

18+
define_method(:members) { self.class.members }
19+
1820
define_method(:initialize) do |*values, **kwargs|
1921
local_members = members
2022
if kwargs && !kwargs.empty?
@@ -53,9 +55,30 @@ def self.define(*symbols, &)
5355
nil
5456
end
5557

56-
define_method(:to_h) do
58+
alias _original_inspect_ inspect
59+
define_method(:inspect) do
60+
# We implement this using Ruby and our inspect output shows the @ for the member fields.
61+
# Without exposing some very internal methods using JRuby.reference we cannot generate this
62+
# naturally so we will post-process the output.
63+
_original_inspect_.tap do |original_inspect|
64+
original_inspect.gsub! /@([^=]+=)/, '\1'
65+
end
66+
end
67+
68+
define_method(:to_h) do |&blk|
5769
hash = Hash.new.compare_by_identity
58-
members.each {|member| hash[member] = instance_variable_get(:"@#{member}")}
70+
71+
if blk
72+
members.each do |member|
73+
result = blk.call member, instance_variable_get(:"@#{member}")
74+
ary = Array.try_convert result
75+
raise TypeError.new("wrong element type #{result.class}") unless ary
76+
raise ArgumentError.new("element has wrong array length (expected 2, was #{ary.size})") if ary.size != 2
77+
hash.[]=(*ary)
78+
end
79+
else
80+
members.each {|member| hash[member] = instance_variable_get(:"@#{member}")}
81+
end
5982
hash
6083
end
6184

0 commit comments

Comments
 (0)