sorbet-runtime 0.6.13640 → 0.6.13645

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: c1c6889cfff1084220a387a83be0db47a4e8d64fd52c908f92cec233959167b2
4
- data.tar.gz: fb88d8b6d8d544c49d1a6c505f4d914e3397eb8589da9e7b45990c1d99867f4e
3
+ metadata.gz: e60178283f5d03064093df6783548c58e6ea6f57b9b179dde7813d49deac5ecc
4
+ data.tar.gz: c23e8c62f59909036be48774a0986fb8487e6a5b06d5328ca79ac7e2946d8307
5
5
  SHA512:
6
- metadata.gz: 34175a95d0498d547a3ee97f46d282ea00c0179ff26767fd9a2382f4f074d6decb919cf887164030530fcedf83530b1b17bdce51e11ae34c45f36b3d62dc90ee
7
- data.tar.gz: e43447bc650100a300abfaf2f846ba8347b209d61174023c87a5335f37d5d6c107d3d59b7d71da44b976818e4cabf6d4744689ba047311fa11b084d3c434a650
6
+ metadata.gz: f2df8e767af1c945a6b0b75b9cfef26b8c38a271fd1674f5b404f646a01df3df547ed399e6b10603a4cecc49764281aca10f7e31a7d69608a7ef9bf6292a63de
7
+ data.tar.gz: a000671a569f11bafddbf498a71b105b65dc314ef5a76b2605b213541f540580af1fd2c0037eec99982fe7455b346201d803c349913c4c78b2be43f88889bb6d
data/lib/types/_types.rb CHANGED
@@ -331,7 +331,7 @@ module T
331
331
  if keys.is_a?(T::Types::Untyped) && values.is_a?(T::Types::Untyped)
332
332
  T::Types::TypedHash::Untyped::Private::INSTANCE
333
333
  else
334
- T::Types::TypedHash.new(keys: keys, values: values)
334
+ T::Types::TypedHash::Private::Pool.type_for_keys_and_values(keys, values)
335
335
  end
336
336
  end
337
337
  end
@@ -45,6 +45,33 @@ module T::Types
45
45
  Hash.new(...)
46
46
  end
47
47
 
48
+ # Only public for `Private::Pool`, which holds each per-keys bucket weakly, so every pooled type keeps its own bucket alive.
49
+ def _retain_pool_bucket(bucket)
50
+ @pool_bucket = bucket
51
+ end
52
+
53
+ module Private
54
+ module Pool
55
+ @cache = ObjectSpace::WeakMap.new
56
+
57
+ def self.type_for_keys_and_values(keys, values)
58
+ by_values = @cache[keys]
59
+ if by_values.nil?
60
+ by_values = ObjectSpace::WeakMap.new
61
+ @cache[keys] = by_values
62
+ end
63
+
64
+ cached = by_values[values]
65
+ return cached if cached
66
+
67
+ type = TypedHash.new(keys: keys, values: values)
68
+ type._retain_pool_bucket(by_values)
69
+ by_values[values] = type
70
+ type
71
+ end
72
+ end
73
+ end
74
+
48
75
  class Untyped < TypedHash
49
76
  def initialize
50
77
  # Use the INSTANCE constant directly (rather than `T.untyped`) so this
@@ -148,6 +148,16 @@ module T::Types
148
148
  EMPTY_ARRAY = [].freeze
149
149
  private_constant :EMPTY_ARRAY
150
150
 
151
+ @nilable_cache = ObjectSpace::WeakMap.new
152
+
153
+ # Memoizes `T.nilable(type)` for compound types, the way `Simple#to_nilable` does for simple ones.
154
+ def self.nilable_of(type)
155
+ cached = @nilable_cache[type]
156
+ return cached if cached
157
+
158
+ @nilable_cache[type] = Union.new([type, T::Utils::Nilable::NIL_TYPE])
159
+ end
160
+
151
161
  # Try to use `to_nilable` on a type to get memoization, or failing that
152
162
  # try to at least use SimplePairUnion to get faster init and typechecking.
153
163
  #
@@ -164,7 +174,14 @@ module T::Types
164
174
  if !types.empty?
165
175
  # Slow path
166
176
  return Union.new([type_a, type_b] + types)
167
- elsif !type_a.is_a?(T::Types::Simple) || !type_b.is_a?(T::Types::Simple)
177
+ elsif !type_a.is_a?(T::Types::Simple)
178
+ if type_b.equal?(T::Utils::Nilable::NIL_TYPE)
179
+ return nilable_of(type_a)
180
+ else
181
+ # Slow path
182
+ return Union.new([type_a, type_b])
183
+ end
184
+ elsif !type_b.is_a?(T::Types::Simple)
168
185
  # Slow path
169
186
  return Union.new([type_a, type_b])
170
187
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sorbet-runtime
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.13640
4
+ version: 0.6.13645
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stripe