typeprof 0.5.3 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (208) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +6 -4
  3. data/doc/doc.ja.md +3 -4
  4. data/doc/doc.md +3 -4
  5. data/lib/typeprof/analyzer.rb +248 -166
  6. data/lib/typeprof/arguments.rb +12 -6
  7. data/lib/typeprof/builtin.rb +123 -23
  8. data/lib/typeprof/cli.rb +33 -34
  9. data/lib/typeprof/config.rb +6 -4
  10. data/lib/typeprof/container-type.rb +175 -112
  11. data/lib/typeprof/export.rb +23 -17
  12. data/lib/typeprof/import.rb +58 -53
  13. data/lib/typeprof/method.rb +59 -125
  14. data/lib/typeprof/type.rb +26 -14
  15. data/lib/typeprof/version.rb +1 -1
  16. data/smoke/alias.rb +1 -0
  17. data/smoke/any1.rb +1 -0
  18. data/smoke/any2.rb +1 -0
  19. data/smoke/arguments.rb +1 -0
  20. data/smoke/arguments2.rb +1 -0
  21. data/smoke/array-each.rb +1 -0
  22. data/smoke/array-each2.rb +1 -0
  23. data/smoke/array-each3.rb +2 -1
  24. data/smoke/array-ltlt.rb +1 -0
  25. data/smoke/array-ltlt2.rb +1 -0
  26. data/smoke/array-map.rb +1 -0
  27. data/smoke/array-map2.rb +1 -0
  28. data/smoke/array-map3.rb +1 -0
  29. data/smoke/array-mul.rb +1 -0
  30. data/smoke/array-plus1.rb +1 -0
  31. data/smoke/array-pop.rb +1 -0
  32. data/smoke/array-range-aref.rb +71 -0
  33. data/smoke/array-replace.rb +1 -0
  34. data/smoke/array-s-aref.rb +1 -0
  35. data/smoke/array1.rb +1 -0
  36. data/smoke/array10.rb +1 -0
  37. data/smoke/array11.rb +2 -1
  38. data/smoke/array12.rb +1 -0
  39. data/smoke/array13.rb +1 -0
  40. data/smoke/array14.rb +1 -0
  41. data/smoke/array2.rb +1 -0
  42. data/smoke/array4.rb +1 -0
  43. data/smoke/array5.rb +1 -0
  44. data/smoke/array6.rb +3 -2
  45. data/smoke/array7.rb +1 -0
  46. data/smoke/array8.rb +1 -1
  47. data/smoke/array9.rb +1 -0
  48. data/smoke/autoload.rb +14 -0
  49. data/smoke/backtrace.rb +1 -0
  50. data/smoke/block-ambiguous.rb +1 -0
  51. data/smoke/block-args1-rest.rb +1 -0
  52. data/smoke/block-args1.rb +1 -0
  53. data/smoke/block-args2-rest.rb +1 -0
  54. data/smoke/block-args2.rb +4 -3
  55. data/smoke/block-args3-rest.rb +1 -0
  56. data/smoke/block-args3.rb +5 -4
  57. data/smoke/block-blockarg.rb +2 -1
  58. data/smoke/block-kwarg.rb +1 -0
  59. data/smoke/block1.rb +1 -0
  60. data/smoke/block10.rb +1 -0
  61. data/smoke/block11.rb +1 -0
  62. data/smoke/block12.rb +1 -0
  63. data/smoke/block14.rb +1 -0
  64. data/smoke/block2.rb +1 -0
  65. data/smoke/block4.rb +1 -0
  66. data/smoke/block5.rb +2 -1
  67. data/smoke/block6.rb +1 -0
  68. data/smoke/block7.rb +1 -0
  69. data/smoke/block8.rb +1 -0
  70. data/smoke/block9.rb +1 -0
  71. data/smoke/blown.rb +1 -0
  72. data/smoke/break1.rb +1 -0
  73. data/smoke/break2.rb +1 -0
  74. data/smoke/case.rb +1 -0
  75. data/smoke/case2.rb +1 -0
  76. data/smoke/class_method3.rb +2 -0
  77. data/smoke/constant2.rb +2 -2
  78. data/smoke/constant3.rb +1 -0
  79. data/smoke/constant4.rb +1 -0
  80. data/smoke/context-sensitive1.rb +1 -0
  81. data/smoke/cvar.rb +1 -0
  82. data/smoke/define_method.rb +16 -0
  83. data/smoke/define_method2.rb +18 -0
  84. data/smoke/demo.rb +1 -0
  85. data/smoke/demo1.rb +1 -0
  86. data/smoke/demo10.rb +1 -0
  87. data/smoke/demo11.rb +1 -0
  88. data/smoke/demo2.rb +1 -0
  89. data/smoke/demo3.rb +1 -0
  90. data/smoke/demo5.rb +1 -1
  91. data/smoke/demo7.rb +1 -0
  92. data/smoke/demo8.rb +1 -0
  93. data/smoke/demo9.rb +2 -1
  94. data/smoke/dummy-execution1.rb +1 -0
  95. data/smoke/ensure1.rb +1 -0
  96. data/smoke/enumerator.rb +1 -0
  97. data/smoke/expandarray1.rb +1 -0
  98. data/smoke/expandarray2.rb +1 -0
  99. data/smoke/flow1.rb +1 -0
  100. data/smoke/flow2.rb +1 -0
  101. data/smoke/flow3.rb +1 -0
  102. data/smoke/flow5.rb +1 -0
  103. data/smoke/flow6.rb +1 -0
  104. data/smoke/flow7.rb +1 -0
  105. data/smoke/flow8.rb +1 -0
  106. data/smoke/freeze.rb +1 -0
  107. data/smoke/function.rb +1 -0
  108. data/smoke/gvar.rb +1 -0
  109. data/smoke/gvar2.rb +1 -0
  110. data/smoke/hash-fetch.rb +1 -0
  111. data/smoke/hash-merge-bang.rb +1 -0
  112. data/smoke/hash1.rb +3 -1
  113. data/smoke/hash2.rb +1 -0
  114. data/smoke/hash3.rb +1 -0
  115. data/smoke/hash4.rb +2 -1
  116. data/smoke/inheritance2.rb +2 -2
  117. data/smoke/initialize.rb +1 -0
  118. data/smoke/int_times.rb +1 -0
  119. data/smoke/integer.rb +1 -0
  120. data/smoke/ivar.rb +1 -0
  121. data/smoke/ivar2.rb +1 -1
  122. data/smoke/kernel-class.rb +2 -1
  123. data/smoke/keyword1.rb +1 -0
  124. data/smoke/keyword2.rb +1 -0
  125. data/smoke/keyword3.rb +1 -0
  126. data/smoke/keyword4.rb +1 -0
  127. data/smoke/keyword5.rb +1 -0
  128. data/smoke/kwrest.rb +12 -0
  129. data/smoke/kwrest.rbs +3 -0
  130. data/smoke/kwsplat1.rb +2 -1
  131. data/smoke/kwsplat2.rb +1 -0
  132. data/smoke/manual-rbs.rb +1 -0
  133. data/smoke/manual-rbs2.rb +1 -0
  134. data/smoke/masgn1.rb +1 -0
  135. data/smoke/masgn2.rb +1 -0
  136. data/smoke/masgn3.rb +1 -0
  137. data/smoke/method_in_branch.rb +1 -0
  138. data/smoke/method_missing.rb +28 -0
  139. data/smoke/multiple-superclass.rb +1 -1
  140. data/smoke/next1.rb +1 -0
  141. data/smoke/next2.rb +1 -0
  142. data/smoke/object-send1.rb +1 -0
  143. data/smoke/once.rb +1 -0
  144. data/smoke/optional1.rb +1 -0
  145. data/smoke/optional2.rb +1 -0
  146. data/smoke/optional3.rb +1 -0
  147. data/smoke/parameterizedd-self.rb +3 -2
  148. data/smoke/parameterizedd-self2.rb +15 -0
  149. data/smoke/pathname1.rb +1 -0
  150. data/smoke/pathname2.rb +1 -0
  151. data/smoke/pattern-match1.rb +1 -0
  152. data/smoke/pattern-match2.rb +1 -0
  153. data/smoke/proc.rb +1 -0
  154. data/smoke/proc2.rb +1 -0
  155. data/smoke/proc3.rb +1 -0
  156. data/smoke/proc4.rb +1 -0
  157. data/smoke/range.rb +1 -0
  158. data/smoke/rbs-alias.rb +1 -0
  159. data/smoke/rbs-attr.rb +3 -2
  160. data/smoke/rbs-attr2.rb +11 -0
  161. data/smoke/rbs-attr2.rbs +3 -0
  162. data/smoke/rbs-extend.rb +1 -0
  163. data/smoke/rbs-interface.rb +1 -0
  164. data/smoke/rbs-proc1.rb +1 -0
  165. data/smoke/rbs-proc2.rb +1 -0
  166. data/smoke/rbs-proc3.rb +1 -0
  167. data/smoke/rbs-record.rb +1 -0
  168. data/smoke/rbs-tyvar.rb +1 -0
  169. data/smoke/rbs-tyvar2.rb +1 -0
  170. data/smoke/rbs-tyvar3.rb +1 -0
  171. data/smoke/rbs-tyvar5.rb +1 -0
  172. data/smoke/rbs-tyvar6.rb +18 -0
  173. data/smoke/rbs-tyvar6.rbs +12 -0
  174. data/smoke/rbs-tyvar7.rb +12 -0
  175. data/smoke/rbs-tyvar7.rbs +7 -0
  176. data/smoke/rbs-vars.rb +1 -2
  177. data/smoke/redo1.rb +1 -0
  178. data/smoke/redo2.rb +1 -0
  179. data/smoke/req-keyword.rb +1 -0
  180. data/smoke/rescue1.rb +1 -0
  181. data/smoke/rescue2.rb +1 -0
  182. data/smoke/respond_to.rb +1 -0
  183. data/smoke/rest-farg.rb +1 -0
  184. data/smoke/rest1.rb +1 -0
  185. data/smoke/rest2.rb +1 -0
  186. data/smoke/rest3.rb +1 -0
  187. data/smoke/rest4.rb +1 -0
  188. data/smoke/rest5.rb +1 -0
  189. data/smoke/rest6.rb +1 -0
  190. data/smoke/retry1.rb +1 -0
  191. data/smoke/return.rb +1 -0
  192. data/smoke/step.rb +1 -0
  193. data/smoke/string-split.rb +1 -0
  194. data/smoke/struct.rb +2 -2
  195. data/smoke/struct2.rb +1 -0
  196. data/smoke/super1.rb +1 -0
  197. data/smoke/super4.rb +43 -0
  198. data/smoke/super5.rb +36 -0
  199. data/smoke/svar1.rb +1 -0
  200. data/smoke/symbol-proc.rb +1 -0
  201. data/smoke/tap1.rb +1 -0
  202. data/smoke/toplevel.rb +1 -0
  203. data/smoke/two-map.rb +1 -0
  204. data/smoke/type_var.rb +1 -0
  205. data/smoke/typed_method.rb +1 -0
  206. data/smoke/uninitialize-var.rb +1 -0
  207. data/smoke/union-recv.rb +2 -2
  208. metadata +18 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b1281ceb7a6a28b6dec33aad740d0fa52429a17ca29d57747717247fdb449c79
