sorbet-runtime 0.5.10511 → 0.5.10514

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 297eb1c7b7982c4ebf3e196c9460fc06a9d1dcae973f657787fa3a397d6b0aa1
4
- data.tar.gz: 5bc20896ebcad41de731ceab2116df661702defbfe9c3857564af7d1601c3583
3
+ metadata.gz: fc2dd38a71b81d23d2610e3f5f9c9cac33625013e352a7daf58ebebd55e78ef0
4
+ data.tar.gz: fd2f55279f00607fcb7fef6495ca82e323870d2664ab921bfe2749ad085082f4
5
5
  SHA512:
6
- metadata.gz: 51bffd16e4770f4d14bc35cc2308da33809ed669a156607b2d64d3c7e7b411a869dead700712d5b01736c07c51f0cf9980b4c0db82be14361b2cfed8aa3d92b2
7
- data.tar.gz: 86ae3952e29b3c0c7019f75d76b180f1477c7859c76b7e8144c33937a59fddde8cab64781ac07d836f25542bddf32774ee91c3621a1f16c5bea4906ba6a9d303
6
+ metadata.gz: 1647c5d87016036740e44263c29b13aff039451a1dc45f879e8684820c7b833623613dffd4c3f33219f31dc1b156a0c989dd8dc0a13e2681b1a0c4a790aaed13
7
+ data.tar.gz: f6a68b760d3e49c5d65fbad93eb91cde28a891dff35f63002d3c3671126b38b4d4dafcad032d57c87020cd8b0199120ece613d73df2b394e36254a3a46f31f3e
@@ -204,34 +204,6 @@ module T::Private::Methods
204
204
  @modules_with_final[mod.singleton_class.object_id]
205
205
  end
206
206
 
207
- private_class_method def self.attr_accessor_reader?(method_name)
208
- # If the method name ends with a "=", it's definitely not an attr_accessor reader
209
- return false if method_name[-1] == "="
210
-
211
- # If it was "attr_accessor" that triggered this, we should be 3 frames away from it:
212
- # 3. `attr_accessor`
213
- # 2. method_added hook
214
- # 1. `_on_method_added`
215
- # 0. `attr_accessor_reader?`
216
- caller_frame = caller_locations(3, 1).first
217
- return false unless caller_frame
218
-
219
- caller_label = caller_frame.label
220
- return false unless caller_label
221
-
222
- caller_label.to_s == "attr_accessor"
223
- end
224
-
225
- private_class_method def self.declare_writer_sig_from_reader(method_name, current_declaration)
226
- writer_decl = current_declaration.dup
227
- # The block for the reader runs the block for the writer,
228
- # but also adds the writer param with the same type as the return type.
229
- writer_decl.blk = lambda do
230
- instance_exec(&current_declaration.blk).params(**{method_name.to_sym => decl.returns})
231
- end
232
- T::Private::DeclState.current.active_declaration = writer_decl
233
- end
234
-
235
207
  # Only public because it needs to get called below inside the replace_method blocks below.
236
208
  def self._on_method_added(hook_mod, method_name, is_singleton_method: false)
237
209
  if T::Private::DeclState.current.skip_on_method_added
@@ -257,8 +229,6 @@ module T::Private::Methods
257
229
  end
258
230
  T::Private::DeclState.current.reset!
259
231
 
260
- declare_writer_sig_from_reader(method_name, current_declaration) if attr_accessor_reader?(method_name)
261
-
262
232
  if method_name == :method_added || method_name == :singleton_method_added
