sorbet-runtime 0.5.6382 → 0.5.6391

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: bf2148f2c8b83fe261d42135aebb10b7e4bd6ed53981cf3cca3aef02dc973edb
4
- data.tar.gz: b353a661bcc6f804f657c340af961ecdf076e773283d9e8b5d9ab925544846dd
3
+ metadata.gz: 5a81243179b6a7b33dc911b45394c4d509a3ca58f5400e9fef69745629504b94
4
+ data.tar.gz: 4106d81a66aeed8dc5bf06ab6266140dd3f7dc5cd00803b4b2532acb8da1114e
5
5
  SHA512:
6
- metadata.gz: 3eea8c3e5cf69f0282dd20bc012a9fee55b33e8457c5c3b83c5b4a40d6f9e00eb11c5f446e01d7beda09153d7243305c66d3bf2ef7a5cecad3691a503ea453ed
7
- data.tar.gz: 19cf13cd5b49c076f187fff4863ad5d1d09e7bcd2b8941a01cc2d4c5a85a0dcb8bc996e839c0c73660324a2c6cad0b08e9d666a7aec74833a5c10caa48cdac3b
6
+ metadata.gz: d7ce14e14087c651d5de7ebb98cb0752e0a5f42c65fedef67c0088be0bf097f33126985c9eb0ebf52b9b24f3f8db73b88fd18a9c6ad6a4ebc4df338ff3eff7bb
7
+ data.tar.gz: 4ef0b7e7f4f5fab289e8f40ac9c91e91c2e856ecc6bb9352bc6864fcb3e4a81c6b1a01b2c7f917eb9e43916e0fc27ff836bd40a9af813310777e9a359633f44f
@@ -73,6 +73,27 @@ module T::Configuration
73
73
  @include_value_in_type_errors = true
74
74
  end
75
75
 
76
+ # Whether to use VM-defined prop serialization/deserialization routines.
77
+ #
78
+ # The default is to use runtime codegen inside sorbet-runtime itself.
79
+ #
80
+ # @return [T::Boolean]
81
+ def self.use_vm_prop_serde?
82
+ @use_vm_prop_serde || false
83
+ end
84
+
85
+ # Enable using VM-defined prop serialization/deserialization routines.
86
+ #
87
+ # This method is likely to break things outside of Stripe's systems.
88
+ def self.enable_vm_prop_serde
89
+ @use_vm_prop_serde = true
90
+ end
91
+
92
+ # Disable using VM-defined prop serialization/deserialization routines.
93
+ def self.disable_vm_prop_serde
94
+ @use_vm_prop_serde = false
95
+ end
96
+
76
97
  # Configure the default checked level for a sig with no explicit `.checked`
77
98
  # builder. When unset, the default checked level is `:always`.
78
99
  #
@@ -162,7 +162,16 @@ module T::Props
162
162
  exceptions.children.each {|c| assert_equal(:const, c.type)}
163
163
  assert_equal(:lvasgn, assignment.type)
164
164
  assert_equal([:e], assignment.children)
165
- validate_lack_of_side_effects(handler, whitelisted_methods_for_deserialize)
165
+
166
+ deserialization_error, val_return = handler.children
167
+
168
+ assert_equal(:send, deserialization_error.type)
169
+ receiver, method, *args = deserialization_error.children
170
+ assert_equal(nil, receiver)
171
+ assert_equal(:raise_deserialization_error, method)
172
+ args.each {|a| validate_lack_of_side_effects(a, whitelisted_methods_for_deserialize)}
173
+
174
+ validate_lack_of_side_effects(val_return, whitelisted_methods_for_deserialize)
166
175
  else
167
176
  validate_lack_of_side_effects(else_body, whitelisted_methods_for_deserialize)
168
177
  end
@@ -261,7 +270,7 @@ module T::Props
261
270
  private_class_method def self.whitelisted_methods_for_deserialize
262
271
  @whitelisted_methods_for_deserialize ||= {
263
272
  lvar: %i{dup map transform_values transform_keys each_with_object nil? []= to_f},
264
- const: %i[deserialize from_hash deep_clone_object soft_assert_handler],
273
+ const: %i[deserialize from_hash deep_clone_object],
265
274
  }
266
275
  end
267
276
  end
@@ -48,6 +48,11 @@ module T::Props
48
48
  @lazily_defined_methods ||= {}
49
49
  end
50
50
 
51
+ sig {returns(T::Hash[Symbol, T.untyped]).checked(:never)}
52
+ private def lazily_defined_vm_methods
53
+ @lazily_defined_vm_methods ||= {}
54
+ end
55
+
51
56
  sig {params(name: Symbol).void}
52
57
  private def eval_lazily_defined_method!(name)
53
58
  if !HasLazilySpecializedMethods.lazy_evaluation_enabled?
@@ -61,6 +66,18 @@ module T::Props
61
66
  cls.send(:private, name)
62
67
  end
63
68
 
