mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
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|
This commit is contained in:
parent
ad63ae6619
commit
17083011ee
Notes:
git
2020-04-22 09:49:42 +09:00
Merged: https://github.com/ruby/ruby/pull/3048 Merged-By: nobu <nobu@ruby-lang.org>
3 changed files with 32 additions and 25 deletions
5
benchmark/kernel_float.yml
Normal file
5
benchmark/kernel_float.yml
Normal file
|
@ -0,0 +1,5 @@
|
|||
benchmark:
|
||||
float: "Float(42)"
|
||||
float_true: "Float(42, exception: true)"
|
||||
float_false: "Float(42, exception: false)"
|
||||
loop_count: 10000
|
24
kernel.rb
24
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 <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
|
||||
|
|
28
object.c
28
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 <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)
|
|||
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);
|
||||
|
|
Loading…
Reference in a new issue