Module: MonkeySupport::CProxy
- Included in:
- ActiveSupport::Inflector
- Defined in:
- lib/monkeysupport/c_proxy.rb
Defined Under Namespace
Modules: Util
Instance Method Summary collapse
-
#monkey_c_proxy(ruby_name, c_name, args) ⇒ Object
Generates a proxy-to-C method.
Instance Method Details
#monkey_c_proxy(ruby_name, c_name, args) ⇒ Object
Generates a proxy-to-C method.
Parameters:
- ruby_name -- the original name of the function to override
- c_name -- the name of the C function in MonkeySupport::C to use
- args -- list of arguments to funtion, by type.
args example: [:string, :fixnum, [:string, ‘-’], [:bool true]]
- takes a string, a fixnum, a string with default value '-', then a boolean
with default value true.
EXAMPLE:
alias_method :__unproxy_demodulize, :demodulize MS_C = MonkeySupport::C unless defined? MS_C def demodulize(arg0)
begin
MS_C.activesupport_inflector_demodulize(arg0)
rescue TypeError
__unproxy_demodulize(arg0)
end
end
26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
# File 'lib/monkeysupport/c_proxy.rb', line 26 def monkey_c_proxy(ruby_name, c_name, args) arglist_with_defaults = Util::arglist(args, true) arglist_without_defaults = Util::arglist(args, false) # Note: About MS_C: That little extra lookup to MonkeySupport::C # can be a near-15% performance hit on some functions. Brutal. function = " alias_method :__unproxy_\#{ruby_name}, :\#{ruby_name}\n MS_C = MonkeySupport::C unless defined? MS_C\n def \#{ruby_name}(\#{arglist_with_defaults})\n begin\n MS_C.\#{c_name}(\#{arglist_without_defaults})\n rescue TypeError\n __unproxy_\#{ruby_name}(\#{arglist_without_defaults})\n end\n end\n EOS\n\n class_eval(function)\nend\n" |