-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathobject_space.rbs
190 lines (183 loc) · 6.14 KB
/
object_space.rbs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
# <!-- rdoc-file=gc.c -->
# The ObjectSpace module contains a number of routines that interact with the
# garbage collection facility and allow you to traverse all living objects with
# an iterator.
#
# ObjectSpace also provides support for object finalizers, procs that will be
# called after a specific object was destroyed by garbage collection. See the
# documentation for `ObjectSpace.define_finalizer` for important information on
# how to use this method correctly.
#
# a = "A"
# b = "B"
#
# ObjectSpace.define_finalizer(a, proc {|id| puts "Finalizer one on #{id}" })
# ObjectSpace.define_finalizer(b, proc {|id| puts "Finalizer two on #{id}" })
#
# a = nil
# b = nil
#
# *produces:*
#
# Finalizer two on 537763470
# Finalizer one on 537763480
#
%a{annotate:rdoc:source:from=gc.c}
module ObjectSpace
# <!--
# rdoc-file=gc.c
# - _id2ref(p1)
# -->
#
def self._id2ref: (Integer id) -> untyped
# <!--
# rdoc-file=gc.c
# - ObjectSpace.count_objects([result_hash]) -> hash
# -->
# Counts all objects grouped by type.
#
# It returns a hash, such as:
# {
# :TOTAL=>10000,
# :FREE=>3011,
# :T_OBJECT=>6,
# :T_CLASS=>404,
# # ...
# }
#
# The contents of the returned hash are implementation specific. It may be
# changed in future.
#
# The keys starting with `:T_` means live objects. For example, `:T_ARRAY` is
# the number of arrays. `:FREE` means object slots which is not used now.
# `:TOTAL` means sum of above.
#
# If the optional argument `result_hash` is given, it is overwritten and
# returned. This is intended to avoid probe effect.
#
# h = {}
# ObjectSpace.count_objects(h)
# puts h
# # => { :TOTAL=>10000, :T_CLASS=>158280, :T_MODULE=>20672, :T_STRING=>527249 }
#
# This method is only expected to work on C Ruby.
#
def self.count_objects: (?Hash[Symbol, Integer] result_hash) -> Hash[Symbol, Integer]
# <!--
# rdoc-file=gc.c
# - ObjectSpace.define_finalizer(obj, aProc=proc())
# -->
# Adds *aProc* as a finalizer, to be called after *obj* was destroyed. The
# object ID of the *obj* will be passed as an argument to *aProc*. If *aProc* is
# a lambda or method, make sure it can be called with a single argument.
#
# The return value is an array `[0, aProc]`.
#
# The two recommended patterns are to either create the finaliser proc in a
# non-instance method where it can safely capture the needed state, or to use a
# custom callable object that stores the needed state explicitly as instance
# variables.
#
# class Foo
# def initialize(data_needed_for_finalization)
# ObjectSpace.define_finalizer(self, self.class.create_finalizer(data_needed_for_finalization))
# end
#
# def self.create_finalizer(data_needed_for_finalization)
# proc {
# puts "finalizing #{data_needed_for_finalization}"
# }
# end
# end
#
# class Bar
# class Remover
# def initialize(data_needed_for_finalization)
# @data_needed_for_finalization = data_needed_for_finalization
# end
#
# def call(id)
# puts "finalizing #{@data_needed_for_finalization}"
# end
# end
#
# def initialize(data_needed_for_finalization)
# ObjectSpace.define_finalizer(self, Remover.new(data_needed_for_finalization))
# end
# end
#
# Note that if your finalizer references the object to be finalized it will
# never be run on GC, although it will still be run at exit. You will get a
# warning if you capture the object to be finalized as the receiver of the
# finalizer.
#
# class CapturesSelf
# def initialize(name)
# ObjectSpace.define_finalizer(self, proc {
# # this finalizer will only be run on exit
# puts "finalizing #{name}"
# })
# end
# end
#
# Also note that finalization can be unpredictable and is never guaranteed to be
# run except on exit.
#
def self.define_finalizer: (untyped obj, ^(Integer id) -> void aProc) -> [ Integer, Proc ]
| (untyped obj) { (Integer id) -> void } -> [ Integer, Proc ]
# <!--
# rdoc-file=gc.c
# - ObjectSpace.each_object([module]) {|obj| ... } -> integer
# - ObjectSpace.each_object([module]) -> an_enumerator
# -->
# Calls the block once for each living, nonimmediate object in this Ruby
# process. If *module* is specified, calls the block for only those classes or
# modules that match (or are a subclass of) *module*. Returns the number of
# objects found. Immediate objects (`Fixnum`s, `Symbol`s `true`, `false`, and
# `nil`) are never returned. In the example below, #each_object returns both the
# numbers we defined and several constants defined in the Math module.
#
# If no block is given, an enumerator is returned instead.
#
# a = 102.7
# b = 95 # Won't be returned
# c = 12345678987654321
# count = ObjectSpace.each_object(Numeric) {|x| p x }
# puts "Total count: #{count}"
#
# *produces:*
#
# 12345678987654321
# 102.7
# 2.71828182845905
# 3.14159265358979
# 2.22044604925031e-16
# 1.7976931348623157e+308
# 2.2250738585072e-308
# Total count: 7
#
def self.each_object: (?Module `module`) -> Enumerator[untyped, Integer]
| (?Module `module`) { (untyped obj) -> void } -> Integer
# <!--
# rdoc-file=gc.rb
# - garbage_collect(full_mark: true, immediate_mark: true, immediate_sweep: true)
# -->
# Alias of GC.start
#
def self.garbage_collect: (?full_mark: bool, ?immediate_mark: bool, ?immediate_sweep: bool) -> void
# <!--
# rdoc-file=gc.c
# - ObjectSpace.undefine_finalizer(obj)
# -->
# Removes all finalizers for *obj*.
#
def self.undefine_finalizer: [X] (X obj) -> X
private
# <!--
# rdoc-file=gc.rb
# - garbage_collect(full_mark: true, immediate_mark: true, immediate_sweep: true)
# -->
# Alias of GC.start
#
def garbage_collect: (?full_mark: bool, ?immediate_mark: bool, ?immediate_sweep: bool) -> void
end