263
233
  raise(
264
234
  "Putting a `sig` on `#{method_name}` is not supported" \
@@ -59,8 +59,9 @@ module T::Private::Methods::CallValidation
59
59
 
60
60
  def self.create_validator_method(mod, original_method, method_sig, original_visibility)
61
61
  has_fixed_arity = method_sig.kwarg_types.empty? && !method_sig.has_rest && !method_sig.has_keyrest &&
62
- original_method.parameters.all? {|(kind, _name)| kind == :req}
63
- ok_for_fast_path = has_fixed_arity && !method_sig.bind && method_sig.arg_types.length < 5 && is_allowed_to_have_fast_path
62
+ original_method.parameters.all? {|(kind, _name)| kind == :req || kind == :block}
63
+ can_skip_block_type = method_sig.block_type.nil? || method_sig.block_type.valid?(nil)
64
+ ok_for_fast_path = has_fixed_arity && can_skip_block_type && !method_sig.bind && method_sig.arg_types.length < 5 && is_allowed_to_have_fast_path
64
65
 
65
66
  all_args_are_simple = ok_for_fast_path && method_sig.arg_types.all? {|_name, type| type.is_a?(T::Types::Simple)}
66
67
  simple_method = all_args_are_simple && method_sig.return_type.is_a?(T::Types::Simple)
@@ -76,6 +77,11 @@ module T::Private::Methods::CallValidation
76
77
  create_validator_procedure_medium(mod, original_method, method_sig, original_visibility)
77
78
  elsif ok_for_fast_path
78
79
  create_validator_method_medium(mod, original_method, method_sig, original_visibility)
80
+ elsif can_skip_block_type
81
+ # The Ruby VM already validates that any block passed to a method
82
+ # must be either `nil` or a `Proc` object, so there's no need to also
83
+ # have sorbet-runtime check that.
84
+ create_validator_slow_skip_block_type(mod, original_method, method_sig, original_visibility)
79
85
  else
80
86
  create_validator_slow(mod, original_method, method_sig, original_visibility)
81
87
  end
@@ -84,6 +90,88 @@ module T::Private::Methods::CallValidation
84
90
  end
85
91
  end
86
92
 
93
+ def self.create_validator_slow_skip_block_type(mod, original_method, method_sig, original_visibility)
94
+ T::Private::ClassUtils.def_with_visibility(mod, method_sig.method_name, original_visibility) do |*args, &blk|
95
+ CallValidation.validate_call_skip_block_type(self, original_method, method_sig, args, blk)
96
+ end
97
+ end
98
+
99
+ def self.validate_call_skip_block_type(instance, original_method, method_sig, args, blk)
100
+ # This method is called for every `sig`. It's critical to keep it fast and
101
+ # reduce number of allocations that happen here.
102
+
103
+ if method_sig.bind
104
+ message = method_sig.bind.error_message_for_obj(instance)
105
+ if message
106
+ CallValidation.report_error(
107
+ method_sig,
108
+ message,
109
+ 'Bind',
110
+ nil,
111
+ method_sig.bind,
112
+ instance
113
+ )
114
+ end
115
+ end
116
+
117
+ # NOTE: We don't bother validating for missing or extra kwargs;
118
+ # the method call itself will take care of that.
119
+ method_sig.each_args_value_type(args) do |name, arg, type|
120
+ message = type.error_message_for_obj(arg)
121
+ if message
122
+ CallValidation.report_error(
123
+ method_sig,
124
+ message,
125
+ 'Parameter',
126
+ name,
127
+ type,
128
+ arg,
129
+ caller_offset: 2
130
+ )
131
+ end
132
+ end
133
+
134
+ # The original method definition allows passing `nil` for the `&blk`
135
+ # argument, so we do not have to do any method_sig.block_type type checks
136
+ # of our own.
137
+
138
+ # The following line breaks are intentional to show nice pry message
139
+
140
+
141
+
142
+
143
+
144
+
145
+
146
+
147
+
148
+
149
+ # PRY note:
150
+ # this code is sig validation code.
151
+ # Please issue `finish` to step out of it
152
+
153
+ return_value = T::Configuration::AT_LEAST_RUBY_2_7 ? original_method.bind_call(instance, *args, &blk) : original_method.bind(instance).call(*args, &blk)
154
+
155
+ # The only type that is allowed to change the return value is `.void`.
156
+ # It ignores what you returned and changes it to be a private singleton.
157
+ if method_sig.return_type.is_a?(T::Private::Types::Void)
158
+ T::Private::Types::Void::VOID
159
+ else
160
+ message = method_sig.return_type.error_message_for_obj(return_value)
161
+ if message
162
+ CallValidation.report_error(
163
+ method_sig,
164
+ message,
165
+ 'Return value',
166
+ nil,
167
+ method_sig.return_type,
168
+ return_value,
169
+ )
170
+ end
171
+ return_value
172
+ end
173
+ end
174
+
87
175
  def self.create_validator_slow(mod, original_method, method_sig, original_visibility)
88
176
  T::Private::ClassUtils.def_with_visibility(mod, method_sig.method_name, original_visibility) do |*args, &blk|
89
177
  CallValidation.validate_call(self, original_method, method_sig, args, blk)
@@ -125,8 +213,19 @@ module T::Private::Methods::CallValidation
125
213
  end
126
214
  end
127
215
 
128
- if method_sig.block_type
129
- message = method_sig.block_type.error_message_for_obj(blk)
216
+ # The Ruby VM already checks that `&blk` is either a `Proc` type or `nil`:
217
+ # https://github.com/ruby/ruby/blob/v2_7_6/vm_args.c#L1150-L1154
218
+ # And `T.proc` types don't (can't) do any runtime arg checking, so we can
219
+ # save work by simply checking that `blk` is non-nil (if the method allows
220
+ # `nil` for the block, it would not have used this validate_call path).
221
+ unless blk
222
+ # Have to use `&.` here, because it's technically a public API that
223
+ # people can _always_ call `validate_call` to validate any signature
224
+ # (i.e., the faster validators are merely optimizations).
225
+ # In practice, this only affects the first call to the method (before the
226
+ # optimized validators have a chance to replace the initial, slow
227
+ # wrapper).
228
+ message = method_sig.block_type&.error_message_for_obj(blk)
130
229
  if message
131
230
  CallValidation.report_error(
132
231
  method_sig,
@@ -58,14 +58,12 @@ class T::Private::Methods::Signature
58
58
  @defined_raw = defined_raw
59
59
 
60
60
  declared_param_names = raw_arg_types.keys
61
- # If sig params are declared and there is a single parameter with a missing name
61
+ # If sig params are declared but there is a single parameter with a missing name
62
62
  # **and** the method ends with a "=", assume it is a writer method generated
63
- # by attr_writer or attr_accessor.
64
- # We fix up the parameter name in that case to be the method name without the "=".
65
- if declared_param_names != [nil] && parameters == [[:req]] && method_name[-1] == "="
66
- parameters = [[:req, method_name[0...-1].to_sym]]
67
- end
68
-
63
+ # by attr_writer or attr_accessor
64
+ writer_method = declared_param_names != [nil] && parameters == [[:req]] && method_name[-1] == "="
65
+ # For writer methods, map the single parameter to the method name without the "=" at the end
66
+ parameters = [[:req, method_name[0...-1].to_sym]] if writer_method
69
67
  param_names = parameters.map {|_, name| name}
70
68
  missing_names = param_names - declared_param_names
71
69
  extra_names = declared_param_names - param_names
@@ -29,7 +29,7 @@ module T::Types
29
29
 
30
30
  # overrides Base
31
31
  def name
32
- "T.deprecated_enum([#{@values.map(&:inspect).join(', ')}])"
32
+ @name ||= "T.deprecated_enum([#{@values.map(&:inspect).join(', ')}])"
33
33
  end
34
34
 
35
35
  # overrides Base
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sorbet-runtime
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.10511
4
+ version: 0.5.10514
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stripe
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-10-22 00:00:00.000000000 Z
11
+ date: 2022-10-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: minitest