Use single-arg version of RubyClass#newInstance(), instead of the IRubyObject[] variant
Use a CallSite per callback parameter - a particular callback param almost always receives an instance of the same class.
Change MemoryIO from an interface to an abstract class, and hoist isDirect and address into the base class, so isDirect() and address() are monomorphic calls.
Check that the RubyString stored MemoryIO is of the same type (direct/heap) as the requested type before using it.
Speedup to_ptr coercions by using a callsite per parameter
Lookup the MemoryIO directly when convering parameters to pointers, and delay the strategy lookup until the non-direct path is taken.
Limit the amount of recursion for :pointer parameters when passed an object that responds to :to_ptr
Coerce objects using #to_str for :string parameters (for ffi/ffi#242)
Coerce to String instead of raising an error when handed a non-String param (related to ffi/ffi#242)
Instead of calling respondsTo() and then callMethod(), just lookup the method and call via the DynamicMethod instance.