Skip to content

Commit 4530f82

Browse files
committed
Fix specs for Struct
1 parent 3f8a989 commit 4530f82

File tree

2 files changed

+16
-9
lines changed

2 files changed

+16
-9
lines changed

spec/tags/core/struct/deconstruct_keys_tags.txt

Lines changed: 0 additions & 2 deletions
This file was deleted.

src/main/ruby/truffleruby/core/struct.rb

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -223,7 +223,7 @@ def [](var)
223223
when String
224224
var = var.to_sym
225225
else
226-
var = check_index_var(var)
226+
var = check_index_var!(var)
227227
end
228228

229229
unless _attrs.include? var.to_sym
@@ -245,15 +245,15 @@ def []=(var, obj)
245245
raise NameError, "no member '#{var}' in struct"
246246
end
247247
else
248-
var = check_index_var(var)
248+
var = check_index_var!(var)
249249
end
250250

251251
Primitive.check_frozen self
252252
Primitive.object_hidden_var_set(self, var, obj)
253253
end
254254

255-
private def check_index_var(var)
256-
var = Integer(var)
255+
private def check_index_var!(var)
256+
var = Truffle::Type.rb_convert_type(var, Integer, :to_int)
257257
a_len = _attrs.length
258258
if var >= a_len
259259
raise IndexError, "offset #{var} too large for struct(size:#{a_len})"
@@ -263,6 +263,15 @@ def []=(var, obj)
263263
_attrs[var]
264264
end
265265

266+
private def check_index_var(var)
267+
var = Truffle::Type.rb_convert_type(var, Integer, :to_int)
268+
a_len = _attrs.length
269+
270+
if var < a_len && var >= -a_len
271+
_attrs[var]
272+
end
273+
end
274+
266275
def dig(key, *more)
267276
result = read_or_nil(key)
268277
if Primitive.nil?(result) || more.empty?
@@ -347,7 +356,7 @@ def deconstruct_keys(keys)
347356
symbolized_key = check_index_var(requested_key)
348357
end
349358

350-
if _attrs.include?(symbolized_key)
359+
if symbolized_key && _attrs.include?(symbolized_key)
351360
h[requested_key] = Primitive.object_hidden_var_get(self, symbolized_key)
352361
else
353362
return h
@@ -369,14 +378,14 @@ def values_at(*args)
369378

370379
finish_in_bounds = [finish, _attrs.length - 1].min
371380
start.upto(finish_in_bounds) do |index|
372-
name = check_index_var(index)
381+
name = check_index_var!(index)
373382
out << Primitive.object_hidden_var_get(self, name)
374383
end
375384

376385
(finish_in_bounds + 1).upto(finish) { out << nil }
377386
else
378387
index = Primitive.rb_num2int(elem)
379-
name = check_index_var(index)
388+
name = check_index_var!(index)
380389
out << Primitive.object_hidden_var_get(self, name)
381390
end
382391
end

0 commit comments

Comments
 (0)