69
+ sig {params(name: Symbol).void}
70
+ private def eval_lazily_defined_vm_method!(name)
71
+ if !HasLazilySpecializedMethods.lazy_evaluation_enabled?
72
+ raise SourceEvaluationDisabled.new
73
+ end
74
+
75
+ lazily_defined_vm_methods.fetch(name).call
76
+
77
+ cls = decorated_class
78
+ cls.send(:private, name)
79
+ end
80
+
64
81
  sig {params(name: Symbol, blk: T.proc.returns(String)).void}
65
82
  private def enqueue_lazy_method_definition!(name, &blk)
66
83
  lazily_defined_methods[name] = blk
@@ -76,6 +93,21 @@ module T::Props
76
93
  cls.send(:private, name)
77
94
  end
78
95
 
96
+ sig {params(name: Symbol, blk: T.untyped).void}
97
+ private def enqueue_lazy_vm_method_definition!(name, &blk)
98
+ lazily_defined_vm_methods[name] = blk
99
+
100
+ cls = decorated_class
101
+ cls.send(:define_method, name) do |*args|
102
+ self.class.decorator.send(:eval_lazily_defined_vm_method!, name)
103
+ send(name, *args)
104
+ end
105
+ if cls.respond_to?(:ruby2_keywords, true)
106
+ cls.send(:ruby2_keywords, name)
107
+ end
108
+ cls.send(:private, name)
109
+ end
110
+
79
111
  sig {void}
80
112
  def eagerly_define_lazy_methods!
81
113
  return if lazily_defined_methods.empty?
@@ -87,6 +119,17 @@ module T::Props
87
119
  lazily_defined_methods.each_key {|name| cls.send(:private, name)}
88
120
  lazily_defined_methods.clear
89
121
  end
122
+
123
+ sig {void}
124
+ def eagerly_define_lazy_vm_methods!
125
+ return if lazily_defined_vm_methods.empty?
126
+
127
+ lazily_defined_vm_methods.values.map(&:call)
128
+
129
+ cls = decorated_class
130
+ lazily_defined_vm_methods.each_key {|name| cls.send(:private, name)}
131
+ lazily_defined_vm_methods.clear
132
+ end
90
133
  end
91
134
  end
92
135
  end
@@ -57,15 +57,10 @@ module T::Props
57
57
  begin
58
58
  #{transformation}
59
59
  rescue NoMethodError => e
60
- T::Configuration.soft_assert_handler(
61
- 'Deserialization error (probably unexpected stored type)',
62
- storytime: {
63
- klass: self.class,
64
- prop: #{prop.inspect},
65
- value: val,
66
- error: e.message,
67
- notify: 'djudd'
68
- }
60
+ raise_deserialization_error(
61
+ #{prop.inspect},
62
+ val,
63
+ e,
69
64
  )
70
65
  val
71
66
  end
@@ -156,6 +156,19 @@ module T::Props::Serializable
156
156
  @_required_props_missing_from_deserialize << prop
157
157
  nil
158
158
  end
159
+
160
+ private def raise_deserialization_error(prop_name, value, orig_error)
161
+ T::Configuration.soft_assert_handler(
162
+ 'Deserialization error (probably unexpected stored type)',
163
+ storytime: {
164
+ klass: self.class,
165
+ prop: prop_name,
166
+ value: value,
167
+ error: orig_error.message,
168
+ notify: 'djudd'
169
+ }
170
+ )
171
+ end
159
172
  end
160
173
 
161
174
 
@@ -201,8 +214,13 @@ module T::Props::Serializable::DecoratorMethods
201
214
  rules[:serialized_form] = rules.fetch(:name, prop.to_s)
202
215
  res = super
203
216
  prop_by_serialized_forms[rules[:serialized_form]] = prop
204
- enqueue_lazy_method_definition!(:__t_props_generated_serialize) {generate_serialize_source}
205
- enqueue_lazy_method_definition!(:__t_props_generated_deserialize) {generate_deserialize_source}
217
+ if T::Configuration.use_vm_prop_serde?
218
+ enqueue_lazy_vm_method_definition!(:__t_props_generated_serialize) {generate_serialize2}
219
+ enqueue_lazy_vm_method_definition!(:__t_props_generated_deserialize) {generate_deserialize2}
220
+ else
221
+ enqueue_lazy_method_definition!(:__t_props_generated_serialize) {generate_serialize_source}
222
+ enqueue_lazy_method_definition!(:__t_props_generated_deserialize) {generate_deserialize_source}
223
+ end
206
224
  res
207
225
  end
208
226
 
@@ -217,6 +235,18 @@ module T::Props::Serializable::DecoratorMethods
217
235
  )
218
236
  end
219
237
 
238
+ private def generate_serialize2
239
+ T::Props::Private::SerializerGenerator.generate2(decorated_class, props)
240
+ end
241
+
242
+ private def generate_deserialize2
243
+ T::Props::Private::DeserializerGenerator.generate2(
244
+ decorated_class,
245
+ props,
246
+ props_with_defaults || {},
247
+ )
248
+ end
249
+
220
250
  def message_with_generated_source_context(error, generated_method, generate_source_method)
221
251
  line_label = error.backtrace.find {|l| l.end_with?("in `#{generated_method}'")}
222
252
  return unless line_label
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.6382
4
+ version: 0.5.6391
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stripe
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-04-20 00:00:00.000000000 Z
11
+ date: 2021-04-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: minitest