4
- data.tar.gz: 3ad79ab67ba6080e0c1da2b46671012e4db2f886020a11772158449ffd85717b
3
+ metadata.gz: dd38b5e501a5d4fbe4db1ad43015c44ab39dbfefc3f7638516faeb5bcafd21a9
4
+ data.tar.gz: 000f140ab750e4ddd57863851c21a830bfe470c0eb7be9e38442ca535f4ef041
5
5
  SHA512:
6
- metadata.gz: c0e888c0c1cc871b23592f29d138f7c9c8ca5370fa98699c9b504aa29c79796f58d97653fac98cef2df1d8e7f5c961942ee28d385a95695e4ce7f1ff3c8d24f5
7
- data.tar.gz: 3ee4de72a8e26aed401b1879575ef82c0b1215fe9ccb87ee2c781a8138becc9ab948aea00e07e8e344ca4f96610ebfefdc540f175253cfe32dca1f721c232e7f
6
+ metadata.gz: '00924963d5f91c4609224615507fcfb240a140c8119bf76f24aa28973342e6b61c528fc579781690f9f0392bf0d125c8bdb70499525791603c111ed9251da931'
7
+ data.tar.gz: ee07e0636cd3e26271c468e1927e676a1b320ddefe13dc2412c254cac9aaeac7ca5db1936a26ccc477c2494473fde1d2bdde7a28bd1fa384c6995d7ae4d085ea
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- typeprof (0.5.2)
4
+ typeprof (0.8.0)
5
5
  rbs (>= 0.17.0)
6
6
 
7
7
  GEM
