[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]