@@ -223,7 +223,7 @@ def [](var)
223
223
when String
224
224
var = var . to_sym
225
225
else
226
- var = check_index_var ( var )
226
+ var = check_index_var! ( var )
227
227
end
228
228
229
229
unless _attrs . include? var . to_sym
@@ -245,15 +245,15 @@ def []=(var, obj)
245
245
raise NameError , "no member '#{ var } ' in struct"
246
246
end
247
247
else
248
- var = check_index_var ( var )
248
+ var = check_index_var! ( var )
249
249
end
250
250
251
251
Primitive . check_frozen self
252
252
Primitive . object_hidden_var_set ( self , var , obj )
253
253
end
254
254
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 )
257
257
a_len = _attrs . length
258
258
if var >= a_len
259
259
raise IndexError , "offset #{ var } too large for struct(size:#{ a_len } )"
@@ -263,6 +263,15 @@ def []=(var, obj)
263
263
_attrs [ var ]
264
264
end
265
265
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
+
266
275
def dig ( key , *more )
267
276
result = read_or_nil ( key )
268
277
if Primitive . nil? ( result ) || more . empty?
@@ -347,7 +356,7 @@ def deconstruct_keys(keys)
347
356
symbolized_key = check_index_var ( requested_key )
348
357
end
349
358
350
- if _attrs . include? ( symbolized_key )
359
+ if symbolized_key && _attrs . include? ( symbolized_key )
351
360
h [ requested_key ] = Primitive . object_hidden_var_get ( self , symbolized_key )
352
361
else
353
362
return h
@@ -369,14 +378,14 @@ def values_at(*args)
369
378
370
379
finish_in_bounds = [ finish , _attrs . length - 1 ] . min
371
380
start . upto ( finish_in_bounds ) do |index |
372
- name = check_index_var ( index )
381
+ name = check_index_var! ( index )
373
382
out << Primitive . object_hidden_var_get ( self , name )
374
383
end
375
384
376
385
( finish_in_bounds + 1 ) . upto ( finish ) { out << nil }
377
386
else
378
387
index = Primitive . rb_num2int ( elem )
379
- name = check_index_var ( index )
388
+ name = check_index_var! ( index )
380
389
out << Primitive . object_hidden_var_get ( self , name )
381
390
end
382
391
end
0 commit comments