@@ -11,13 +11,15 @@ GEM
11
11
  docile (1.3.2)
12
12
  power_assert (1.2.0)
13
13
  rake (13.0.1)
14
- rbs (0.17.0)
15
- simplecov (0.19.1)
14
+ rbs (0.18.1)
15
+ simplecov (0.20.0)
16
16
  docile (~> 1.1)
17
17
  simplecov-html (~> 0.11)
18
+ simplecov_json_formatter (~> 0.1)
18
19
  simplecov-html (0.12.3)
20
+ simplecov_json_formatter (0.1.2)
19
21
  stackprof (0.2.16)
20
- test-unit (3.3.6)
22
+ test-unit (3.3.7)
21
23
  power_assert
22
24
 
23
25
  PLATFORMS
@@ -35,10 +35,9 @@ $ typeprof sig/app.rbs app.rb -o sig/app.gen.rbs
35
35
  * `--exclude-dir DIR`: `DIR`以下のファイルの解析結果を出力から省略する。後に指定されているほうが優先される(`--include-dir foo --exclude-dir foo/bar`の場合う、foo/bar/baz.rbの結果は出力されず、foo/baz.rbの結果は出力される)。
36
36
  * `--include-dir DIR`: `DIR`以下のファイルの解析結果を出力に含める。後に指定されているほうが優先される(`--exclude-dir foo --include-dir foo/bar`の場合、
37
37
  foo/bar/baz.rbの結果は出力されるが、foo/baz.rbの結果は出力されない)。
38
- * `-fshow-errors`: 実行中に見つけたバグの可能性を出力します(多くの場合、大量のfalse positiveが出ます)。
39
- * `-fpedantic-output`: デフォルトでは`A | untyped`と推定されたところを単に`A`と出力しますが、より生の出力、つまり`A | untyped`と出力します。
40
- * `-fshow-container-raw-elements`: (後で書く)
41
- * `-ftype-depth-limit=NUM`: (後で書く)
38
+ * `--show-errors`: 実行中に見つけたバグの可能性を出力します(多くの場合、大量のfalse positiveが出ます)。
39
+ * `--show-untyped`: デフォルトでは`A | untyped`と推定されたところを単に`A`と出力しますが、より生の出力、つまり`A | untyped`と出力します。
40
+ * `--type-depth-limit=NUM`: (後で書く)
42
41
 
43
42
  ## TypeProfとは
44
43
 
data/doc/doc.md CHANGED
@@ -34,10 +34,9 @@ Here is a list of currently avaiable options:
34
34
  * `-r GEMNAME`: Load the RBS files of `GEMNAME`
35
35
  * `--exclude-dir DIR`: Omit the result of files that are placed under the directory `DIR`. If there are some directory specifications, the latter one is stronger. (Assuming that `--include-dir foo --exclude-dir foo/bar` is specified, the analysis result of foo/bar/baz.rb is omitted, but foo/baz.rb is shown.)
36
36
  * `--include-dir DIR`: Show the result of files that are placed under the directory `DIR`. If there are some directory specifications, the latter one is stronger. (Assuming that `--exclude-dir foo --include-dir foo/bar` is specified, the analysis result of foo/bar/baz.rb is shown, but foo/baz.rb is omitted.)
37
- * `-fshow-errors`: Prints out possible bugs found during execution (often a lot of false positives).
38
- * `-fpedantic-output`: When TypeProf inferred a type `A | untyped`, it simply outputs `A` by default. But this option forces it to output `A | untyped`.
39
- * `-fshow-container-raw-elements`: (undocumented yet)
40
- * `-ftype-depth-limit=NUM`: (undocumented yet)
37
+ * `--show-errors`: Prints out possible bugs found during execution (often a lot of false positives).
38
+ * `--show-untyped`: When TypeProf infers a type `A | untyped`, it simply outputs `A` by default. But this option forces to output `A | untyped`.
39
+ * `--type-depth-limit=NUM`: (undocumented yet)
41
40
 
42
41
  ## What is a TypeProf?
43
42
 
@@ -83,10 +83,11 @@ module TypeProf
83
83
  class StaticEnv
84
84
  include Utils::StructuralEquality
85
85
 
86
- def initialize(recv_ty, blk_ty, mod_func)
86
+ def initialize(recv_ty, blk_ty, mod_func, pub_meth)
87
87
  @recv_ty = recv_ty
88
88
  @blk_ty = blk_ty
89
89
  @mod_func = mod_func
90
+ @pub_meth = pub_meth
90
91
 
91
92
  return if recv_ty == :top #OK
92
93
  recv_ty.each_child_global do |ty|
@@ -94,13 +95,14 @@ module TypeProf
94
95
  end
95
96
  end
96
97
 
97
- attr_reader :recv_ty, :blk_ty, :mod_func
98
+ attr_reader :recv_ty, :blk_ty, :mod_func, :pub_meth
98
99
 
99
100
  def merge(other)
100
101
  recv_ty = @recv_ty.union(other.recv_ty)
101
102
  blk_ty = @blk_ty.union(other.blk_ty)
102
103
  mod_func = @mod_func & other.mod_func # ??
103
- StaticEnv.new(recv_ty, blk_ty, mod_func)
104
+ pub_meth = @pub_meth & other.pub_meth # ??
105
+ StaticEnv.new(recv_ty, blk_ty, mod_func, pub_meth)
104
106
  end
105
107
  end
106
108
 
@@ -185,29 +187,27 @@ module TypeProf
185
187
  Env.new(@static_env, Utils.array_update(@locals, idx, ty), @stack, @type_params)
186
188
  end
187
189
 
188
- def deploy_type(klass, alloc_site, elems, base_ty)
189
- local_ty = klass.new(alloc_site, base_ty)
190
- type_params = Utils::HashWrapper.new(@type_params.internal_hash.merge({ alloc_site => elems }))
191
- nenv = Env.new(@static_env, @locals, @stack, type_params)
192
- return nenv, local_ty
193
- end
194
-
195
190
  def get_container_elem_types(id)
196
191
  @type_params.internal_hash[id]
197
192
  end
198
193
 
199
- def update_container_elem_types(id, elems)
194
+ def deploy_type(id, elems)
200
195
  type_params = Utils::HashWrapper.new(@type_params.internal_hash.merge({ id => elems }))
201
196
  Env.new(@static_env, @locals, @stack, type_params)
202
197
  end
203
198
 
204
199
  def enable_module_function
