diff options
author | Aaron Patterson <tenderlove@ruby-lang.org> | 2021-02-26 09:57:13 -0800 |
---|---|---|
committer | Aaron Patterson <tenderlove@ruby-lang.org> | 2021-02-26 09:57:13 -0800 |
commit | 0590e9b677e8c0b7a2364f660f06d9f5bd8fe87d (patch) | |
tree | 327bdb14b684b627d41678ce30d9e2db0da37a64 | |
parent | cfc23903df6bde6d79292d8a0291bc82e920b54e (diff) |
Fiddle::Function responds to to_proc
This lets us cast a Fiddle::Function to a block, allowing is to write
things like:
```ruby
f = Fiddle::Function.new(@libc['strcpy'], [TYPE_VOIDP, TYPE_VOIDP], TYPE_VOIDP)
define_method :strcpy, &f
```
-rw-r--r-- | ext/fiddle/lib/fiddle/function.rb | 5 | ||||
-rw-r--r-- | test/fiddle/test_function.rb | 13 |
2 files changed, 18 insertions, 0 deletions
diff --git a/ext/fiddle/lib/fiddle/function.rb b/ext/fiddle/lib/fiddle/function.rb index 0f9913adeb..f9910a0524 100644 --- a/ext/fiddle/lib/fiddle/function.rb +++ b/ext/fiddle/lib/fiddle/function.rb @@ -19,5 +19,10 @@ module Fiddle def to_i ptr.to_i end + + # Turn this function in to a proc + def to_proc + lambda { |*args| self.call(*args) } + end end end diff --git a/test/fiddle/test_function.rb b/test/fiddle/test_function.rb index 742615a56b..5dc456b82b 100644 --- a/test/fiddle/test_function.rb +++ b/test/fiddle/test_function.rb @@ -102,6 +102,19 @@ module Fiddle assert_equal("123", str.to_s) end + def call_proc(string_to_copy) + buff = +"000" + str = yield(buff, string_to_copy) + [buff, str] + end + + def test_function_as_proc + f = Function.new(@libc['strcpy'], [TYPE_VOIDP, TYPE_VOIDP], TYPE_VOIDP) + buff, str = call_proc("123", &f) + assert_equal("123", buff) + assert_equal("123", str.to_s) + end + def test_nogvl_poll # XXX hack to quiet down CI errors on EINTR from r64353 # [ruby-core:88360] [Misc #14937] |