sorbet-runtime 0.5.6307 → 0.5.6317

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: 5fd04bbc68f93977066be4b2fb798b27781baaed1bb9ab647d2e5e2adbe8304b
4
- data.tar.gz: 731a5313c3a738a9fd8c1b8b378c71ee280ae8fa1fdcf8f28b1fe4af8b702fc9
3
+ metadata.gz: '097683b0eba207cf9b04accf22d9dcf1661848f4d5e1254b34e3e3240b160351'
4
+ data.tar.gz: cf2c97818079eba96e2eeba28b05844ce8ac8adb5c69ae940ad6031d6bdd9e43
5
5
  SHA512:
6
- metadata.gz: a4d105eb0fb168fa50cd55c84b877e16970d56333b664f2b031c0a06b2930b31a148358fcf2e2b5f472f428ef573f8303ee493729c6fc87133ab628dde001584
7
- data.tar.gz: 2b8d7c25760ac6d24a24d6031e188af593df356569e66471198e61cfec2ba76d3c98cf909bde966272829234742bd9e88a5d11a5be0cc90bf9fa1c33ec9feed7
6
+ metadata.gz: 221da0912324d1e0ab19d23ac4fb6c30fc1ba2a9db54b9eb466e807a1093205fe5393564a1a40783e7dee15bc167afa4f1f88445b12e1364e80120b0f00853ee
7
+ data.tar.gz: '0893b271dd3d604514531424bde009256dc0a14d56e4379b5184b27ac01f10d140cb7d467217d854ebacb77489ef1874b324133f69ac2cf1df39c68c53de6b20'
@@ -2,6 +2,9 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  module T::Configuration
5
+ # Cache this comparisonn to avoid two allocations all over the place.
6
+ AT_LEAST_RUBY_2_7 = Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('2.7')
7
+
5
8
  # Announces to Sorbet that we are currently in a test environment, so it
6
9
  # should treat any sigs which are marked `.checked(:tests)` as if they were
7
10
  # just a normal sig.
@@ -395,7 +398,12 @@ module T::Configuration
395
398
  MODULE_NAME = Module.instance_method(:name)
396
399
  private_constant :MODULE_NAME
397
400
 
398
- @default_module_name_mangler = ->(type) {MODULE_NAME.bind(type).call}
401
+ if T::Configuration::AT_LEAST_RUBY_2_7
402
+ @default_module_name_mangler = ->(type) {MODULE_NAME.bind_call(type)}
403
+ else
404
+ @default_module_name_mangler = ->(type) {MODULE_NAME.bind(type).call}
405
+ end
406
+
399
407
  @module_name_mangler = nil
400
408
 
401
409
  def self.module_name_mangler
@@ -108,10 +108,7 @@ module T::Private::Methods
108
108
  # method_to_key(ancestor.instance_method(method_name)) is not (just) an optimization, but also required for
109
109
  # correctness, since ancestor.method_defined?(method_name) may return true even if method_name is not defined
110
110
  # directly on ancestor but instead an ancestor of ancestor.
111
- if (ancestor.method_defined?(method_name) ||
112
- ancestor.private_method_defined?(method_name) ||
113
- ancestor.protected_method_defined?(method_name)) &&
114
- final_method?(method_owner_and_name_to_key(ancestor, method_name))
111
+ if final_method?(method_owner_and_name_to_key(ancestor, method_name))
115
112
  definition_file, definition_line = T::Private::Methods.signature_for_method(ancestor.instance_method(method_name)).method.source_location
116
113
  is_redefined = target == ancestor
117
114
  caller_loc = caller_locations&.find {|l| !l.to_s.match?(%r{sorbet-runtime[^/]*/lib/}) }
@@ -220,6 +217,8 @@ module T::Private::Methods
220
217
  # make sure to keep changes in sync.
221
218
  elsif method_sig.check_level == :always || (method_sig.check_level == :tests && T::Private::RuntimeLevels.check_tests?)
222
219
  CallValidation.validate_call(self, original_method, method_sig, args, blk)
220
+ elsif T::Configuration::AT_LEAST_RUBY_2_7
221
+ original_method.bind_call(self, *args, &blk)
223
222
  else
224
223
  original_method.bind(self).call(*args, &blk)
225
224
  end
@@ -77,790 +77,6 @@ module T::Private::Methods::CallValidation
77
77
  mod.send(original_visibility, method_sig.method_name)
78
78
  end
79
79
 
80
- def self.create_validator_method_fast(mod, original_method, method_sig)
81
- if method_sig.return_type.is_a?(T::Private::Types::Void)
82
- raise "Should have used create_validator_procedure_fast"
83
- end
84
- # trampoline to reduce stack frame size
85
- if method_sig.arg_types.empty?
86
- create_validator_method_fast0(mod, original_method, method_sig, method_sig.return_type.raw_type)
87
- elsif method_sig.arg_types.length == 1
88
- create_validator_method_fast1(mod, original_method, method_sig, method_sig.return_type.raw_type,
89
- method_sig.arg_types[0][1].raw_type)
90
- elsif method_sig.arg_types.length == 2
91
- create_validator_method_fast2(mod, original_method, method_sig, method_sig.return_type.raw_type,
92
- method_sig.arg_types[0][1].raw_type,
93
- method_sig.arg_types[1][1].raw_type)
94
- elsif method_sig.arg_types.length == 3
95
- create_validator_method_fast3(mod, original_method, method_sig, method_sig.return_type.raw_type,
96
- method_sig.arg_types[0][1].raw_type,
97
- method_sig.arg_types[1][1].raw_type,
98
- method_sig.arg_types[2][1].raw_type)
99
- elsif method_sig.arg_types.length == 4
100
- create_validator_method_fast4(mod, original_method, method_sig, method_sig.return_type.raw_type,
101
- method_sig.arg_types[0][1].raw_type,
102
- method_sig.arg_types[1][1].raw_type,
103
- method_sig.arg_types[2][1].raw_type,
104
- method_sig.arg_types[3][1].raw_type)
105
- else
106
- raise "should not happen"
107
- end
108
- end
109
-
110
- def self.create_validator_method_fast0(mod, original_method, method_sig, return_type)
111
- mod.send(:define_method, method_sig.method_name) do |&blk|
112
- # This block is called for every `sig`. It's critical to keep it fast and
113
- # reduce number of allocations that happen here.
114
- # This method is a manually sped-up version of more general code in `validate_call`
115
- T::Profile.typecheck_sample_attempts -= 1
116
- should_sample = T::Profile.typecheck_sample_attempts == 0
117
- if should_sample
118
- T::Profile.typecheck_sample_attempts = T::Profile::SAMPLE_RATE
119
- T::Profile.typecheck_samples += 1
120
- t1 = Process.clock_gettime(Process::CLOCK_MONOTONIC)
121
- end
122
-
123
- if should_sample
124
- T::Profile.typecheck_duration += (Process.clock_gettime(Process::CLOCK_MONOTONIC) - t1)
125
- end
126
-
127
- # The following line breaks are intentional to show nice pry message
128
-
129
-
130
-
131
-
132
-
133
-
134
-
135
-
136
-
137
-
138
- # PRY note:
139
- # this code is sig validation code.
140
- # Please issue `finish` to step out of it
141
-
142
- return_value = original_method.bind(self).call(&blk)
143
- if should_sample
144
- t1 = Process.clock_gettime(Process::CLOCK_MONOTONIC)
145
- end
146
-
147
- unless return_value.is_a?(return_type)
148
- message = method_sig.return_type.error_message_for_obj(return_value)
149
- if message
150
- CallValidation.report_error(
151
- method_sig,
152
- message,
153
- 'Return value',
154
- nil,
155
- return_type,
156
- return_value,
157
- caller_offset: -1
158
- )
159
- end
160
- end
161
- if should_sample
162
- T::Profile.typecheck_duration += (Process.clock_gettime(Process::CLOCK_MONOTONIC) - t1)
163
- end
164
- return_value
165
- end
166
- end
167
-
168
- def self.create_validator_method_fast1(mod, original_method, method_sig, return_type, arg0_type)
169
- mod.send(:define_method, method_sig.method_name) do |arg0, &blk|
170
- # This block is called for every `sig`. It's critical to keep it fast and
171
- # reduce number of allocations that happen here.
172
- # This method is a manually sped-up version of more general code in `validate_call`
173
-
174
- T::Profile.typecheck_sample_attempts -= 1
175
- should_sample = T::Profile.typecheck_sample_attempts == 0
176
- if should_sample
177
- T::Profile.typecheck_sample_attempts = T::Profile::SAMPLE_RATE
178
- T::Profile.typecheck_samples += 1
179
- t1 = Process.clock_gettime(Process::CLOCK_MONOTONIC)
180
- end
181
-
182
- unless arg0.is_a?(arg0_type)
183
- CallValidation.report_error(
184
- method_sig,
185
- method_sig.arg_types[0][1].error_message_for_obj(arg0),
186
- 'Parameter',
187
- method_sig.arg_types[0][0],
188
- arg0_type,
189
- arg0,
190
- caller_offset: -1
191
- )
192
- end
193
-
194
- if should_sample
195
- T::Profile.typecheck_duration += (Process.clock_gettime(Process::CLOCK_MONOTONIC) - t1)
196
- end
197
-
198
- # The following line breaks are intentional to show nice pry message
199
-
200
-
201
-
202
-
203
-
204
-
205
-
206
-
207
-
208
-
209
- # PRY note:
210
- # this code is sig validation code.
211
- # Please issue `finish` to step out of it
212
-
213
- return_value = original_method.bind(self).call(arg0, &blk)
214
- if should_sample
215
- t1 = Process.clock_gettime(Process::CLOCK_MONOTONIC)
216
- end
217
-
218
- unless return_value.is_a?(return_type)
219
- message = method_sig.return_type.error_message_for_obj(return_value)
220
- if message
221
- CallValidation.report_error(
222
- method_sig,
223
- message,
224
- 'Return value',
225
- nil,
226
- method_sig.return_type,
227
- return_value,
228
- caller_offset: -1
229
- )
230
- end
231
- end
232
- if should_sample
233
- T::Profile.typecheck_duration += (Process.clock_gettime(Process::CLOCK_MONOTONIC) - t1)
234
- end
235
- return_value
236
- end
237
- end
238
-
239
- def self.create_validator_method_fast2(mod, original_method, method_sig, return_type, arg0_type, arg1_type)
240
- mod.send(:define_method, method_sig.method_name) do |arg0, arg1, &blk|
241
- # This block is called for every `sig`. It's critical to keep it fast and
242
- # reduce number of allocations that happen here.
243
- # This method is a manually sped-up version of more general code in `validate_call`
244
-
245
- T::Profile.typecheck_sample_attempts -= 1
246
- should_sample = T::Profile.typecheck_sample_attempts == 0
247
- if should_sample
248
- T::Profile.typecheck_sample_attempts = T::Profile::SAMPLE_RATE
249
- T::Profile.typecheck_samples += 1
250
- t1 = Process.clock_gettime(Process::CLOCK_MONOTONIC)
251
- end
252
-
253
- unless arg0.is_a?(arg0_type)
254
- CallValidation.report_error(
255
- method_sig,
256
- method_sig.arg_types[0][1].error_message_for_obj(arg0),
257
- 'Parameter',
258
- method_sig.arg_types[0][0],
259
- arg0_type,
260
- arg0,
261
- caller_offset: -1
262
- )
263
- end
264
-
265
- unless arg1.is_a?(arg1_type)
266
- CallValidation.report_error(
267
- method_sig,
268
- method_sig.arg_types[1][1].error_message_for_obj(arg1),
269
- 'Parameter',
270
- method_sig.arg_types[1][0],
271
- arg1_type,
272
- arg1,
273
- caller_offset: -1
274
- )
275
- end
276
-
277
- if should_sample
278
- T::Profile.typecheck_duration += (Process.clock_gettime(Process::CLOCK_MONOTONIC) - t1)
279
- end
280
-
281
- # The following line breaks are intentional to show nice pry message
282
-
283
-
284
-
285
-
286
-
287
-
288
-
289
-
290
-
291
-
292
- # PRY note:
293
- # this code is sig validation code.
294
- # Please issue `finish` to step out of it
295
-
296
- return_value = original_method.bind(self).call(arg0, arg1, &blk)
297
- if should_sample
298
- t1 = Process.clock_gettime(Process::CLOCK_MONOTONIC)
299
- end
300
-
301
- unless return_value.is_a?(return_type)
302
- message = method_sig.return_type.error_message_for_obj(return_value)
303
- if message
304
- CallValidation.report_error(
305
- method_sig,
306
- message,
307
- 'Return value',
308
- nil,
309
- method_sig.return_type,
310
- return_value,
311
- caller_offset: -1
312
- )
313
- end
314
- end
315
- if should_sample
316
- T::Profile.typecheck_duration += (Process.clock_gettime(Process::CLOCK_MONOTONIC) - t1)
317
- end
318
- return_value
319
- end
320
- end
321
-
322
- def self.create_validator_method_fast3(mod, original_method, method_sig, return_type, arg0_type, arg1_type, arg2_type)
323
- mod.send(:define_method, method_sig.method_name) do |arg0, arg1, arg2, &blk|
324
- # This block is called for every `sig`. It's critical to keep it fast and
325
- # reduce number of allocations that happen here.
326
- # This method is a manually sped-up version of more general code in `validate_call`
327
-
328
- T::Profile.typecheck_sample_attempts -= 1
329
- should_sample = T::Profile.typecheck_sample_attempts == 0
330
- if should_sample
331
- T::Profile.typecheck_sample_attempts = T::Profile::SAMPLE_RATE
332
- T::Profile.typecheck_samples += 1
333
- t1 = Process.clock_gettime(Process::CLOCK_MONOTONIC)
334
- end
335
-
336
- unless arg0.is_a?(arg0_type)
337
- CallValidation.report_error(
338
- method_sig,
339
- method_sig.arg_types[0][1].error_message_for_obj(arg0),
340
- 'Parameter',
341
- method_sig.arg_types[0][0],
342
- arg0_type,
343
- arg0,
344
- caller_offset: -1
345
- )
346
- end
347
-
348
- unless arg1.is_a?(arg1_type)
349
- CallValidation.report_error(
350
- method_sig,
351
- method_sig.arg_types[1][1].error_message_for_obj(arg1),
352
- 'Parameter',
353
- method_sig.arg_types[1][0],
354
- arg1_type,
355
- arg1,
356
- caller_offset: -1
357
- )
358
- end
359
-
360
- unless arg2.is_a?(arg2_type)
361
- CallValidation.report_error(
362
- method_sig,
363
- method_sig.arg_types[2][1].error_message_for_obj(arg2),
364
- 'Parameter',
365
- method_sig.arg_types[2][0],
366
- arg2_type,
367
- arg2,
368
- caller_offset: -1
369
- )
370
- end
371
-
372
- if should_sample
373
- T::Profile.typecheck_duration += (Process.clock_gettime(Process::CLOCK_MONOTONIC) - t1)
374
- end
375
-
376
- # The following line breaks are intentional to show nice pry message
377
-
378
-
379
-
380
-
381
-
382
-
383
-
384
-
385
-
386
-
387
- # PRY note:
388
- # this code is sig validation code.
389
- # Please issue `finish` to step out of it
390
-
391
- return_value = original_method.bind(self).call(arg0, arg1, arg2, &blk)
392
- if should_sample
393
- t1 = Process.clock_gettime(Process::CLOCK_MONOTONIC)
394
- end
395
-
396
- unless return_value.is_a?(return_type)
397
- message = method_sig.return_type.error_message_for_obj(return_value)
398
- if message
399
- CallValidation.report_error(
400
- method_sig,
401
- message,
402
- 'Return value',
403
- nil,
404
- method_sig.return_type,
405
- return_value,
406
- caller_offset: -1
407
- )
408
- end
409
- end
410
- if should_sample
411
- T::Profile.typecheck_duration += (Process.clock_gettime(Process::CLOCK_MONOTONIC) - t1)
412
- end
413
- return_value
414
- end
415
- end
416
-
417
- def self.create_validator_method_fast4(mod, original_method, method_sig, return_type,
418
- arg0_type, arg1_type, arg2_type, arg3_type)
419
- mod.send(:define_method, method_sig.method_name) do |arg0, arg1, arg2, arg3, &blk|
420
- # This block is called for every `sig`. It's critical to keep it fast and
421
- # reduce number of allocations that happen here.
422
- # This method is a manually sped-up version of more general code in `validate_call`
423
-
424
- T::Profile.typecheck_sample_attempts -= 1
425
- should_sample = T::Profile.typecheck_sample_attempts == 0
426
- if should_sample
427
- T::Profile.typecheck_sample_attempts = T::Profile::SAMPLE_RATE
428
- T::Profile.typecheck_samples += 1
429
- t1 = Process.clock_gettime(Process::CLOCK_MONOTONIC)
430
- end
431
-
432
- unless arg0.is_a?(arg0_type)
433
- CallValidation.report_error(
434
- method_sig,
435
- method_sig.arg_types[0][1].error_message_for_obj(arg0),
436
- 'Parameter',
437
- method_sig.arg_types[0][0],
438
- arg0_type,
439
- arg0,
440
- caller_offset: -1
441
- )
442
- end
443
-
444
- unless arg1.is_a?(arg1_type)
445
- CallValidation.report_error(
446
- method_sig,
447
- method_sig.arg_types[1][1].error_message_for_obj(arg1),
448
- 'Parameter',
449
- method_sig.arg_types[1][0],
450
- arg1_type,
451
- arg1,
452
- caller_offset: -1
453
- )
454
- end
455
-
456
- unless arg2.is_a?(arg2_type)
457
- CallValidation.report_error(
458
- method_sig,
459
- method_sig.arg_types[2][1].error_message_for_obj(arg2),
460
- 'Parameter',
461
- method_sig.arg_types[2][0],
462
- arg2_type,
463
- arg2,
464
- caller_offset: -1
465
- )
466
- end
467
-
468
- unless arg3.is_a?(arg3_type)
469
- CallValidation.report_error(
470
- method_sig,
471
- method_sig.arg_types[3][1].error_message_for_obj(arg3),
472
- 'Parameter',
473
- method_sig.arg_types[3][0],
474
- arg3_type,
475
- arg3,
476
- caller_offset: -1
477
- )
478
- end
479
-
480
- if should_sample
481
- T::Profile.typecheck_duration += (Process.clock_gettime(Process::CLOCK_MONOTONIC) - t1)
482
- end
483
-
484
- # The following line breaks are intentional to show nice pry message
485
-
486
-
487
-
488
-
489
-
490
-
491
-
492
-
493
-
494
-
495
- # PRY note:
496
- # this code is sig validation code.
497
- # Please issue `finish` to step out of it
498
-
499
- return_value = original_method.bind(self).call(arg0, arg1, arg2, arg3, &blk)
500
- if should_sample
501
- t1 = Process.clock_gettime(Process::CLOCK_MONOTONIC)
502
- end
503
-
504
- unless return_value.is_a?(return_type)
505
- message = method_sig.return_type.error_message_for_obj(return_value)
506
- if message
507
- CallValidation.report_error(
508
- method_sig,
509
- message,
510
- 'Return value',
511
- nil,
512
- method_sig.return_type,
513
- return_value,
514
- caller_offset: -1
515
- )
516
- end
517
- end
518
-
519
- if should_sample
520
- T::Profile.typecheck_duration += (Process.clock_gettime(Process::CLOCK_MONOTONIC) - t1)
521
- end
522
- return_value
523
- end
524
- end
525
-
526
- def self.create_validator_procedure_fast(mod, original_method, method_sig)
527
- # trampoline to reduce stack frame size
528
- if method_sig.arg_types.empty?
529
- create_validator_procedure_fast0(mod, original_method, method_sig)
530
- elsif method_sig.arg_types.length == 1
531
- create_validator_procedure_fast1(mod, original_method, method_sig,
532
- method_sig.arg_types[0][1].raw_type)
533
- elsif method_sig.arg_types.length == 2
534
- create_validator_procedure_fast2(mod, original_method, method_sig,
535
- method_sig.arg_types[0][1].raw_type,
536
- method_sig.arg_types[1][1].raw_type)
537
- elsif method_sig.arg_types.length == 3
538
- create_validator_procedure_fast3(mod, original_method, method_sig,
539
- method_sig.arg_types[0][1].raw_type,
540
- method_sig.arg_types[1][1].raw_type,
541
- method_sig.arg_types[2][1].raw_type)
542
- elsif method_sig.arg_types.length == 4
543
- create_validator_procedure_fast4(mod, original_method, method_sig,
544
- method_sig.arg_types[0][1].raw_type,
545
- method_sig.arg_types[1][1].raw_type,
546
- method_sig.arg_types[2][1].raw_type,
547
- method_sig.arg_types[3][1].raw_type)
548
- else
549
- raise "should not happen"
550
- end
551
- end
552
-
553
- def self.create_validator_procedure_fast0(mod, original_method, method_sig)
554
- mod.send(:define_method, method_sig.method_name) do |&blk|
555
- # This block is called for every `sig`. It's critical to keep it fast and
556
- # reduce number of allocations that happen here.
557
- # This method is a manually sped-up version of more general code in `validate_call`
558
-
559
- T::Profile.typecheck_sample_attempts -= 1
560
- should_sample = T::Profile.typecheck_sample_attempts == 0
561
- if should_sample
562
- T::Profile.typecheck_sample_attempts = T::Profile::SAMPLE_RATE
563
- T::Profile.typecheck_samples += 1
564
- t1 = Process.clock_gettime(Process::CLOCK_MONOTONIC)
565
- end
566
-
567
- if should_sample
568
- T::Profile.typecheck_duration += (Process.clock_gettime(Process::CLOCK_MONOTONIC) - t1)
569
- end
570
-
571
- # The following line breaks are intentional to show nice pry message
572
-
573
-
574
-
575
-
576
-
577
-
578
-
579
-
580
-
581
-
582
- # PRY note:
583
- # this code is sig validation code.
584
- # Please issue `finish` to step out of it
585
-
586
- original_method.bind(self).call(&blk)
587
- T::Private::Types::Void::VOID
588
- end
589
- end
590
-
591
- def self.create_validator_procedure_fast1(mod, original_method, method_sig, arg0_type)
592
-
593
- mod.send(:define_method, method_sig.method_name) do |arg0, &blk|
594
- # This block is called for every `sig`. It's critical to keep it fast and
595
- # reduce number of allocations that happen here.
596
- # This method is a manually sped-up version of more general code in `validate_call`
597
-
598
- T::Profile.typecheck_sample_attempts -= 1
599
- should_sample = T::Profile.typecheck_sample_attempts == 0
600
- if should_sample
601
- T::Profile.typecheck_sample_attempts = T::Profile::SAMPLE_RATE
602
- T::Profile.typecheck_samples += 1
603
- t1 = Process.clock_gettime(Process::CLOCK_MONOTONIC)
604
- end
605
-
606
- unless arg0.is_a?(arg0_type)
607
- CallValidation.report_error(
608
- method_sig,
609
- method_sig.arg_types[0][1].error_message_for_obj(arg0),
610
- 'Parameter',
611
- method_sig.arg_types[0][0],
612
- arg0_type,
613
- arg0,
614
- caller_offset: -1
615
- )
616
- end
617
-
618
- if should_sample
619
- T::Profile.typecheck_duration += (Process.clock_gettime(Process::CLOCK_MONOTONIC) - t1)
620
- end
621
-
622
- # The following line breaks are intentional to show nice pry message
623
-
624
-
625
-
626
-
627
-
628
-
629
-
630
-
631
-
632
-
633
- # PRY note:
634
- # this code is sig validation code.
635
- # Please issue `finish` to step out of it
636
- original_method.bind(self).call(arg0, &blk)
637
- T::Private::Types::Void::VOID
638
- end
639
- end
640
-
641
- def self.create_validator_procedure_fast2(mod, original_method, method_sig, arg0_type, arg1_type)
642
- mod.send(:define_method, method_sig.method_name) do |arg0, arg1, &blk|
643
- # This block is called for every `sig`. It's critical to keep it fast and
644
- # reduce number of allocations that happen here.
645
- # This method is a manually sped-up version of more general code in `validate_call`
646
-
647
- T::Profile.typecheck_sample_attempts -= 1
648
- should_sample = T::Profile.typecheck_sample_attempts == 0
649
- if should_sample
650
- T::Profile.typecheck_sample_attempts = T::Profile::SAMPLE_RATE
651
- T::Profile.typecheck_samples += 1
652
- t1 = Process.clock_gettime(Process::CLOCK_MONOTONIC)
653
- end
654
-
655
- unless arg0.is_a?(arg0_type)
656
- CallValidation.report_error(
657
- method_sig,
658
- method_sig.arg_types[0][1].error_message_for_obj(arg0),
659
- 'Parameter',
660
- method_sig.arg_types[0][0],
661
- arg0_type,
662
- arg0,
663
- caller_offset: -1
664
- )
665
- end
666
-
667
- unless arg1.is_a?(arg1_type)
668
- CallValidation.report_error(
669
- method_sig,
670
- method_sig.arg_types[1][1].error_message_for_obj(arg1),
671
- 'Parameter',
672
- method_sig.arg_types[1][0],
673
- arg1_type,
674
- arg1,
675
- caller_offset: -1
676
- )
677
- end
678
-
679
- if should_sample
680
- T::Profile.typecheck_duration += (Process.clock_gettime(Process::CLOCK_MONOTONIC) - t1)
681
- end
682
-
683
- # The following line breaks are intentional to show nice pry message
684
-
685
-
686
-
687
-
688
-
689
-
690
-
691
-
692
-
693
-
694
- # PRY note:
695
- # this code is sig validation code.
696
- # Please issue `finish` to step out of it
697
-
698
- original_method.bind(self).call(arg0, arg1, &blk)
699
- T::Private::Types::Void::VOID
700
- end
701
- end
702
-
703
- def self.create_validator_procedure_fast3(mod, original_method, method_sig, arg0_type, arg1_type, arg2_type)
704
- mod.send(:define_method, method_sig.method_name) do |arg0, arg1, arg2, &blk|
705
- # This block is called for every `sig`. It's critical to keep it fast and
706
- # reduce number of allocations that happen here.
707
- # This method is a manually sped-up version of more general code in `validate_call`
708
-
709
- T::Profile.typecheck_sample_attempts -= 1
710
- should_sample = T::Profile.typecheck_sample_attempts == 0
711
- if should_sample
712
- T::Profile.typecheck_sample_attempts = T::Profile::SAMPLE_RATE
713
- T::Profile.typecheck_samples += 1
714
- t1 = Process.clock_gettime(Process::CLOCK_MONOTONIC)
715
- end
716
-
717
- unless arg0.is_a?(arg0_type)
718
- CallValidation.report_error(
719
- method_sig,
720
- method_sig.arg_types[0][1].error_message_for_obj(arg0),
721
- 'Parameter',
722
- method_sig.arg_types[0][0],
723
- arg0_type,
724
- arg0,
725
- caller_offset: -1
726
- )
727
- end
728
-
729
- unless arg1.is_a?(arg1_type)
730
- CallValidation.report_error(
731
- method_sig,
732
- method_sig.arg_types[1][1].error_message_for_obj(arg1),
733
- 'Parameter',
734
- method_sig.arg_types[1][0],
735
- arg1_type,
736
- arg1,
737
- caller_offset: -1
738
- )
739
- end
740
-
741
- unless arg2.is_a?(arg2_type)
742
- CallValidation.report_error(
743
- method_sig,
744
- method_sig.arg_types[2][1].error_message_for_obj(arg2),
745
- 'Parameter',
746
- method_sig.arg_types[2][0],
747
- arg2_type,
748
- arg2,
749
- caller_offset: -1
750
- )
751
- end
752
-
753
- if should_sample
754
- T::Profile.typecheck_duration += (Process.clock_gettime(Process::CLOCK_MONOTONIC) - t1)
755
- end
756
-
757
- # The following line breaks are intentional to show nice pry message
758
-
759
-
760
-
761
-
762
-
763
-
764
-
765
-
766
-
767
-
768
- # PRY note:
769
- # this code is sig validation code.
770
- # Please issue `finish` to step out of it
771
-
772
- original_method.bind(self).call(arg0, arg1, arg2, &blk)
773
- T::Private::Types::Void::VOID
774
- end
775
- end
776
-
777
- def self.create_validator_procedure_fast4(mod, original_method, method_sig,
778
- arg0_type, arg1_type, arg2_type, arg3_type)
779
- mod.send(:define_method, method_sig.method_name) do |arg0, arg1, arg2, arg3, &blk|
780
- # This block is called for every `sig`. It's critical to keep it fast and
781
- # reduce number of allocations that happen here.
782
- # This method is a manually sped-up version of more general code in `validate_call`
783
-
784
- T::Profile.typecheck_sample_attempts -= 1
785
- should_sample = T::Profile.typecheck_sample_attempts == 0
786
- if should_sample
787
- T::Profile.typecheck_sample_attempts = T::Profile::SAMPLE_RATE
788
- T::Profile.typecheck_samples += 1
789
- t1 = Process.clock_gettime(Process::CLOCK_MONOTONIC)
790
- end
791
-
792
- unless arg0.is_a?(arg0_type)
793
- CallValidation.report_error(
794
- method_sig,
795
- method_sig.arg_types[0][1].error_message_for_obj(arg0),
796
- 'Parameter',
797
- method_sig.arg_types[0][0],
798
- arg0_type,
799
- arg0,
800
- caller_offset: -1
801
- )
802
- end
803
-
804
- unless arg1.is_a?(arg1_type)
805
- CallValidation.report_error(
806
- method_sig,
807
- method_sig.arg_types[1][1].error_message_for_obj(arg1),
808
- 'Parameter',
809
- method_sig.arg_types[1][0],
810
- arg1_type,
811
- arg1,
812
- caller_offset: -1
813
- )
814
- end
815
-
816
- unless arg2.is_a?(arg2_type)
817
- CallValidation.report_error(
818
- method_sig,
819
- method_sig.arg_types[2][1].error_message_for_obj(arg2),
820
- 'Parameter',
821
- method_sig.arg_types[2][0],
822
- arg2_type,
823
- arg2,
824
- caller_offset: -1
825
- )
826
- end
827
-
828
- unless arg3.is_a?(arg3_type)
829
- CallValidation.report_error(
830
- method_sig,
831
- method_sig.arg_types[3][1].error_message_for_obj(arg3),
832
- 'Parameter',
833
- method_sig.arg_types[3][0],
834
- arg3_type,
835
- arg3,
836
- caller_offset: -1
837
- )
838
- end
839
-
840
- if should_sample
841
- T::Profile.typecheck_duration += (Process.clock_gettime(Process::CLOCK_MONOTONIC) - t1)
842
- end
843
-
844
- # The following line breaks are intentional to show nice pry message
845
-
846
-
847
-
848
-
849
-
850
-
851
-
852
-
853
-
854
-
855
- # PRY note:
856
- # this code is sig validation code.
857
- # Please issue `finish` to step out of it
858
-
859
- original_method.bind(self).call(arg0, arg1, arg2, arg3, &blk)
860
- T::Private::Types::Void::VOID
861
- end
862
- end
863
-
864
80
  def self.create_validator_slow(mod, original_method, method_sig)
865
81
  mod.send(:define_method, method_sig.method_name) do |*args, &blk|
866
82
  CallValidation.validate_call(self, original_method, method_sig, args, blk)
@@ -946,7 +162,7 @@ module T::Private::Methods::CallValidation
946
162
  # this code is sig validation code.
947
163
  # Please issue `finish` to step out of it
948
164
 
949
- return_value = original_method.bind(instance).call(*args, &blk)
165
+ return_value = T::Configuration::AT_LEAST_RUBY_2_7 ? original_method.bind_call(instance, *args, &blk) : original_method.bind(instance).call(*args, &blk)
950
166
  if should_sample
951
167
  t1 = Process.clock_gettime(Process::CLOCK_MONOTONIC)
952
168
  end
@@ -1007,3 +223,9 @@ module T::Private::Methods::CallValidation
1007
223
  end
1008
224
  end
1009
225
  end
226
+
227
+ if T::Configuration::AT_LEAST_RUBY_2_7
228
+ require_relative './call_validation_2_7'
229
+ else
230
+ require_relative './call_validation_2_6'
231
+ end