205
- senv = StaticEnv.new(@static_env.recv_ty, @static_env.blk_ty, true)
200
+ senv = StaticEnv.new(@static_env.recv_ty, @static_env.blk_ty, true, @static_env.pub_meth)
201
+ Env.new(senv, @locals, @stack, @type_params)
202
+ end
203
+
204
+ def method_public_set(flag)
205
+ senv = StaticEnv.new(@static_env.recv_ty, @static_env.blk_ty, @static_env.mod_func, flag)
206
206
  Env.new(senv, @locals, @stack, @type_params)
207
207
  end
208
208
 
209
209
  def replace_recv_ty(ty)
210
- senv = StaticEnv.new(ty, @static_env.blk_ty, @static_env.mod_func)
210
+ senv = StaticEnv.new(ty, @static_env.blk_ty, @static_env.mod_func, @static_env.pub_meth)
211
211
  Env.new(senv, @locals, @stack, @type_params)
212
212
  end
213
213
 
@@ -252,6 +252,8 @@ module TypeProf
252
252
  @rbs_reader = RBSReader.new
253
253
 
254
254
  @terminated = false
255
+
256
+ @anonymous_struct_gen_id = 0
255
257
  end
256
258
 
257
259
  attr_reader :return_envs, :loaded_features, :rbs_reader
@@ -279,11 +281,10 @@ module TypeProf
279
281
  attr_reader :class_defs
280
282
 
281
283
  class ClassDef # or ModuleDef
282
- def initialize(kind, name, superclass, absolute_path)
284
+ def initialize(kind, name, absolute_path)
283
285
  raise unless name.is_a?(Array)
284
286
  @kind = kind
285
- @superclass = superclass
286
- @modules = { true => {}, false => {} }
287
+ @modules = { true => [], false => [] }
287
288
  @name = name
288
289
  @consts = {}
289
290
  @methods = {}
@@ -293,14 +294,16 @@ module TypeProf
293
294
  @namespace = nil
294
295
  end
295
296
 
296
- attr_reader :kind, :superclass, :modules, :consts, :methods, :ivars, :cvars, :absolute_path
297
+ attr_reader :kind, :modules, :consts, :methods, :ivars, :cvars, :absolute_path
297
298
  attr_accessor :name, :klass_obj
298
299
 
299
- def include_module(mod, singleton, absolute_path)
300
- # XXX: need to check if mod is already included by the ancestors?
301
- absolute_paths = @modules[singleton][mod]
302
- unless absolute_paths
303
- @modules[singleton][mod] = absolute_paths = Utils::MutableSet.new
300
+ def include_module(mod, type_args, singleton, absolute_path)
301
+ module_type_args, _, absolute_paths = @modules[singleton].find {|m,| m == mod }
302
+ if module_type_args
303
+ raise "inconsistent include/extend type args in RBS?" if module_type_args != type_args && type_args != [] && type_args != nil
304
+ else
305
+ absolute_paths = Utils::MutableSet.new
306
+ @modules[singleton].unshift([mod, type_args, absolute_paths])
304
307
  end
305
308
  absolute_paths << absolute_path
306
309
  end
@@ -317,13 +320,26 @@ module TypeProf
317
320
  @consts[name] = [ty, absolute_path]
318
321
  end
319
322
 
320
- def get_method(mid, singleton)
321
- @methods[[singleton, mid]] || begin
322
- @modules[singleton].each_key do |mod|
323
- meth = mod.get_method(mid, false)
324
- return meth if meth
323
+ def adjust_substitution(singleton, mid, mthd, subst, direct, &blk)
324
+ mthds = @methods[[singleton, mid]]
325
+ yield subst, direct if mthds&.include?(mthd)
326
+ @modules[singleton].each do |mod_def, type_args,|
327
+ if mod_def.klass_obj.type_params && type_args
328
+ subst2 = {}
329
+ mod_def.klass_obj.type_params.zip(type_args) do |(tyvar, *), tyarg|
330
+ tyvar = Type::Var.new(tyvar)
331
+ subst2[tyvar] = tyarg.substitute(subst, Config.options[:type_depth_limit])
332
+ end
333
+ mod_def.adjust_substitution(false, mid, mthd, subst2, false, &blk)
325
334
  end
326
- nil
335
+ end
336
+ end
337
+
338
+ def search_method(singleton, mid, &blk)
339
+ mthds = @methods[[singleton, mid]]
340
+ yield mthds, @klass_obj, singleton if mthds
341
+ @modules[singleton].each do |mod_def,|
342
+ mod_def.search_method(false, mid, &blk)
327
343
  end
328
344
  end
329
345
 
@@ -342,12 +358,16 @@ module TypeProf
342
358
  end
343
359
 
344
360
  def set_method(mid, singleton, mdef)
345
- @methods[[singleton, mid]] = Utils::MutableSet.new
346
- @methods[[singleton, mid]] << mdef
361
+ if mdef
362
+ @methods[[singleton, mid]] = Utils::MutableSet.new
363
+ @methods[[singleton, mid]] << mdef
364
+ else
365
+ @methods.delete([singleton, mid])
366
+ end
347
367
  end
348
368
  end
349
369
 
350
- def include_module(including_mod, included_mod, singleton, absolute_path)
370
+ def include_module(including_mod, included_mod, type_args, singleton, absolute_path)
351
371
  return if included_mod == Type.any
352
372
 
353
373
  including_mod = @class_defs[including_mod.idx]
@@ -355,7 +375,7 @@ module TypeProf
355
375
  if included_mod.is_a?(Type::Class)
356
376
  included_mod = @class_defs[included_mod.idx]
357
377
  if included_mod && included_mod.kind == :module
358
- including_mod.include_module(included_mod, singleton, absolute_path)
378
+ including_mod.include_module(included_mod, type_args, singleton, absolute_path)
359
379
  else
360
380
  warn "including something that is not a module"
361
381
  end
@@ -371,12 +391,7 @@ module TypeProf
371
391
  show_name = cbase_path(cbase) + [name]
372
392
  idx = @class_defs.size
373
393
  if superclass
374
- if superclass == :__root__
375
- superclass_idx = superclass = nil
376
- else
377
- superclass_idx = superclass.idx
378
- end
379
- @class_defs[idx] = ClassDef.new(:class, show_name, superclass_idx, absolute_path)
394
+ @class_defs[idx] = ClassDef.new(:class, show_name, absolute_path)
380
395
  klass = Type::Class.new(:class, idx, type_params, superclass, show_name)
381
396
  @class_defs[idx].klass_obj = klass
382
397
  cbase ||= klass # for bootstrap
