Handling ruby types and CallSiteStorage in std library

I’m working on adding code to the OpenSSL extension of the standard
library and I need to understand the design for invoking and typing Ruby
code. I read the ‘Modifying the sources’ github page and it mentions
using CallSiteStorage to call into Ruby code.

Specifically, the Cipher ruby class has a dependency on the Digest ruby
classes for the pkcs5_keyivgen method. An optional parameter for this
method is an instance of the Ruby class Digest::Base. How would the
type look, maybe Digest.Digest.Base digest/optional/? Or would it be
an object and I’d also need to pass in CallSiteStorage to call methods
on the object?

An example in the standard library of such behavior would be much
appreciated, thanks for any help.

It depends whether the method is supposed to invoke Digest’s methods
dynamically or not. Does pkcs5_keyivgen method accept any Ruby object
that implements the methods pkcs5_keyivgen calls? Or does it need to be
an instance of Digest class?
If the former is true than you need to use “object” as the parameter
type and use dynamic call sites to invoke those methods. An example of
such dynamic behavior would be MutableStringOps.Compare. If the latter
is true you can just type the parameter to Digest CLR type and call its
methods directly.


BTW: Since parts of the OpenSSL library are already written in Ruby (see
ruby-1.8.6p368\lib\ruby\1.8\openssl directory) it might be easier to
write the rest in Ruby as well. With calls to .NET implementation of the
cryptographic algorithms, of course.
If you chose to go that way you can add the scripts to


Writing it in Ruby worked well for me in this case, thanks Tomas.