I had assumed that these 2 methods of accessing a Ruby array element from C are identical:
anedge = RARRAY_PTR(edges)[eindex];
OR
anedge = rb_ary_entry(edges, eindex);
But I’m beginning to think the former has some instability - eg I see random stuff in some array elements, sometimes. Not easy to repro, but does occur.
I can only quote the documentation. Although, there is no explanation given for the following statement.
Don’t touch pointers directly
In MRI (include/ruby/ruby.h), some macros to acquire pointers to the internal data structures are supported such as RARRAY_PTR(), RSTRUCT_PTR() and so on.
DO NOT USE THESE MACROS and instead use the corresponding C-APIs such as rb_ary_aref(), rb_ary_store() and so on.
[I dont think they’re different - I was chasing a red herring ]
Also the “DO NOT USE…” is just to encourage using immutable APIs rather than behaviour.
I just had a look at Ruby source code and rb_ary_entry() just calls rb_ary_entry_internal() which check the array bounds before doing RARRAY_PTR(edges)[eindex]
So definitely the same but without bounds checking.