@@ -384,7 +399,7 @@ module TypeProf
384
399
  return klass
385
400
  else
386
401
  # module
387
- @class_defs[idx] = ClassDef.new(:module, show_name, nil, absolute_path)
402
+ @class_defs[idx] = ClassDef.new(:module, show_name, absolute_path)
388
403
  mod = Type::Class.new(:module, idx, type_params, nil, show_name)
389
404
  @class_defs[idx].klass_obj = mod
390
405
  add_constant(cbase, name, mod, absolute_path)
@@ -392,13 +407,19 @@ module TypeProf
392
407
  end
393
408
  end
394
409
 
410
+ def add_superclass_type_args!(klass, tyargs)
411
+ klass.superclass_type_args = tyargs
412
+ end
413
+
395
414
  def new_struct(ep)
396
415
  return @struct_defs[ep] if @struct_defs[ep]
397
416
 
398
417
  idx = @class_defs.size
399
418
  superclass = Type::Builtin[:struct]
400
- @class_defs[idx] = ClassDef.new(:class, ["(Anonymous Struct)"], superclass.idx, ep.ctx.iseq.absolute_path)
401
- klass = Type::Class.new(:class, idx, [], superclass, "(Anonymous Struct)")
419
+ name = "AnonymousStruct_generated_#{ @anonymous_struct_gen_id += 1 }"
420
+ @class_defs[idx] = ClassDef.new(:class, [name], ep.ctx.iseq.absolute_path)
421
+ klass = Type::Class.new(:class, idx, [], superclass, name)
422
+ add_superclass_type_args!(klass, [Type.any])
402
423
  @class_defs[idx].klass_obj = klass
403
424
 
404
425
  @struct_defs[ep] = klass
@@ -428,28 +449,77 @@ module TypeProf
428
449
  end
429
450
  end
430
451
 
452
+ def adjust_substitution(klass, singleton, mid, mthd, subst, &blk)
453
+ direct = true
454
+ if klass.kind == :class
455
+ while klass != :__root__
456
+ class_def = @class_defs[klass.idx]
457
+ class_def.adjust_substitution(singleton, mid, mthd, subst, direct, &blk)
458
+ direct = false
459
+ if klass.superclass && klass.superclass_type_args
460
+ subst2 = {}
461
+ klass.superclass.type_params.zip(klass.superclass_type_args) do |(tyvar, *), tyarg|
462
+ tyvar = Type::Var.new(tyvar)
463
+ subst2[tyvar] = tyarg.substitute(subst, Config.options[:type_depth_limit])
464
+ end
465
+ subst = subst2
466
+ end
467
+ klass = klass.superclass
468
+ end
469
+ else
470
+ # module
471
+ class_def = @class_defs[klass.idx]
472
+ class_def.adjust_substitution(singleton, mid, mthd, subst, direct, &blk)
473
+ end
474
+ end
475
+
476
+ def search_method(klass, singleton, mid, &blk)
477
+ # XXX: support method alias correctly
478
+ klass_orig = klass
479
+ if klass.kind == :class
480
+ while klass != :__root__
481
+ class_def = @class_defs[klass.idx]
482
+ class_def.search_method(singleton, mid, &blk)
483
+ klass = klass.superclass
484
+ end
485
+ else
486
+ # module
487
+ class_def = @class_defs[klass.idx]
488
+ class_def.search_method(singleton, mid, &blk)
489
+ end
490
+ if singleton
491
+ search_method(Type::Builtin[klass_orig.kind], false, mid, &blk)
492
+ end
493
+ end
494
+
431
495
  def get_method(klass, singleton, mid)
432
- idx = klass.idx
433
- while idx
434
- class_def = @class_defs[idx]
435
- mthd = class_def.get_method(mid, singleton)
436
- # Need to be conservative to include all super candidates...?
437
- return mthd if mthd
438
- idx = class_def.superclass
496
+ search_method(klass, singleton, mid) {|mthds,| return mthds }
497
+ end
498
+
499
+ def get_all_super_methods(klass, singleton, current_klass, mid)
500
+ hit = false
501
+ search_method(klass, singleton, mid) do |mthds, klass0, singleton0|
502
+ yield mthds, klass0, singleton0 if hit
503
+ hit = klass0 == current_klass
439
504
  end
440
- return get_method(Type::Builtin[:class], false, mid) if singleton
441
- nil
442
505
  end
443
506
 
444
507
  def get_super_method(ctx, singleton)
445
- idx = ctx.cref.klass.idx
508
+ klass = ctx.cref.klass
446
509
  mid = ctx.mid
447
- idx = @class_defs[idx].superclass
448
- while idx
449
- class_def = @class_defs[idx]
510
+ if klass.kind == :class
511
+ klass = klass.superclass
512
+ while klass != :__root__
513
+ class_def = @class_defs[klass.idx]
514
+ mthd = class_def.get_method(mid, singleton)
515
+ return mthd if mthd
516
+ klass = klass.superclass
517
+ end
518
+ else
519
+ # module
520
+ class_def = @class_defs[klass.idx]
450
521
  mthd = class_def.get_method(mid, singleton)
451
522
  return mthd if mthd
452
- idx = class_def.superclass
453
523
  end
454
524
  nil
455
525
  end
@@ -505,12 +575,12 @@ module TypeProf
505
575
  end
506
576
  end
507
577
 
508
- def add_iseq_method(klass, mid, iseq, cref)
509
- add_method(klass, mid, false, ISeqMethodDef.new(iseq, cref))
578
+ def add_iseq_method(klass, mid, iseq, cref, outer_ep, pub_meth)
579
+ add_method(klass, mid, false, ISeqMethodDef.new(iseq, cref, outer_ep, pub_meth))
510
580
  end
511
581
 
512
- def add_singleton_iseq_method(klass, mid, iseq, cref)
513
- add_method(klass, mid, true, ISeqMethodDef.new(iseq, cref))
582
+ def add_singleton_iseq_method(klass, mid, iseq, cref, outer_ep, pub_meth)
583
+ add_method(klass, mid, true, ISeqMethodDef.new(iseq, cref, outer_ep, pub_meth))
514
584
  end
515
585
 
516
586
  def set_custom_method(klass, mid, impl)
@@ -719,7 +789,7 @@ module TypeProf
719
789
  merge_return_env(tmp_ep) do |menv|
720
790
  elems = menv.get_container_elem_types(id)
721
791
  elems = yield elems
722
- menv = menv.update_container_elem_types(id, elems)
792
+ menv = menv.deploy_type(id, elems)
723
793
  gid = @alloc_site_to_global_id[id]
