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:
S.H 2020-04-22 09:49:13 +09:00 коммит произвёл GitHub
Родитель ad63ae6619
Коммит 17083011ee
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
3 изменённых файлов: 32 добавлений и 25 удалений

Просмотреть файл

@ -0,0 +1,5 @@
benchmark:
float: "Float(42)"
float_true: "Float(42, exception: true)"
float_false: "Float(42, exception: false)"
loop_count: 10000

Просмотреть файл

@ -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

Просмотреть файл

@ -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);