From 24fa37d87a24dc932c1d778bcaf91204f5c12a76 Mon Sep 17 00:00:00 2001 From: Takashi Kokubun Date: Fri, 3 Jul 2020 18:02:43 -0700 Subject: Make Kernel#then, #yield_self, #frozen? builtin (#3283) * Make Kernel#then, #yield_self, #frozen? builtin * Fix test_jit --- kernel.rb | 78 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) (limited to 'kernel.rb') diff --git a/kernel.rb b/kernel.rb index 3404053d84..04a371a7c8 100644 --- a/kernel.rb +++ b/kernel.rb @@ -48,6 +48,27 @@ module Kernel Primitive.rb_obj_clone2(freeze) end + # + # call-seq: + # obj.frozen? -> true or false + # + # Returns the freeze status of obj. + # + # a = [ "a", "b", "c" ] + # a.freeze #=> ["a", "b", "c"] + # a.frozen? #=> true + #-- + # Determines if the object is frozen. Equivalent to \c Object\#frozen? in Ruby. + # \param[in] obj the object to be determines + # \retval Qtrue if frozen + # \retval Qfalse if not frozen + #++ + # + def frozen? + Primitive.attr! 'inline' + Primitive.cexpr! 'rb_obj_frozen_p(self)' + end + # # call-seq: # obj.tap {|x| block } -> obj @@ -70,6 +91,63 @@ module Kernel self end + # + # call-seq: + # obj.then {|x| block } -> an_object + # + # Yields self to the block and returns the result of the block. + # + # 3.next.then {|x| x**x }.to_s #=> "256" + # + # Good usage for +then+ is value piping in method chains: + # + # require 'open-uri' + # require 'json' + # + # construct_url(arguments). + # then {|url| open(url).read }. + # then {|response| JSON.parse(response) } + # + # When called without block, the method returns +Enumerator+, + # which can be used, for example, for conditional + # circuit-breaking: + # + # # meets condition, no-op + # 1.then.detect(&:odd?) # => 1 + # # does not meet condition, drop value + # 2.then.detect(&:odd?) # => nil + # + def then + unless Primitive.block_given_p + return Primitive.cexpr! 'SIZED_ENUMERATOR(self, 0, 0, rb_obj_size)' + end + yield(self) + end + + # + # call-seq: + # obj.yield_self {|x| block } -> an_object + # + # Yields self to the block and returns the result of the block. + # + # "my string".yield_self {|s| s.upcase } #=> "MY STRING" + # + # Good usage for +then+ is value piping in method chains: + # + # require 'open-uri' + # require 'json' + # + # construct_url(arguments). + # then {|url| open(url).read }. + # then {|response| JSON.parse(response) } + # + def yield_self + unless Primitive.block_given_p + return Primitive.cexpr! 'SIZED_ENUMERATOR(self, 0, 0, rb_obj_size)' + end + yield(self) + end + module_function # -- cgit v1.2.3