724
794
  if gid
725
795
  ty = globalize_type(elems.to_local_type(id, base_type), env, ep)
@@ -731,7 +801,7 @@ module TypeProf
731
801
  else
732
802
  elems = env.get_container_elem_types(id)
733
803
  elems = yield elems
734
- env = env.update_container_elem_types(id, elems)
804
+ env = env.deploy_type(id, elems)
735
805
  gid = @alloc_site_to_global_id[id]
736
806
  if gid
737
807
  ty = globalize_type(elems.to_local_type(id, base_type), env, ep)
@@ -772,11 +842,11 @@ module TypeProf
772
842
  ep = @worklist.deletemin
773
843
 
774
844
  iter_counter += 1
775
- if Config.verbose >= 1
845
+ if Config.options[:show_indicator]
776
846
  tick2 = Time.now
777
847
  if tick2 - tick >= 1
778
848
  tick = tick2
779
- $stderr << "\rType Profiling... (%d steps @ %s)\e[K" % [iter_counter, ep.source_location]
849
+ $stderr << "\rType Profiling... (%d instructions @ %s)\e[K" % [iter_counter, ep.source_location]
780
850
  $stderr.flush
781
851
  end
782
852
  end
@@ -792,9 +862,7 @@ module TypeProf
792
862
 
793
863
  break if @terminated
794
864
 
795
- # XXX: it would be good to provide no-dummy-execution mode.
796
- # It should work as a bit smarter "rbs prototype rb";
797
- # show all method definitions as "untyped" arguments and return values
865
+ break unless Config.options[:stub_execution]
798
866
 
799
867
  begin
800
868
  iseq, (kind, dummy_continuation) = @pending_execution.first
@@ -819,7 +887,7 @@ module TypeProf
819
887
  end
820
888
  end
821
889
  end
822
- $stderr.print "\r\e[K" if Config.verbose >= 1
890
+ $stderr.print "\r\e[K" if Config.options[:show_indicator]
823
891
 
824
892
  stat_eps
825
893
  end
@@ -860,9 +928,9 @@ module TypeProf
860
928
  end
861
929
  end
862
930
 
863
- def pend_method_execution(iseq, meth, recv, mid, cref)
931
+ def pend_method_execution(iseq, meth, recv, mid, cref, ep)
864
932
  ctx = Context.new(iseq, cref, mid)
865
- ep = ExecutionPoint.new(ctx, 0, nil)
933
+ ep = ExecutionPoint.new(ctx, 0, ep)
866
934
  locals = [Type.nil] * iseq.locals.size
867
935
 
868
936
  fargs_format = iseq.fargs_format
@@ -897,9 +965,11 @@ module TypeProf
897
965
  locals[kwrest_index] = Type.any if kwrest_index
898
966
  locals[block_index] = Type.nil if block_index
899
967
 
900
- env = Env.new(StaticEnv.new(recv, Type.nil, false), locals, [], Utils::HashWrapper.new({}))
968
+ env = Env.new(StaticEnv.new(recv, Type.nil, false, true), locals, [], Utils::HashWrapper.new({}))
901
969
 
902
- @pending_execution[iseq] ||= [:method, [meth, ep, env]]
970
+ if !@pending_execution[iseq] || @pending_execution[iseq][0] == :block
971
+ @pending_execution[iseq] = [:method, [meth, ep, env]]
972
+ end
903
973
  end
904
974
 
905
975
  def pend_block_dummy_execution(blk, iseq, nep, nenv)
@@ -916,7 +986,7 @@ module TypeProf
916
986
  alloc_site = AllocationSite.new(ep)
917
987
  nenv, ty = localize_type(ty, env, ep, alloc_site)
918
988
  case ty
919
- when Type::LocalCell, Type::LocalArray, Type::LocalHash
989
+ when Type::Local
920
990
  @alloc_site_to_global_id[ty.id] = [recv, var] # need overwrite check??
921
991
  end
922
992
  yield ty, nenv
@@ -1082,31 +1152,7 @@ module TypeProf
1082
1152
 
1083
1153
  when :definemethod
1084
1154
  mid, iseq = operands
1085
- cref = ep.ctx.cref
1086
- recv = env.static_env.recv_ty
1087
- if cref.klass.is_a?(Type::Class)
1088
- typed_mdef = check_typed_method(cref.klass, mid, ep.ctx.cref.singleton)
1089
- recv = Type::Instance.new(recv) if recv.is_a?(Type::Class)
1090
- if typed_mdef
1091
- mdef = ISeqMethodDef.new(iseq, cref)
1092
- typed_mdef.each do |typed_mdef|
1093
- typed_mdef.do_match_iseq_mdef(mdef, recv, mid, env, ep, self)
1094
- end
1095
- else
1096
- if ep.ctx.cref.singleton
1097
- meth = add_singleton_iseq_method(cref.klass, mid, iseq, cref)
1098
- else
1099
- meth = add_iseq_method(cref.klass, mid, iseq, cref)
1100
- if env.static_env.mod_func
1101
- add_singleton_iseq_method(cref.klass, mid, iseq, cref)
1102
- end
1103
- end
1104
-
1105
- pend_method_execution(iseq, meth, recv, mid, ep.ctx.cref)
1106
- end
1107
- else
1108
- # XXX: what to do?
1109
- end
1155
+ do_define_iseq_method(ep, env, mid, iseq, nil)
1110
1156
 
1111
1157
  when :definesmethod
1112
1158
  mid, iseq = operands
@@ -1114,8 +1160,8 @@ module TypeProf
1114
1160
  cref = ep.ctx.cref
1115
1161
  recv.each_child do |recv|
1116
1162
  if recv.is_a?(Type::Class)
1117
- meth = add_singleton_iseq_method(recv, mid, iseq, cref)
1118
- pend_method_execution(iseq, meth, recv, mid, ep.ctx.cref)
1163
+ meth = add_singleton_iseq_method(recv, mid, iseq, cref, nil, env.static_env.pub_meth)
1164
+ pend_method_execution(iseq, meth, recv, mid, ep.ctx.cref, nil)
1119
1165
  else
1120
1166
  recv = Type.any # XXX: what to do?
1121
1167
  end
@@ -1132,35 +1178,30 @@ module TypeProf
1132
1178
  else
1133
1179
  if existing_klass != Type.any
1134
1180
  error(ep, "the class \"#{ id }\" is #{ existing_klass.screen_name(self) }")
1135
- id = :"#{ id }(dummy)"
1136
1181
  end
