1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

Make Kernel#then, #yield_self, #frozen? builtin (#3283)

* Make Kernel#then, #yield_self, #frozen? builtin

* Fix test_jit
This commit is contained in:
Takashi Kokubun 2020-07-03 18:02:43 -07:00 committed by GitHub
parent a69dd699ee
commit 24fa37d87a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
Notes: git 2020-07-04 10:03:07 +09:00
Merged-By: k0kubun <takashikkbn@gmail.com>
5 changed files with 96 additions and 54 deletions

View file

@ -48,6 +48,27 @@ module Kernel
Primitive.rb_obj_clone2(freeze)
end
#
# call-seq:
# obj.frozen? -> true or false
#
# Returns the freeze status of <i>obj</i>.
#
# 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
#