sorbet-runtime 0.5.10511 → 0.5.10514

Sign up to get free protection for your applications and to get access to all the features.
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