1137
- existing_klass = get_constant(cbase, id) # TODO: multiple return values
1138
- if existing_klass != Type.any
1139
- klass = existing_klass
1140
- else
1141
- if type == :class
1142
- if superclass.is_a?(Type::Class)
1143
- # okay
1144
- elsif superclass == Type.any
1145
- warn(ep, "superclass is any; Object is used instead")
1146
- superclass = Type::Builtin[:obj]
1147
- elsif superclass == Type.nil
1148
- superclass = Type::Builtin[:obj]
1149
- elsif superclass.is_a?(Type::Instance)
1150
- warn(ep, "superclass is an instance; Object is used instead")
1151
- superclass = Type::Builtin[:obj]
1152
- else
1153
- warn(ep, "superclass is not a class; Object is used instead")
1154
- superclass = Type::Builtin[:obj]
1155
- end
1156
- else # module
1157
- superclass = nil
1158
- end
1159
- if cbase == Type.any
1160
- klass = Type.any
1182
+ if type == :class
1183
+ if superclass.is_a?(Type::Class)
1184
+ # okay
1185
+ elsif superclass == Type.any
1186
+ warn(ep, "superclass is any; Object is used instead")
1187
+ superclass = Type::Builtin[:obj]
1188
+ elsif superclass == Type.nil
1189
+ superclass = Type::Builtin[:obj]
1190
+ elsif superclass.is_a?(Type::Instance)
1191
+ warn(ep, "superclass is an instance; Object is used instead")
1192
+ superclass = Type::Builtin[:obj]
1161
1193
  else
1162
- klass = new_class(cbase, id, [], superclass, ep.ctx.iseq.absolute_path)
1194
+ warn(ep, "superclass is not a class; Object is used instead")
1195
+ superclass = Type::Builtin[:obj]
1163
1196
  end
1197
+ else # module
1198
+ superclass = nil
1199
+ end
1200
+ if cbase == Type.any
1201
+ klass = Type.any
1202
+ else
1203
+ klass = new_class(cbase, id, [], superclass, ep.ctx.iseq.absolute_path)
1204
+ add_superclass_type_args!(klass, superclass.type_params.map { Type.any }) if superclass
1164
1205
  end
1165
1206
  end
1166
1207
  singleton = false
@@ -1182,7 +1223,7 @@ module TypeProf
1182
1223
  nctx = Context.new(iseq, ncref, nil)
1183
1224
  nep = ExecutionPoint.new(nctx, 0, nil)
1184
1225
  locals = [Type.nil] * iseq.locals.size
1185
- nenv = Env.new(StaticEnv.new(recv, blk, false), locals, [], Utils::HashWrapper.new({}))
1226
+ nenv = Env.new(StaticEnv.new(recv, blk, false, true), locals, [], Utils::HashWrapper.new({}))
1186
1227
  merge_env(nep, nenv)
1187
1228
  add_callsite!(nep.ctx, ep, env) do |ret_ty, ep, env|
1188
1229
  nenv, ret_ty = localize_type(ret_ty, env, ep)
@@ -1248,30 +1289,30 @@ module TypeProf
1248
1289
  end
1249
1290
  when :invokesuper
1250
1291
  env, recv, _, aargs = setup_actual_arguments(:method, operands, ep, env)
1251
-
1252
- env, recv = localize_type(env.static_env.recv_ty, env, ep)
1253
- mid = ep.ctx.mid
1254
- singleton = !recv.is_a?(Type::Instance) # TODO: any?
1255
- # XXX: need to support included module...
1256
- meths = get_super_method(ep.ctx, singleton) # TODO: multiple return values
1257
- if meths
1258
- meths.each do |meth|
1259
- # XXX: this decomposition is really needed??
1260
- # It calls `Object.new` with union receiver which causes an error, but
1261
- # it may be a fault of builtin Object.new implementation.
1262
- recv.each_child do |recv|
1263
- meth.do_send(recv, mid, aargs, ep, env, self) do |ret_ty, ep, env|
1264
- nenv, ret_ty, = localize_type(ret_ty, env, ep)
1265
- nenv = nenv.push(ret_ty)
1266
- merge_env(ep.next, nenv)
1292
+ mid = ep.ctx.mid
1293
+ found = false
1294
+ recv.each_child_global do |recv|
1295
+ klass, singleton = recv.method_dispatch_info
1296
+ next unless klass
1297
+ get_all_super_methods(klass, singleton, ep.ctx.cref.klass, ep.ctx.mid) do |meths, klass|
1298
+ found = true
1299
+ meths.each do |meth|
1300
+ # XXX: this decomposition is really needed??
1301
+ # It calls `Object.new` with union receiver which causes an error, but
1302
+ # it may be a fault of builtin Object.new implementation.
1303
+ recv.each_child do |recv|
1304
+ meth.do_send(recv, mid, aargs, ep, env, self) do |ret_ty, ep, env|
1305
+ nenv, ret_ty, = localize_type(ret_ty, env, ep)
1306
+ nenv = nenv.push(ret_ty)
1307
+ merge_env(ep.next, nenv)
1308
+ end
1267
1309
  end
1268
1310
  end
1269
1311
  end
1270
- return
1271
- else
1272
- error(ep, "no superclass method: #{ env.static_env.recv_ty.screen_name(self) }##{ mid }")
1273
- env = env.push(Type.any)
1274
1312
  end
1313
+ return if found
1314
+ error(ep, "no superclass method: #{ env.static_env.recv_ty.screen_name(self) }##{ mid }")
1315
+ env = env.push(Type.any)
1275
1316
  when :invokebuiltin
1276
1317
  raise NotImplementedError
1277
1318
  when :leave
@@ -1495,9 +1536,7 @@ module TypeProf
1495
1536
  ret_ty.each_child do |ret_ty|
1496
1537
  flow_env = env.local_update(-var_idx+2, ret_ty)
1497
1538
  ret_ty = ret_ty.base_type if ret_ty.is_a?(Type::Symbol)
1498
- ret_ty = ret_ty.base_type if ret_ty.is_a?(Type::LocalCell)
1499
- ret_ty = ret_ty.base_type if ret_ty.is_a?(Type::LocalArray)
1500
- ret_ty = ret_ty.base_type if ret_ty.is_a?(Type::LocalHash)
1539
+ ret_ty = ret_ty.base_type if ret_ty.is_a?(Type::Local)
1501
1540
  if ret_ty.is_a?(Type::Instance)
1502
1541
  if ret_ty.klass == pattern_ty # XXX: inheritance
