ruby-changes:60865
From: S.H <ko1@a...>
Date: Wed, 22 Apr 2020 09:49:38 +0900 (JST)
Subject: [ruby-changes:60865] 17083011ee (master): support builtin for Kernel#Float
https://git.ruby-lang.org/ruby.git/commit/?id=17083011ee From 17083011eed7d56981f2b227574527e4bf23eb65 Mon Sep 17 00:00:00 2001 From: "S.H" <gamelinks007@g...> 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| diff --git a/benchmark/kernel_float.yml b/benchmark/kernel_float.yml new file mode 100644 index 0000000..215f675 --- /dev/null +++ b/benchmark/kernel_float.yml @@ -0,0 +1,5 @@ https://github.com/ruby/ruby/blob/trunk/benchmark/kernel_float.yml#L1 +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 d3fa9d8..aa3f8b7 100644 --- a/kernel.rb +++ b/kernel.rb @@ -26,4 +26,28 @@ module Kernel https://github.com/ruby/ruby/blob/trunk/kernel.rb#L26 def clone(freeze: nil) __builtin_rb_obj_clone2(freeze) end + + module_function + + # + # call-seq: + # Float(arg, exception: true) -> float or nil + # + # Returns <i>arg</i> converted to a float. Numeric types are + # converted directly, and with exception to String and + # <code>nil</code> the rest are converted using + # <i>arg</i><code>.to_f</code>. Converting a String with invalid + # characters will result in a ArgumentError. Converting + # <code>nil</code> generates a TypeError. Exceptions can be + # suppressed by passing <code>exception: false</code>. + # + # 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 55d28a1..61a9d62 100644 --- a/object.c +++ b/object.c @@ -3813,32 +3813,11 @@ rb_Float(VALUE val) https://github.com/ruby/ruby/blob/trunk/object.c#L3813 return rb_convert_to_float(val, TRUE); } -/* - * call-seq: - * Float(arg, exception: true) -> float or nil - * - * Returns <i>arg</i> converted to a float. Numeric types are - * converted directly, and with exception to String and - * <code>nil</code> the rest are converted using - * <i>arg</i><code>.to_f</code>. Converting a String with invalid - * characters will result in a ArgumentError. Converting - * <code>nil</code> generates a TypeError. Exceptions can be - * suppressed by passing <code>exception: false</code>. - * - * 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) https://github.com/ruby/ruby/blob/trunk/object.c#L4647 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 v0.10.2 -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/