From 17083011eed7d56981f2b227574527e4bf23eb65 Mon Sep 17 00:00:00 2001 From: "S.H" Date: Wed, 22 Apr 2020 09:49:13 +0900 Subject: support builtin for Kernel#Float # Iteration per second (i/s) | |compare-ruby|built-ruby| |:------------|-----------:|---------:| |float | 30.395M| 38.314M| | | -| 1.26x| |float_true | 3.833M| 27.322M| | | -| 7.13x| |float_false | 4.182M| 24.938M| | | -| 5.96x| --- benchmark/kernel_float.yml | 5 +++++ kernel.rb | 24 ++++++++++++++++++++++++ object.c | 28 +++------------------------- 3 files changed, 32 insertions(+), 25 deletions(-) create mode 100644 benchmark/kernel_float.yml diff --git a/benchmark/kernel_float.yml b/benchmark/kernel_float.yml new file mode 100644 index 0000000000..215f6750fc --- /dev/null +++ b/benchmark/kernel_float.yml @@ -0,0 +1,5 @@ +benchmark: + float: "Float(42)" + float_true: "Float(42, exception: true)" + float_false: "Float(42, exception: false)" +loop_count: 10000 diff --git a/kernel.rb b/kernel.rb index d3fa9d8053..aa3f8b72a4 100644 --- a/kernel.rb +++ b/kernel.rb @@ -26,4 +26,28 @@ module Kernel def clone(freeze: nil) __builtin_rb_obj_clone2(freeze) end + + module_function + + # + # call-seq: + # Float(arg, exception: true) -> float or nil + # + # Returns arg converted to a float. Numeric types are + # converted directly, and with exception to String and + # nil the rest are converted using + # arg.to_f. Converting a String with invalid + # characters will result in a ArgumentError. Converting + # nil generates a TypeError. Exceptions can be + # suppressed by passing exception: false. + # + # Float(1) #=> 1.0 + # Float("123.456") #=> 123.456 + # Float("123.0_badstring") #=> ArgumentError: invalid value for Float(): "123.0_badstring" + # Float(nil) #=> TypeError: can't convert nil into Float + # Float("123.0_badstring", exception: false) #=> nil + # + def Float(arg, exception: true) + __builtin_rb_f_float(arg, exception) + end end diff --git a/object.c b/object.c index 55d28a1500..61a9d6200c 100644 --- a/object.c +++ b/object.c @@ -3813,32 +3813,11 @@ rb_Float(VALUE val) return rb_convert_to_float(val, TRUE); } -/* - * call-seq: - * Float(arg, exception: true) -> float or nil - * - * Returns arg converted to a float. Numeric types are - * converted directly, and with exception to String and - * nil the rest are converted using - * arg.to_f. Converting a String with invalid - * characters will result in a ArgumentError. Converting - * nil generates a TypeError. Exceptions can be - * suppressed by passing exception: false. - * - * Float(1) #=> 1.0 - * Float("123.456") #=> 123.456 - * Float("123.0_badstring") #=> ArgumentError: invalid value for Float(): "123.0_badstring" - * Float(nil) #=> TypeError: can't convert nil into Float - * Float("123.0_badstring", exception: false) #=> nil - */ - static VALUE -rb_f_float(int argc, VALUE *argv, VALUE obj) +rb_f_float(rb_execution_context_t *ec, VALUE obj, VALUE arg, VALUE opts) { - VALUE arg = Qnil, opts = Qnil; - - rb_scan_args(argc, argv, "1:", &arg, &opts); - return rb_convert_to_float(arg, opts_exception_p(opts)); + int exception = rb_bool_expected(opts, "exception"); + return rb_convert_to_float(arg, exception); } static VALUE @@ -4668,7 +4647,6 @@ InitVM_Object(void) rb_define_global_function("format", f_sprintf, -1); rb_define_global_function("Integer", rb_f_integer, -1); - rb_define_global_function("Float", rb_f_float, -1); rb_define_global_function("String", rb_f_string, 1); rb_define_global_function("Array", rb_f_array, 1); -- cgit v1.2.3