1503
1542
  merge_env(branchtype == :if ? ep_else : ep_then, flow_env)
@@ -1663,9 +1702,13 @@ module TypeProf
1663
1702
  from_head = flag & 2 == 0
1664
1703
  ary.each_child do |ary|
1665
1704
  case ary
1666
- when Type::LocalArray
1667
- elems = get_container_elem_types(env, ep, ary.id)
1668
- elems ||= Type::Array::Elements.new([], Type.any) # XXX
1705
+ when Type::Local
1706
+ if ary.kind == Type::Array
1707
+ elems = get_container_elem_types(env, ep, ary.id)
1708
+ elems ||= Type::Array::Elements.new([], Type.any) # XXX
1709
+ else
1710
+ elems = Type::Array::Elements.new([], Type.any) # XXX
1711
+ end
1669
1712
  do_expand_array(ep, env, elems, num, splat, from_head)
1670
1713
  when Type::Any
1671
1714
  nnum = num
@@ -1685,9 +1728,9 @@ module TypeProf
1685
1728
  return
1686
1729
  when :concatarray
1687
1730
  env, (ary1, ary2) = env.pop(2)
1688
- if ary1.is_a?(Type::LocalArray)
1731
+ if ary1.is_a?(Type::Local) && ary1.kind == Type::Array
1689
1732
  elems1 = get_container_elem_types(env, ep, ary1.id)
1690
- if ary2.is_a?(Type::LocalArray)
1733
+ if ary2.is_a?(Type::Local) && ary2.kind == Type::Array
1691
1734
  elems2 = get_container_elem_types(env, ep, ary2.id)
1692
1735
  elems = Type::Array::Elements.new([], elems1.squash.union(elems2.squash))
1693
1736
  env = update_container_elem_types(env, ep, ary1.id, ary1.base_type) { elems }
@@ -1909,7 +1952,7 @@ module TypeProf
1909
1952
  nctx = Context.new(blk_iseq, ep.ctx.cref, ep.ctx.mid)
1910
1953
  nep = ExecutionPoint.new(nctx, 0, ep)
1911
1954
  nlocals = [Type.any] * blk_iseq.locals.size
1912
- nsenv = StaticEnv.new(env.static_env.recv_ty, Type.any, env.static_env.mod_func)
1955
+ nsenv = StaticEnv.new(env.static_env.recv_ty, Type.any, env.static_env.mod_func, env.static_env.pub_meth)
1913
1956
  nenv = Env.new(nsenv, nlocals, [], nil)
1914
1957
  pend_block_dummy_execution(blk_ty, blk_iseq, nep, nenv)
1915
1958
  merge_return_env(ep) {|tenv| tenv ? tenv.merge(env) : env }
@@ -1919,20 +1962,31 @@ module TypeProf
1919
1962
  end
1920
1963
 
1921
1964
  def do_send(recv, mid, aargs, ep, env, &ctn)
1922
- meths = recv.get_method(mid, self)
1923
- if meths
1924
- meths.each do |meth|
1925
- meth.do_send(recv, mid, aargs, ep, env, self, &ctn)
1926
- end
1965
+ case recv
1966
+ when Type::Void
1967
+ error(ep, "void's method is called: #{ globalize_type(recv, env, ep).screen_name(self) }##{ mid }")
1968
+ ctn[Type.any, ep, env]
1969
+ when Type::Any
1970
+ ctn[Type.any, ep, env]
1927
1971
  else
1928
- case recv
1929
- when Type::Void
1930
- error(ep, "void's method is called: #{ globalize_type(recv, env, ep).screen_name(self) }##{ mid }")
1931
- when Type::Any
1972
+ klass, singleton = recv.method_dispatch_info
1973
+ meths = get_method(klass, singleton, mid) if klass
1974
+ if meths
1975
+ meths.each do |meth|
1976
+ meth.do_send(recv, mid, aargs, ep, env, self, &ctn)
1977
+ end
1932
1978
  else
1933
- error(ep, "undefined method: #{ globalize_type(recv, env, ep).screen_name(self) }##{ mid }")
1979
+ meths = get_method(klass, singleton, :method_missing) if klass
1980
+ if meths
1981
+ aargs = aargs.for_method_missing(Type::Symbol.new(mid, Type::Instance.new(Type::Builtin[:sym])))
1982
+ meths.each do |meth|
1983
+ meth.do_send(recv, :method_missing, aargs, ep, env, self, &ctn)
1984
+ end
1985
+ else
1986
+ error(ep, "undefined method: #{ globalize_type(recv, env, ep).screen_name(self) }##{ mid }")
1987
+ ctn[Type.any, ep, env]
1988
+ end
1934
1989
  end
1935
- ctn[Type.any, ep, env]
1936
1990
  end
1937
1991
  end
1938
1992
 
@@ -1947,6 +2001,34 @@ module TypeProf
1947
2001
  end
1948
2002
  end
1949
2003
 
2004
+ def do_define_iseq_method(ep, env, mid, iseq, outer_ep)
2005
+ cref = ep.ctx.cref
2006
+ recv = env.static_env.recv_ty
2007
+ if cref.klass.is_a?(Type::Class)
2008
+ typed_mdef = check_typed_method(cref.klass, mid, ep.ctx.cref.singleton)
2009
+ recv = Type::Instance.new(recv) if recv.is_a?(Type::Class)
2010
+ if typed_mdef
2011
+ mdef = ISeqMethodDef.new(iseq, cref, outer_ep, env.static_env.pub_meth)
2012
+ typed_mdef.each do |typed_mdef|
2013
+ typed_mdef.do_match_iseq_mdef(mdef, recv, mid, env, ep, self)
2014
+ end
2015
+ else
2016
+ if ep.ctx.cref.singleton
2017
+ meth = add_singleton_iseq_method(cref.klass, mid, iseq, cref, outer_ep, true)
2018
+ else
2019
+ meth = add_iseq_method(cref.klass, mid, iseq, cref, outer_ep, env.static_env.pub_meth)
2020
+ if env.static_env.mod_func
2021
+ add_singleton_iseq_method(cref.klass, mid, iseq, cref, outer_ep, true)
2022
+ end
2023
+ end
2024
+
2025
+ pend_method_execution(iseq, meth, recv, mid, ep.ctx.cref, outer_ep)
2026
+ end
2027
+ else
2028
+ # XXX: what to do?
2029
+ end
2030
+ end
2031
+
1950
2032
  def show_block_signature(blks)
1951
2033
  bsig = nil
1952
2034
  ret_ty = Type.bot