Skip to content

Conversation

@sinisterchipmunk
Copy link
Contributor

This pull request was split from #14 as requested by @nobu .

CStructEntity defines array subscript methods ([] / []=), which is fine except that they override Fiddle::Pointer#[] and Fiddle::Pointer#[]= and do not handle the 3rd argument that the base class allows for. The methods from Fiddle::Pointer provide for direct manipulation of the underlying memory, but this ability is lost in CStructEntity because the superclass methods are not available in the subclass (ignoring ugly hacks like Fiddle::Pointer.method(:[]).unbind.bind(struct).call). This pull request modifies the overridden methods to check for an additional argument which would be understood by super. If the extra argument is provided, super is called so that the underlying memory can be accessed / assigned directly.

Here is an example:

# This could be done before the pull request
ptr = Fiddle::Pointer.malloc(4)
ptr[0, 4] = "\x01\x02\x03\x04".b
ptr[0, 4].unpack("i") #=> [67305985]

# This could be done before the pull request
s = Fiddle::Importer.struct(['int i']).malloc
s.i = 0x04030201
s.i #=> 67305985

# But, this could not be done. Pull request adds support for this behavior.
s = Fiddle::Importer.struct(['int i']).malloc
s[0, 4] = "\x01\x02\x03\x04".b
s.i #=> 67305985
s.i = 0x04030201
s[0, 4] #=> "\x01\x02\x03\x04"

@nobu nobu merged commit c082c81 into ruby:master Jan 22, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants