@@ -39,13 +39,16 @@ def initialize(hash=nil, passed_options={})
39
39
@sub_elements = { }
40
40
end
41
41
42
- def initialize_copy ( orig )
43
- super
44
42
45
- # deep copy the table to separate the two objects
46
- @table = @deep_dup . call ( orig . instance_variable_get ( :@table ) )
47
- # Forget any memoized sub-elements
48
- @sub_elements = { }
43
+ if OpenStruct . public_instance_methods . include? ( :initialize_copy )
44
+ def initialize_copy ( orig )
45
+ super
46
+
47
+ # deep copy the table to separate the two objects
48
+ @table = @deep_dup . call ( @table )
49
+ # Forget any memoized sub-elements
50
+ @sub_elements = { }
51
+ end
49
52
end
50
53
51
54
def to_h
@@ -56,6 +59,19 @@ def to_h
56
59
# itself to be a "kind of" Hash.
57
60
alias_method :to_hash , :to_h
58
61
62
+ # Continue supporting older rubies -- JRuby 9.1.x.x is still considered
63
+ # stable, but is based on Ruby
64
+ # 2.3.x and so uses :modifiable instead of :modifiable?. Furthermore, if
65
+ # :modifiable is private, then make :modifiable? private too.
66
+ if !OpenStruct . private_instance_methods . include? ( :modifiable? )
67
+ if OpenStruct . private_instance_methods . include? ( :modifiable )
68
+ alias_method :modifiable? , :modifiable
69
+ elsif OpenStruct . public_instance_methods . include? ( :modifiable )
70
+ alias_method :modifiable? , :modifiable
71
+ private :modifiable?
72
+ end
73
+ end
74
+
59
75
def []( name )
60
76
key_name = _get_key_from_table_ ( name )
61
77
v = @table [ key_name ]
@@ -69,11 +85,19 @@ def [](name)
69
85
end
70
86
end
71
87
72
- def []=( name , value )
73
- key_name = _get_key_from_table_ ( name )
74
- tbl = modifiable? # Ensure we are modifiable
75
- @sub_elements . delete ( key_name )
76
- tbl [ key_name ] = value
88
+ if private_instance_methods . include? ( :modifiable? ) || public_instance_methods . include? ( :modifiable? )
89
+ def []=( name , value )
90
+ key_name = _get_key_from_table_ ( name )
91
+ tbl = modifiable? # Ensure we are modifiable
92
+ @sub_elements . delete ( key_name )
93
+ tbl [ key_name ] = value
94
+ end
95
+ else
96
+ def []=( name , value )
97
+ key_name = _get_key_from_table_ ( name )
98
+ @table [ key_name ] = value # raises if self is frozen in Ruby 3.0
99
+ @sub_elements . delete ( key_name )
100
+ end
77
101
end
78
102
79
103
# Makes sure ROS responds as expected on #respond_to? and #method requests
@@ -82,17 +106,6 @@ def respond_to_missing?(mid, include_private = false)
82
106
@table . key? ( mname ) || super
83
107
end
84
108
85
- # Continue supporting older rubies -- JRuby 9.1.x.x is still considered
86
- # stable, but is based on Ruby
87
- # 2.3.x and so uses :modifiable instead of :modifiable?. Furthermore, if
88
- # :modifiable is private, then make :modifiable? private too.
89
- if !OpenStruct . private_instance_methods . include? ( :modifiable? )
90
- alias_method :modifiable? , :modifiable
91
- if OpenStruct . private_instance_methods . include? ( :modifiable )
92
- private :modifiable?
93
- end
94
- end
95
-
96
109
# Adapted implementation of method_missing to accommodate the differences
97
110
# between ROS and OS.
98
111
def method_missing ( mid , *args )
@@ -155,6 +168,16 @@ def delete_field(name)
155
168
156
169
private
157
170
171
+ unless OpenStruct . public_instance_methods . include? ( :initialize_copy )
172
+ def initialize_dup ( orig )
173
+ super
174
+ # deep copy the table to separate the two objects
175
+ @table = @deep_dup . call ( @table )
176
+ # Forget any memoized sub-elements
177
+ @sub_elements = { }
178
+ end
179
+ end
180
+
158
181
def _get_key_from_table_ ( name )
159
182
return name . to_s if @table . has_key? ( name . to_s )
160
183
return name . to_sym if @table . has_key? ( name . to_sym )
0 commit comments