typeprof 0.7.0 → 0.10.0

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.
Files changed (296) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +8 -5
  3. data/lib/typeprof/analyzer.rb +211 -98
  4. data/lib/typeprof/arguments.rb +2 -0
  5. data/lib/typeprof/block.rb +40 -2
  6. data/lib/typeprof/builtin.rb +301 -99
  7. data/lib/typeprof/cli.rb +2 -0
  8. data/lib/typeprof/config.rb +14 -2
  9. data/lib/typeprof/container-type.rb +5 -4
  10. data/lib/typeprof/export.rb +116 -65
  11. data/lib/typeprof/import.rb +68 -41
  12. data/lib/typeprof/iseq.rb +46 -11
  13. data/lib/typeprof/method.rb +47 -23
  14. data/lib/typeprof/type.rb +96 -18
  15. data/lib/typeprof/version.rb +1 -1
  16. data/smoke/alias.rb +5 -4
  17. data/smoke/alias2.rb +6 -4
  18. data/smoke/any1.rb +2 -1
  19. data/smoke/any2.rb +3 -2
  20. data/smoke/arguments.rb +3 -2
  21. data/smoke/arguments2.rb +11 -10
  22. data/smoke/array-each.rb +2 -1
  23. data/smoke/array-each2.rb +2 -1
  24. data/smoke/array-each3.rb +2 -1
  25. data/smoke/array-ltlt.rb +2 -1
  26. data/smoke/array-ltlt2.rb +2 -1
  27. data/smoke/array-map.rb +2 -1
  28. data/smoke/array-map2.rb +2 -1
  29. data/smoke/array-map3.rb +4 -3
  30. data/smoke/array-mul.rb +3 -2
  31. data/smoke/array-plus1.rb +2 -1
  32. data/smoke/array-plus2.rb +3 -2
  33. data/smoke/array-pop.rb +2 -1
  34. data/smoke/array-range-aref.rb +12 -11
  35. data/smoke/array-replace.rb +2 -1
  36. data/smoke/array-s-aref.rb +2 -1
  37. data/smoke/array1.rb +6 -5
  38. data/smoke/array10.rb +2 -1
  39. data/smoke/array11.rb +2 -1
  40. data/smoke/array12.rb +4 -3
  41. data/smoke/array13.rb +5 -4
  42. data/smoke/array14.rb +2 -1
  43. data/smoke/array15.rb +16 -0
  44. data/smoke/array2.rb +4 -3
  45. data/smoke/array3.rb +5 -4
  46. data/smoke/array4.rb +2 -1
  47. data/smoke/array5.rb +2 -1
  48. data/smoke/array6.rb +4 -2
  49. data/smoke/array7.rb +2 -1
  50. data/smoke/array8.rb +1 -1
  51. data/smoke/array9.rb +2 -1
  52. data/smoke/attr-module.rb +27 -0
  53. data/smoke/attr-vis.rb +43 -0
  54. data/smoke/attr-vis.rbs +4 -0
  55. data/smoke/attr.rb +5 -5
  56. data/smoke/autoload.rb +2 -1
  57. data/smoke/backtrace.rb +4 -3
  58. data/smoke/block-ambiguous.rb +9 -8
  59. data/smoke/block-args1-rest.rb +13 -11
  60. data/smoke/block-args1.rb +11 -10
  61. data/smoke/block-args2-rest.rb +13 -11
  62. data/smoke/block-args2.rb +11 -10
  63. data/smoke/block-args3-rest.rb +15 -13
  64. data/smoke/block-args3.rb +13 -12
  65. data/smoke/block-blockarg.rb +5 -4
  66. data/smoke/block-kwarg.rb +11 -10
  67. data/smoke/block1.rb +2 -1
  68. data/smoke/block10.rb +2 -1
  69. data/smoke/block11.rb +6 -5
  70. data/smoke/block12.rb +3 -2
  71. data/smoke/block14.rb +3 -2
  72. data/smoke/block2.rb +2 -1
  73. data/smoke/block3.rb +3 -3
  74. data/smoke/block4.rb +3 -2
  75. data/smoke/block5.rb +4 -2
  76. data/smoke/block6.rb +3 -2
  77. data/smoke/block7.rb +2 -1
  78. data/smoke/block8.rb +4 -3
  79. data/smoke/block9.rb +2 -1
  80. data/smoke/block_given.rb +37 -0
  81. data/smoke/blown.rb +2 -1
  82. data/smoke/break1.rb +3 -2
  83. data/smoke/break2.rb +2 -1
  84. data/smoke/break3.rb +13 -0
  85. data/smoke/case.rb +2 -1
  86. data/smoke/case2.rb +2 -1
  87. data/smoke/case3.rb +17 -0
  88. data/smoke/class-hierarchy.rb +5 -5
  89. data/smoke/class-hierarchy2.rb +3 -3
  90. data/smoke/class-new.rb +15 -0
  91. data/smoke/class_instance_var.rb +1 -1
  92. data/smoke/class_method.rb +2 -2
  93. data/smoke/class_method2.rb +2 -2
  94. data/smoke/class_method3.rb +4 -2
  95. data/smoke/constant1.rb +6 -6
  96. data/smoke/constant2.rb +6 -4
  97. data/smoke/constant3.rb +2 -1
  98. data/smoke/constant4.rb +2 -1
  99. data/smoke/context-sensitive1.rb +2 -1
  100. data/smoke/cvar.rb +7 -5
  101. data/smoke/cvar2.rb +2 -2
  102. data/smoke/define_method.rb +2 -2
  103. data/smoke/define_method2.rb +2 -2
  104. data/smoke/define_method3.rb +14 -0
  105. data/smoke/define_method3.rbs +3 -0
  106. data/smoke/define_method4.rb +15 -0
  107. data/smoke/define_method4.rbs +3 -0
  108. data/smoke/define_method5.rb +12 -0
  109. data/smoke/define_method6.rb +19 -0
  110. data/smoke/demo.rb +7 -6
  111. data/smoke/demo1.rb +2 -1
  112. data/smoke/demo10.rb +3 -2
  113. data/smoke/demo11.rb +2 -1
  114. data/smoke/demo2.rb +2 -1
  115. data/smoke/demo3.rb +2 -1
  116. data/smoke/demo4.rb +3 -3
  117. data/smoke/demo5.rb +1 -1
  118. data/smoke/demo6.rb +4 -3
  119. data/smoke/demo7.rb +2 -1
  120. data/smoke/demo8.rb +3 -2
  121. data/smoke/demo9.rb +4 -2
  122. data/smoke/dummy-execution1.rb +3 -2
  123. data/smoke/dummy-execution2.rb +2 -2
  124. data/smoke/dummy_element.rb +14 -0
  125. data/smoke/ensure1.rb +3 -2
  126. data/smoke/enum_for.rb +15 -0
  127. data/smoke/enum_for2.rb +17 -0
  128. data/smoke/enumerator.rb +3 -2
  129. data/smoke/expandarray1.rb +2 -1
  130. data/smoke/expandarray2.rb +2 -1
  131. data/smoke/fib.rb +2 -2
  132. data/smoke/flip-flop.rb +28 -0
  133. data/smoke/flow1.rb +2 -1
  134. data/smoke/flow10.rb +17 -0
  135. data/smoke/flow2.rb +2 -1
  136. data/smoke/flow3.rb +2 -1
  137. data/smoke/flow5.rb +2 -1
  138. data/smoke/flow6.rb +2 -1
  139. data/smoke/flow7.rb +2 -1
  140. data/smoke/flow8.rb +2 -1
  141. data/smoke/flow9.rb +12 -0
  142. data/smoke/freeze.rb +2 -1
  143. data/smoke/function.rb +3 -2
  144. data/smoke/gvar.rb +3 -2
  145. data/smoke/gvar2.rb +4 -3
  146. data/smoke/hash-bot.rb +12 -0
  147. data/smoke/hash-fetch.rb +4 -3
  148. data/smoke/hash-merge-bang.rb +2 -1
  149. data/smoke/hash1.rb +3 -2
  150. data/smoke/hash2.rb +2 -1
  151. data/smoke/hash3.rb +2 -1
  152. data/smoke/hash4.rb +2 -1
  153. data/smoke/hash5.rb +1 -1
  154. data/smoke/inheritance.rb +4 -4
  155. data/smoke/inheritance2.rb +2 -2
  156. data/smoke/initialize.rb +7 -5
  157. data/smoke/instance_eval.rb +2 -2
  158. data/smoke/instance_eval2.rb +10 -0
  159. data/smoke/instance_eval3.rb +25 -0
  160. data/smoke/int_times.rb +2 -1
  161. data/smoke/integer.rb +2 -1
  162. data/smoke/ivar.rb +6 -4
  163. data/smoke/ivar2.rb +4 -4
  164. data/smoke/ivar3.rb +4 -3
  165. data/smoke/ivar4.rb +21 -0
  166. data/smoke/kernel-class.rb +2 -1
  167. data/smoke/keyword1.rb +2 -1
  168. data/smoke/keyword2.rb +2 -1
  169. data/smoke/keyword3.rb +2 -1
  170. data/smoke/keyword4.rb +2 -1
  171. data/smoke/keyword5.rb +2 -1
  172. data/smoke/kwrest.rb +3 -2
  173. data/smoke/kwsplat1.rb +5 -4
  174. data/smoke/kwsplat2.rb +2 -1
  175. data/smoke/lit-complex.rb +10 -0
  176. data/smoke/lit-encoding.rb +10 -0
  177. data/smoke/manual-rbs.rb +6 -4
  178. data/smoke/manual-rbs2.rb +2 -1
  179. data/smoke/manual-rbs3.rb +3 -2
  180. data/smoke/masgn1.rb +2 -1
  181. data/smoke/masgn2.rb +3 -2
  182. data/smoke/masgn3.rb +2 -1
  183. data/smoke/method_in_branch.rb +4 -3
  184. data/smoke/method_missing.rb +5 -4
  185. data/smoke/module1.rb +2 -2
  186. data/smoke/module2.rb +1 -1
  187. data/smoke/module3.rb +3 -3
  188. data/smoke/module4.rb +3 -2
  189. data/smoke/module5.rb +17 -0
  190. data/smoke/module6.rb +40 -0
  191. data/smoke/module_function1.rb +4 -3
  192. data/smoke/module_function2.rb +4 -3
  193. data/smoke/multiple-include.rb +2 -1
  194. data/smoke/multiple-superclass.rb +1 -1
  195. data/smoke/next1.rb +3 -2
  196. data/smoke/next2.rb +2 -1
  197. data/smoke/object-send1.rb +4 -3
  198. data/smoke/object-send2.rb +10 -0
  199. data/smoke/object-send3.rb +18 -0
  200. data/smoke/once.rb +2 -1
  201. data/smoke/optional1.rb +2 -1
  202. data/smoke/optional2.rb +2 -1
  203. data/smoke/optional3.rb +2 -1
  204. data/smoke/parameterizedd-self.rb +4 -2
  205. data/smoke/parameterizedd-self2.rb +1 -1
  206. data/smoke/pathname1.rb +2 -1
  207. data/smoke/pathname2.rb +2 -1
  208. data/smoke/pattern-match1.rb +2 -1
  209. data/smoke/pattern-match2.rb +2 -1
  210. data/smoke/prepend1.rb +33 -0
  211. data/smoke/prepend2.rb +10 -0
  212. data/smoke/prepend2.rbs +9 -0
  213. data/smoke/primitive_method.rb +19 -0
  214. data/smoke/printf.rb +2 -2
  215. data/smoke/proc.rb +3 -2
  216. data/smoke/proc2.rb +2 -1
  217. data/smoke/proc3.rb +2 -1
  218. data/smoke/proc4.rb +2 -1
  219. data/smoke/proc5.rb +19 -0
  220. data/smoke/public.rb +38 -0
  221. data/smoke/range.rb +2 -1
  222. data/smoke/rbs-alias.rb +2 -1
  223. data/smoke/rbs-attr.rb +6 -5
  224. data/smoke/rbs-attr2.rb +1 -1
  225. data/smoke/rbs-extend.rb +2 -1
  226. data/smoke/rbs-interface.rb +5 -4
  227. data/smoke/rbs-module.rb +26 -0
  228. data/smoke/rbs-module.rbs +4 -0
  229. data/smoke/rbs-opt-and-rest.rb +10 -0
  230. data/smoke/rbs-opt-and-rest.rbs +3 -0
  231. data/smoke/rbs-proc1.rb +2 -1
  232. data/smoke/rbs-proc2.rb +3 -2
  233. data/smoke/rbs-proc3.rb +2 -1
  234. data/smoke/rbs-record.rb +3 -2
  235. data/smoke/rbs-tyvar.rb +3 -2
  236. data/smoke/rbs-tyvar2.rb +3 -2
  237. data/smoke/rbs-tyvar3.rb +3 -2
  238. data/smoke/rbs-tyvar4.rb +4 -3
  239. data/smoke/rbs-tyvar5.rb +2 -1
  240. data/smoke/rbs-tyvar6.rb +4 -3
  241. data/smoke/rbs-tyvar7.rb +2 -1
  242. data/smoke/rbs-vars.rb +7 -6
  243. data/smoke/redo1.rb +3 -2
  244. data/smoke/redo2.rb +3 -2
  245. data/smoke/req-keyword.rb +2 -1
  246. data/smoke/rescue1.rb +3 -2
  247. data/smoke/rescue2.rb +3 -2
  248. data/smoke/rescue3.rb +20 -0
  249. data/smoke/rescue4.rb +17 -0
  250. data/smoke/respond_to.rb +2 -1
  251. data/smoke/rest-farg.rb +2 -1
  252. data/smoke/rest1.rb +3 -2
  253. data/smoke/rest2.rb +2 -1
  254. data/smoke/rest3.rb +7 -6
  255. data/smoke/rest4.rb +3 -2
  256. data/smoke/rest5.rb +2 -1
  257. data/smoke/rest6.rb +2 -1
  258. data/smoke/retry1.rb +3 -2
  259. data/smoke/return.rb +2 -1
  260. data/smoke/simple.rb +12 -0
  261. data/smoke/singleton_method.rb +1 -1
  262. data/smoke/step.rb +4 -3
  263. data/smoke/string-split.rb +2 -1
  264. data/smoke/struct-keyword_init.rb +10 -0
  265. data/smoke/struct.rb +1 -1
  266. data/smoke/struct2.rb +5 -4
  267. data/smoke/struct3.rb +2 -2
  268. data/smoke/struct4.rb +7 -0
  269. data/smoke/struct5.rb +16 -0
  270. data/smoke/struct6.rb +15 -0
  271. data/smoke/struct7.rb +17 -0
  272. data/smoke/stub-keyword.rb +10 -0
  273. data/smoke/super1.rb +5 -4
  274. data/smoke/super2.rb +1 -1
  275. data/smoke/super3.rb +4 -3
  276. data/smoke/super4.rb +7 -5
  277. data/smoke/super5.rb +6 -4
  278. data/smoke/svar1.rb +2 -1
  279. data/smoke/symbol-proc-attr.rb +22 -0
  280. data/smoke/symbol-proc-attr2.rb +15 -0
  281. data/smoke/symbol-proc-bot.rb +13 -0
  282. data/smoke/symbol-proc.rb +4 -3
  283. data/smoke/tap1.rb +3 -2
  284. data/smoke/toplevel.rb +2 -1
  285. data/smoke/two-map.rb +3 -2
  286. data/smoke/type_var.rb +4 -3
  287. data/smoke/typed_method.rb +2 -1
  288. data/smoke/uninitialize-var.rb +2 -1
  289. data/smoke/union-recv.rb +2 -2
  290. data/smoke/user-demo.rb +3 -3
  291. data/smoke/wrong-extend.rb +3 -2
  292. data/smoke/wrong-include.rb +3 -2
  293. data/smoke/wrong-include2.rb +17 -0
  294. data/typeprof.gemspec +1 -1
  295. metadata +57 -5
  296. data/tools/stackprof-wrapper.rb +0 -10
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e8ecd99e5448a244b11714710dfbb5fd3f36274c5f72fa97da034059018fc32f
4
- data.tar.gz: ed322065cf15d08f7bb50105cce19d74d923d4d7af7f94a563668788849d636d
3
+ metadata.gz: 8d68099e4f5d60a45f949d6bfc3a47e8b7d3b7ba66a0794f25f5fe61628de1d1
4
+ data.tar.gz: 22792d1acb9b16a4150f1afbaf29d59987bf29772908b23075e6668df81a4309
5
5
  SHA512:
6
- metadata.gz: 528dcf83aa2ceec79ea602f3505eb48230baf87bae8409212f8f152b45e308c66490ff5d10a9153698870e02b0ee5f031ce81cbb48a4460187992269708957ef
7
- data.tar.gz: a03594cb0b6a88ba905dc860ba9de64beb82a6cb1ebc562aad94cf20ecf14e36534bbf8a29a0b629189c62c32c26437104acb4387159c17bb222c708614cc303
6
+ metadata.gz: 42faa4e3b5c64fd5976e66067bf13339c530785914caad77bc0a405939bc914e9adf78bfbd0aea57a829cb21aed3c6dfc09f8f57def85b09312facd82d33b5a9
7
+ data.tar.gz: bc6f115fbf1d5292286f04f09d745cfb0c13688a71fdae730d0cfdd903ad8f9f3f9019e532c37b4cf23fe41f39c9a1683f92f28af68716ddf7e625a0efca33f8
@@ -1,8 +1,8 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- typeprof (0.7.0)
5
- rbs (>= 0.17.0)
4
+ typeprof (0.10.0)
5
+ rbs (>= 0.20.1)
6
6
 
7
7
  GEM
8
8
  remote: https://rubygems.org/
@@ -11,17 +11,20 @@ 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.20.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
22
  test-unit (3.3.7)
21
23
  power_assert
22
24
 
23
25
  PLATFORMS
24
26
  ruby
27
+ x86_64-linux
25
28
 
26
29
  DEPENDENCIES
27
30
  coverage-helpers
@@ -33,4 +36,4 @@ DEPENDENCIES
33
36
  typeprof!
34
37
 
35
38
  BUNDLED WITH
36
- 2.2.0.rc.1
39
+ 2.2.1
@@ -34,6 +34,14 @@ module TypeProf
34
34
  end
35
35
 
36
36
  attr_reader :iseq, :cref, :mid
37
+
38
+ def source_location(pc)
39
+ if @iseq
40
+ @iseq.source_location(pc)
41
+ else
42
+ "<builtin>"
43
+ end
44
+ end
37
45
  end
38
46
 
39
47
  class TypedContext
@@ -45,6 +53,14 @@ module TypeProf
45
53
  end
46
54
 
47
55
  attr_reader :caller_ep, :mid
56
+
57
+ def source_location(_pc)
58
+ if @caller_ep
59
+ @caller_ep.source_location
60
+ else
61
+ "<typed-context:#{ @mid }>"
62
+ end
63
+ end
48
64
  end
49
65
 
50
66
  class ExecutionPoint
@@ -71,36 +87,33 @@ module TypeProf
71
87
  end
72
88
 
73
89
  def source_location
74
- iseq = @ctx.iseq
75
- if iseq
76
- iseq.source_location(@pc)
77
- else
78
- "<builtin>"
79
- end
90
+ @ctx.source_location(@pc)
80
91
  end
81
92
  end
82
93
 
83
94
  class StaticEnv
84
95
  include Utils::StructuralEquality
85
96
 
86
- def initialize(recv_ty, blk_ty, mod_func)
97
+ def initialize(recv_ty, blk_ty, mod_func, pub_meth)
87
98
  @recv_ty = recv_ty
88
99
  @blk_ty = blk_ty
89
100
  @mod_func = mod_func
101
+ @pub_meth = pub_meth
90
102
 
91
103
  return if recv_ty == :top #OK
92
104
  recv_ty.each_child_global do |ty|
93
- raise ty.inspect if !ty.is_a?(Type::Instance) && !ty.is_a?(Type::Class) && ty != Type.any
105
+ raise ty.inspect if !ty.is_a?(Type::Instance) && !ty.is_a?(Type::Class) && !ty.is_a?(Type::Symbol) && ty != Type.any
94
106
  end
95
107
  end
96
108
 
97
- attr_reader :recv_ty, :blk_ty, :mod_func
109
+ attr_reader :recv_ty, :blk_ty, :mod_func, :pub_meth
98
110
 
99
111
  def merge(other)
100
112
  recv_ty = @recv_ty.union(other.recv_ty)
101
113
  blk_ty = @blk_ty.union(other.blk_ty)
102
114
  mod_func = @mod_func & other.mod_func # ??
103
- StaticEnv.new(recv_ty, blk_ty, mod_func)
115
+ pub_meth = @pub_meth & other.pub_meth # ??
116
+ StaticEnv.new(recv_ty, blk_ty, mod_func, pub_meth)
104
117
  end
105
118
  end
106
119
 
@@ -195,12 +208,22 @@ module TypeProf
195
208
  end
196
209
 
197
210
  def enable_module_function
198
- senv = StaticEnv.new(@static_env.recv_ty, @static_env.blk_ty, true)
211
+ senv = StaticEnv.new(@static_env.recv_ty, @static_env.blk_ty, true, @static_env.pub_meth)
212
+ Env.new(senv, @locals, @stack, @type_params)
213
+ end
214
+
215
+ def method_public_set(flag)
216
+ senv = StaticEnv.new(@static_env.recv_ty, @static_env.blk_ty, @static_env.mod_func, flag)
199
217
  Env.new(senv, @locals, @stack, @type_params)
200
218
  end
201
219
 
202
220
  def replace_recv_ty(ty)
203
- senv = StaticEnv.new(ty, @static_env.blk_ty, @static_env.mod_func)
221
+ senv = StaticEnv.new(ty, @static_env.blk_ty, @static_env.mod_func, @static_env.pub_meth)
222
+ Env.new(senv, @locals, @stack, @type_params)
223
+ end
224
+
225
+ def replace_blk_ty(ty)
226
+ senv = StaticEnv.new(@static_env.recv_ty, ty, @static_env.mod_func, @static_env.pub_meth)
204
227
  Env.new(senv, @locals, @stack, @type_params)
205
228
  end
206
229
 
@@ -277,7 +300,10 @@ module TypeProf
277
300
  def initialize(kind, name, absolute_path)
278
301
  raise unless name.is_a?(Array)
279
302
  @kind = kind
280
- @modules = { true => [], false => [] }
303
+ @modules = {
304
+ :before => { true => [], false => [] }, # before = include/extend
305
+ :after => { true => [], false => [] }, # after = prepend
306
+ }
281
307
  @name = name
282
308
  @consts = {}
283
309
  @methods = {}
@@ -290,13 +316,13 @@ module TypeProf
290
316
  attr_reader :kind, :modules, :consts, :methods, :ivars, :cvars, :absolute_path
291
317
  attr_accessor :name, :klass_obj
292
318
 
293
- def include_module(mod, type_args, singleton, absolute_path)
294
- module_type_args, _, absolute_paths = @modules[singleton].find {|m,| m == mod }
295
- if module_type_args
296
- raise "inconsistent include/extend type args in RBS?" if module_type_args != type_args && type_args != [] && type_args != nil
319
+ def mix_module(kind, mod, type_args, singleton, absolute_path)
320
+ mod_, module_type_args, absolute_paths = @modules[kind][singleton].find {|m,| m == mod }
321
+ if mod_
322
+ raise "inconsistent #{ kind == :after ? "include/extend" : "prepend" } type args in RBS?" if module_type_args != type_args && type_args != [] && type_args != nil
297
323
  else
298
324
  absolute_paths = Utils::MutableSet.new
299
- @modules[singleton].unshift([mod, type_args, absolute_paths])
325
+ @modules[kind][singleton].unshift([mod, type_args, absolute_paths])
300
326
  end
301
327
  absolute_paths << absolute_path
302
328
  end
@@ -313,10 +339,8 @@ module TypeProf
313
339
  @consts[name] = [ty, absolute_path]
314
340
  end
315
341
 
316
- def adjust_substitution(singleton, mid, mthd, subst, direct, &blk)
317
- mthds = @methods[[singleton, mid]]
318
- yield subst, direct if mthds&.include?(mthd)
319
- @modules[singleton].each do |mod_def, type_args,|
342
+ def adjust_substitution_for_module(mods, mid, mthd, subst, &blk)
343
+ mods.each do |mod_def, type_args,|
320
344
  if mod_def.klass_obj.type_params && type_args
321
345
  subst2 = {}
322
346
  mod_def.klass_obj.type_params.zip(type_args) do |(tyvar, *), tyarg|
@@ -328,11 +352,29 @@ module TypeProf
328
352
  end
329
353
  end
330
354
 
331
- def search_method(singleton, mid, &blk)
355
+ def adjust_substitution(singleton, mid, mthd, subst, direct, &blk)
356
+ adjust_substitution_for_module(@modules[:before][singleton], mid, mthd, subst, &blk)
357
+
358
+ mthds = @methods[[singleton, mid]]
359
+ yield subst, direct if mthds&.include?(mthd)
360
+
361
+ adjust_substitution_for_module(@modules[:after][singleton], mid, mthd, subst, &blk)
362
+ end
363
+
364
+ def search_method(singleton, mid, visited, &blk)
365
+ # Currently, circular inclusion of modules is allowed
366
+ return if visited[self]
367
+ visited[self] = true
368
+
369
+ @modules[:before][singleton].each do |mod_def,|
370
+ mod_def.search_method(false, mid, visited, &blk)
371
+ end
372
+
332
373
  mthds = @methods[[singleton, mid]]
333
374
  yield mthds, @klass_obj, singleton if mthds
334
- @modules[singleton].each do |mod_def,|
335
- mod_def.search_method(false, mid, &blk)
375
+
376
+ @modules[:after][singleton].each do |mod_def,|
377
+ mod_def.search_method(false, mid, visited, &blk)
336
378
  end
337
379
  end
338
380
 
@@ -360,17 +402,17 @@ module TypeProf
360
402
  end
361
403
  end
362
404
 
363
- def include_module(including_mod, included_mod, type_args, singleton, absolute_path)
364
- return if included_mod == Type.any
405
+ def mix_module(kind, mixing_mod, mixed_mod, type_args, singleton, caller_ep)
406
+ return if mixed_mod == Type.any
365
407
 
366
- including_mod = @class_defs[including_mod.idx]
367
- included_mod.each_child do |included_mod|
368
- if included_mod.is_a?(Type::Class)
369
- included_mod = @class_defs[included_mod.idx]
370
- if included_mod && included_mod.kind == :module
371
- including_mod.include_module(included_mod, type_args, singleton, absolute_path)
408
+ mixing_mod = @class_defs[mixing_mod.idx]
409
+ mixed_mod.each_child do |mixed_mod|
410
+ if mixed_mod.is_a?(Type::Class)
411
+ mixed_mod = @class_defs[mixed_mod.idx]
412
+ if mixed_mod && mixed_mod.kind == :module
413
+ mixing_mod.mix_module(kind, mixed_mod, type_args, singleton, caller_ep ? caller_ep.ctx.iseq.absolute_path : nil)
372
414
  else
373
- warn "including something that is not a module"
415
+ warn(caller_ep, "attempted to #{ kind == :after ? "include/extend" : "prepend" } non-module; ignored")
374
416
  end
375
417
  end
376
418
  end
@@ -380,12 +422,12 @@ module TypeProf
380
422
  cbase && cbase.idx != 1 ? @class_defs[cbase.idx].name : []
381
423
  end
382
424
 
383
- def new_class(cbase, name, type_params, superclass, superclass_type_args, absolute_path)
425
+ def new_class(cbase, name, type_params, superclass, absolute_path)
384
426
  show_name = cbase_path(cbase) + [name]
385
427
  idx = @class_defs.size
386
428
  if superclass
387
429
  @class_defs[idx] = ClassDef.new(:class, show_name, absolute_path)
388
- klass = Type::Class.new(:class, idx, type_params, superclass, superclass_type_args, show_name)
430
+ klass = Type::Class.new(:class, idx, type_params, superclass, show_name)
389
431
  @class_defs[idx].klass_obj = klass
390
432
  cbase ||= klass # for bootstrap
391
433
  add_constant(cbase, name, klass, absolute_path)
@@ -393,13 +435,17 @@ module TypeProf
393
435
  else
394
436
  # module
395
437
  @class_defs[idx] = ClassDef.new(:module, show_name, absolute_path)
396
- mod = Type::Class.new(:module, idx, type_params, nil, nil, show_name)
438
+ mod = Type::Class.new(:module, idx, type_params, nil, show_name)
397
439
  @class_defs[idx].klass_obj = mod
398
440
  add_constant(cbase, name, mod, absolute_path)
399
441
  return mod
400
442
  end
401
443
  end
402
444
 
445
+ def add_superclass_type_args!(klass, tyargs)
446
+ klass.superclass_type_args = tyargs
447
+ end
448
+
403
449
  def new_struct(ep)
404
450
  return @struct_defs[ep] if @struct_defs[ep]
405
451
 
@@ -407,7 +453,8 @@ module TypeProf
407
453
  superclass = Type::Builtin[:struct]
408
454
  name = "AnonymousStruct_generated_#{ @anonymous_struct_gen_id += 1 }"
409
455
  @class_defs[idx] = ClassDef.new(:class, [name], ep.ctx.iseq.absolute_path)
410
- klass = Type::Class.new(:class, idx, [], superclass, [Type.any], name)
456
+ klass = Type::Class.new(:class, idx, [], superclass, name)
457
+ add_superclass_type_args!(klass, [Type.any])
411
458
  @class_defs[idx].klass_obj = klass
412
459
 
413
460
  @struct_defs[ep] = klass
@@ -467,13 +514,13 @@ module TypeProf
467
514
  if klass.kind == :class
468
515
  while klass != :__root__
469
516
  class_def = @class_defs[klass.idx]
470
- class_def.search_method(singleton, mid, &blk)
517
+ class_def.search_method(singleton, mid, {}, &blk)
471
518
  klass = klass.superclass
472
519
  end
473
520
  else
474
521
  # module
475
522
  class_def = @class_defs[klass.idx]
476
- class_def.search_method(singleton, mid, &blk)
523
+ class_def.search_method(singleton, mid, {}, &blk)
477
524
  end
478
525
  if singleton
479
526
  search_method(Type::Builtin[klass_orig.kind], false, mid, &blk)
@@ -533,9 +580,7 @@ module TypeProf
533
580
  end
534
581
 
535
582
  def add_constant(klass, name, value, user_defined)
536
- if klass == Type.any
537
- self
538
- else
583
+ if klass.is_a?(Type::Class)
539
584
  @class_defs[klass.idx].add_constant(name, value, user_defined)
540
585
  end
541
586
  end
@@ -554,39 +599,39 @@ module TypeProf
554
599
  mdef
555
600
  end
556
601
 
557
- def add_attr_method(klass, absolute_path, mid, ivar, kind)
602
+ def add_attr_method(klass, mid, ivar, kind, pub_meth, ep)
558
603
  if kind == :reader || kind == :accessor
559
- add_method(klass, mid, false, AttrMethodDef.new(ivar, :reader, absolute_path))
604
+ add_method(klass, mid, false, AttrMethodDef.new(ivar, :reader, pub_meth, ep))
560
605
  end
561
606
  if kind == :writer || kind == :accessor
562
- add_method(klass, :"#{ mid }=", false, AttrMethodDef.new(ivar, :writer, absolute_path))
607
+ add_method(klass, :"#{ mid }=", false, AttrMethodDef.new(ivar, :writer, pub_meth, ep))
563
608
  end
564
609
  end
565
610
 
566
- def add_iseq_method(klass, mid, iseq, cref, outer_ep)
567
- add_method(klass, mid, false, ISeqMethodDef.new(iseq, cref, outer_ep))
611
+ def add_iseq_method(klass, mid, iseq, cref, outer_ep, pub_meth)
612
+ add_method(klass, mid, false, ISeqMethodDef.new(iseq, cref, outer_ep, pub_meth))
568
613
  end
569
614
 
570
- def add_singleton_iseq_method(klass, mid, iseq, cref, outer_ep)
571
- add_method(klass, mid, true, ISeqMethodDef.new(iseq, cref, outer_ep))
615
+ def add_singleton_iseq_method(klass, mid, iseq, cref, outer_ep, pub_meth)
616
+ add_method(klass, mid, true, ISeqMethodDef.new(iseq, cref, outer_ep, pub_meth))
572
617
  end
573
618
 
574
- def set_custom_method(klass, mid, impl)
575
- set_method(klass, mid, false, CustomMethodDef.new(impl))
619
+ def set_custom_method(klass, mid, impl, pub_meth = true)
620
+ set_method(klass, mid, false, CustomMethodDef.new(impl, pub_meth))
576
621
  end
577
622
 
578
- def set_singleton_custom_method(klass, mid, impl)
579
- set_method(klass, mid, true, CustomMethodDef.new(impl))
623
+ def set_singleton_custom_method(klass, mid, impl, pub_meth = true)
624
+ set_method(klass, mid, true, CustomMethodDef.new(impl, pub_meth))
580
625
  end
581
626
 
582
- def alias_method(klass, singleton, new, old)
627
+ def alias_method(klass, singleton, alias_mid, orig_mid, ep)
583
628
  if klass == Type.any
584
629
  self
585
630
  else
586
- mdefs = get_method(klass, singleton, old)
631
+ mdefs = get_method(klass, singleton, orig_mid)
587
632
  if mdefs
588
633
  mdefs.each do |mdef|
589
- @class_defs[klass.idx].add_method(new, singleton, mdef)
634
+ @class_defs[klass.idx].add_method(alias_mid, singleton, AliasMethodDef.new(orig_mid, mdef, ep))
590
635
  end
591
636
  end
592
637
  end
@@ -601,6 +646,10 @@ module TypeProf
601
646
  @iseq_method_to_ctxs[iseq_mdef] << ctx
602
647
  end
603
648
 
649
+ def add_executed_iseq(iseq)
650
+ @executed_iseqs << iseq
651
+ end
652
+
604
653
  def add_callsite!(callee_ctx, caller_ep, caller_env, &ctn)
605
654
  @executed_iseqs << callee_ctx.iseq if callee_ctx.is_a?(Context)
606
655
 
@@ -660,8 +709,10 @@ module TypeProf
660
709
  def add_read!(site, ep, &ctn)
661
710
  entry = @tbl[site] ||= Entry.new(false, {}, Type.bot, Utils::MutableSet.new)
662
711
  entry.read_continuations[ep] = ctn
663
- entry.absolute_paths << ep.ctx.iseq.absolute_path
664
- ctn[entry.type, ep]
712
+ entry.absolute_paths << ep.ctx.iseq.absolute_path if ep.ctx.is_a?(Context)
713
+ ty = entry.type
714
+ ty = Type.nil if ty == Type.bot
715
+ ctn[ty, ep]
665
716
  end
666
717
 
667
718
  def add_write!(site, ty, ep, scratch)
@@ -669,7 +720,7 @@ module TypeProf
669
720
  if ep
670
721
  if entry.rbs_declared
671
722
  unless Type.match?(ty, entry.type)
672
- scratch.warn(ep, "inconsistent assignment to RBS-declared global variable")
723
+ scratch.warn(ep, "inconsistent assignment to RBS-declared variable")
673
724
  return
674
725
  end
675
726
  end
@@ -719,6 +770,7 @@ module TypeProf
719
770
 
720
771
  def add_cvar_read!(klass, var, ep, &ctn)
721
772
  klass.each_child do |klass|
773
+ next unless klass.is_a?(Type::Class)
722
774
  class_def = @class_defs[klass.idx]
723
775
  next unless class_def
724
776
  class_def.cvars.add_read!(var, ep, &ctn)
@@ -727,6 +779,7 @@ module TypeProf
727
779
 
728
780
  def add_cvar_write!(klass, var, ty, ep)
729
781
  klass.each_child do |klass|
782
+ next unless klass.is_a?(Type::Class)
730
783
  class_def = @class_defs[klass.idx]
731
784
  next unless class_def
732
785
  class_def.cvars.add_write!(var, ty, ep, self)
@@ -858,7 +911,7 @@ module TypeProf
858
911
  @pending_execution.delete(iseq)
859
912
  end while @executed_iseqs.include?(iseq)
860
913
 
861
- puts "DEBUG: trigger dummy execution (#{ iseq&.name || "(nil)" }): rest #{ @pending_execution.size }" if Config.verbose >= 2
914
+ puts "DEBUG: trigger stub execution (#{ iseq&.name || "(nil)" }): rest #{ @pending_execution.size }" if Config.verbose >= 2
862
915
 
863
916
  break if !iseq
864
917
  case kind
@@ -953,7 +1006,7 @@ module TypeProf
953
1006
  locals[kwrest_index] = Type.any if kwrest_index
954
1007
  locals[block_index] = Type.nil if block_index
955
1008
 
956
- env = Env.new(StaticEnv.new(recv, Type.nil, false), locals, [], Utils::HashWrapper.new({}))
1009
+ env = Env.new(StaticEnv.new(recv, Type.nil, false, true), locals, [], Utils::HashWrapper.new({}))
957
1010
 
958
1011
  if !@pending_execution[iseq] || @pending_execution[iseq][0] == :block
959
1012
  @pending_execution[iseq] = [:method, [meth, ep, env]]
@@ -962,10 +1015,14 @@ module TypeProf
962
1015
 
963
1016
  def pend_block_dummy_execution(blk, iseq, nep, nenv)
964
1017
  @pending_execution[iseq] ||= [:block, [blk, {}]]
965
- if @pending_execution[iseq][1][1][nep]
966
- @pending_execution[iseq][1][1][nep] = @pending_execution[iseq][1][1][nep].merge(nenv)
1018
+ if @pending_execution[iseq][0] == :block
1019
+ if @pending_execution[iseq][1][1][nep]
1020
+ @pending_execution[iseq][1][1][nep] = @pending_execution[iseq][1][1][nep].merge(nenv)
1021
+ else
1022
+ @pending_execution[iseq][1][1][nep] = nenv
1023
+ end
967
1024
  else
968
- @pending_execution[iseq][1][1][nep] = nenv
1025
+ # XXX: what to do?
969
1026
  end
970
1027
  end
971
1028
 
@@ -1014,9 +1071,9 @@ module TypeProf
1014
1071
  block_start = iseq.fargs_format[:block_start]
1015
1072
 
1016
1073
  lead_tys = env.locals[0, lead_num].map {|ty| globalize_type(ty, env, ep) }
1017
- opt_tys = opt.size > 1 ? env.locals[lead_num, opt.size - 1].map {|ty| globalize_type(ty, env, ep) } : nil
1074
+ opt_tys = opt.size > 1 ? env.locals[lead_num, opt.size - 1].map {|ty| globalize_type(ty, env, ep) } : []
1018
1075
  if rest_start # XXX:squash
1019
- ty = globalize_type(env.locals[lead_num + opt.size - 1], env, ep)
1076
+ ty = globalize_type(env.locals[rest_start], env, ep)
1020
1077
  rest_ty = Type.bot
1021
1078
  ty.each_child_global do |ty|
1022
1079
  if ty.is_a?(Type::Array)
@@ -1051,6 +1108,7 @@ module TypeProf
1051
1108
  end
1052
1109
  end
1053
1110
  kw_rest_ty = globalize_type(env.locals[kw_rest], env, ep) if kw_rest
1111
+ kw_rest_ty = nil if kw_rest_ty == Type.nil
1054
1112
  if block_start
1055
1113
  blk_ty = globalize_type(env.locals[block_start], env, ep)
1056
1114
  elsif iseq.type == :method
@@ -1148,7 +1206,7 @@ module TypeProf
1148
1206
  cref = ep.ctx.cref
1149
1207
  recv.each_child do |recv|
1150
1208
  if recv.is_a?(Type::Class)
1151
- meth = add_singleton_iseq_method(recv, mid, iseq, cref, nil)
1209
+ meth = add_singleton_iseq_method(recv, mid, iseq, cref, nil, env.static_env.pub_meth)
1152
1210
  pend_method_execution(iseq, meth, recv, mid, ep.ctx.cref, nil)
1153
1211
  else
1154
1212
  recv = Type.any # XXX: what to do?
@@ -1185,11 +1243,11 @@ module TypeProf
1185
1243
  else # module
1186
1244
  superclass = nil
1187
1245
  end
1188
- if cbase == Type.any
1189
- klass = Type.any
1246
+ if cbase.is_a?(Type::Class)
1247
+ klass = new_class(cbase, id, [], superclass, ep.ctx.iseq.absolute_path)
1248
+ add_superclass_type_args!(klass, superclass.type_params.map { Type.any }) if superclass
1190
1249
  else
1191
- superclass_type_args = superclass.type_params.map { Type.any } if superclass
1192
- klass = new_class(cbase, id, [], superclass, superclass_type_args, ep.ctx.iseq.absolute_path)
1250
+ klass = Type.any
1193
1251
  end
1194
1252
  end
1195
1253
  singleton = false
@@ -1211,7 +1269,7 @@ module TypeProf
1211
1269
  nctx = Context.new(iseq, ncref, nil)
1212
1270
  nep = ExecutionPoint.new(nctx, 0, nil)
1213
1271
  locals = [Type.nil] * iseq.locals.size
1214
- nenv = Env.new(StaticEnv.new(recv, blk, false), locals, [], Utils::HashWrapper.new({}))
1272
+ nenv = Env.new(StaticEnv.new(recv, blk, false, true), locals, [], Utils::HashWrapper.new({}))
1215
1273
  merge_env(nep, nenv)
1216
1274
  add_callsite!(nep.ctx, ep, env) do |ret_ty, ep, env|
1217
1275
  nenv, ret_ty = localize_type(ret_ty, env, ep)
@@ -1230,7 +1288,7 @@ module TypeProf
1230
1288
  end
1231
1289
  end
1232
1290
  return
1233
- when :send_branch
1291
+ when :getlocal_send_branch
1234
1292
  getlocal_operands, send_operands, branch_operands = operands
1235
1293
  env, recvs, mid, aargs = setup_actual_arguments(:method, send_operands, ep, env)
1236
1294
  recvs = Type.any if recvs == Type.bot
@@ -1258,6 +1316,31 @@ module TypeProf
1258
1316
  end
1259
1317
  end
1260
1318
  return
1319
+ when :send_branch
1320
+ send_operands, branch_operands = operands
1321
+ env, recvs, mid, aargs = setup_actual_arguments(:method, send_operands, ep, env)
1322
+ recvs = Type.any if recvs == Type.bot
1323
+ recvs.each_child do |recv|
1324
+ do_send(recv, mid, aargs, ep, env) do |ret_ty, ep, env|
1325
+ env, ret_ty, = localize_type(ret_ty, env, ep)
1326
+
1327
+ branchtype, target, = branch_operands
1328
+ # branchtype: :if or :unless or :nil
1329
+ ep_then = ep.next
1330
+ ep_else = ep.jump(target)
1331
+
1332
+ case ret_ty
1333
+ when Type::Instance.new(Type::Builtin[:true])
1334
+ merge_env(branchtype == :if ? ep_else : ep_then, env)
1335
+ when Type::Instance.new(Type::Builtin[:false])
1336
+ merge_env(branchtype == :if ? ep_then : ep_else, env)
1337
+ else
1338
+ merge_env(ep_then, env)
1339
+ merge_env(ep_else, env)
1340
+ end
1341
+ end
1342
+ end
1343
+ return
1261
1344
  when :invokeblock
1262
1345
  env, recvs, mid, aargs = setup_actual_arguments(:block, operands, ep, env)
1263
1346
  blk = env.static_env.blk_ty
@@ -1327,11 +1410,24 @@ module TypeProf
1327
1410
  return
1328
1411
  when :break
1329
1412
  tmp_ep = ep
1330
- tmp_ep = tmp_ep.outer while tmp_ep.ctx.iseq.type != :block
1331
- tmp_ep = tmp_ep.outer
1332
- nenv = @return_envs[tmp_ep].push(ty)
1333
- merge_env(tmp_ep.next, nenv)
1334
- # TODO: jump to ensure?
1413
+ while true
1414
+ if tmp_ep.ctx.iseq.type == :block
1415
+ tmp_ep = tmp_ep.outer
1416
+ nenv = @return_envs[tmp_ep].push(ty)
1417
+ merge_env(tmp_ep.next, nenv)
1418
+ break
1419
+ end
1420
+ _type, _iseq, cont, stack_depth = tmp_ep.ctx.iseq.catch_table[tmp_ep.pc]&.find {|type,| type == :break }
1421
+ if cont
1422
+ nenv = @return_envs[tmp_ep]
1423
+ nenv, = nenv.pop(nenv.stack.size - stack_depth)
1424
+ nenv = nenv.push(ty)
1425
+ tmp_ep = tmp_ep.jump(cont)
1426
+ merge_env(tmp_ep, nenv)
1427
+ break
1428
+ end
1429
+ tmp_ep = tmp_ep.outer
1430
+ end
1335
1431
  when :next, :redo
1336
1432
  # begin; rescue; next; end
1337
1433
  tmp_ep = ep.outer
@@ -1573,7 +1669,7 @@ module TypeProf
1573
1669
  warn(ep, "already initialized constant #{ Type::Instance.new(cbase).screen_name(self) }::#{ name }")
1574
1670
  end
1575
1671
  ty.each_child do |ty|
1576
- if ty.is_a?(Type::Class) && ty.superclass == Type::Builtin[:struct]
1672
+ if ty.is_a?(Type::Class) && cbase.is_a?(Type::Class) && ty.superclass == Type::Builtin[:struct]
1577
1673
  @class_defs[ty.idx].name = cbase_path(cbase) + [name]
1578
1674
  end
1579
1675
  end
@@ -1582,7 +1678,6 @@ module TypeProf
1582
1678
  when :getspecial
1583
1679
  key, type = operands
1584
1680
  if type == 0
1585
- raise NotImplementedError
1586
1681
  case key
1587
1682
  when 0 # VM_SVAR_LASTLINE
1588
1683
  env = env.push(Type.any) # or String | NilClass only?
@@ -1600,8 +1695,12 @@ module TypeProf
1600
1695
  return
1601
1696
  end
1602
1697
  when :setspecial
1603
- # flip-flop
1604
- raise NotImplementedError, "setspecial"
1698
+ key, = operands
1699
+ if key >= 2 # flip-flop
1700
+ env, = env.pop(1)
1701
+ else
1702
+ raise "unknown setspecial key: #{ key }"
1703
+ end
1605
1704
 
1606
1705
  when :dup
1607
1706
  env, (ty,) = env.pop(1)
@@ -1652,10 +1751,16 @@ module TypeProf
1652
1751
  env = env.push(Type.optional(sym_ty))
1653
1752
  when :checkmatch
1654
1753
  flag, = operands
1754
+
1755
+ # This flag means that the stack top is an array, and the check needs to be applied to find all elements
1756
+ # However, currently TypeProf uses very conservative interpretation (all check returns both true and false),
1757
+ # so we just ignore the flag now
1655
1758
  _array = flag & 4 != 0
1759
+
1656
1760
  case flag & 3
1657
- when 1
1658
- raise NotImplementedError
1761
+ when 1 # VM_CHECKMATCH_TYPE_WHEN
1762
+ env, = env.pop(2)
1763
+ env = env.push(Type.bool)
1659
1764
  when 2 # VM_CHECKMATCH_TYPE_CASE
1660
1765
  env, = env.pop(2)
1661
1766
  env = env.push(Type.bool)
@@ -1865,6 +1970,10 @@ module TypeProf
1865
1970
  rest_ty = aargs.last
1866
1971
  aargs = aargs[0..-2]
1867
1972
  if flag_args_kw_splat
1973
+ # XXX: The types contained in ActualArguments are expected to be all local types.
1974
+ # This "globalize_type" breaks the invariant, and violates the assertion of Union#globalize that asserts @elems be nil.
1975
+ # To fix this issue fundamentally, ActualArguments should keep all arguments as-is (as like the VM does),
1976
+ # and globalize some types on the on-demand bases.
1868
1977
  ty = globalize_type(rest_ty, env, ep)
1869
1978
  if ty.is_a?(Type::Array)
1870
1979
  _, (ty,) = ty.elems.take_last(1)
@@ -1897,6 +2006,10 @@ module TypeProf
1897
2006
  aargs = ActualArguments.new(aargs, rest_ty, kw_tys, blk_ty)
1898
2007
  elsif flag_args_kw_splat
1899
2008
  last = aargs.last
2009
+ # XXX: The types contained in ActualArguments are expected to be all local types.
2010
+ # This "globalize_type" breaks the invariant, and violates the assertion of Union#globalize that asserts @elems be nil.
2011
+ # To fix this issue fundamentally, ActualArguments should keep all arguments as-is (as like the VM does),
2012
+ # and globalize some types on the on-demand bases.
1900
2013
  ty = globalize_type(last, env, ep)
1901
2014
  case ty
1902
2015
  when Type::Hash
@@ -1940,7 +2053,7 @@ module TypeProf
1940
2053
  nctx = Context.new(blk_iseq, ep.ctx.cref, ep.ctx.mid)
1941
2054
  nep = ExecutionPoint.new(nctx, 0, ep)
1942
2055
  nlocals = [Type.any] * blk_iseq.locals.size
1943
- nsenv = StaticEnv.new(env.static_env.recv_ty, Type.any, env.static_env.mod_func)
2056
+ nsenv = StaticEnv.new(env.static_env.recv_ty, Type.any, env.static_env.mod_func, env.static_env.pub_meth)
1944
2057
  nenv = Env.new(nsenv, nlocals, [], nil)
1945
2058
  pend_block_dummy_execution(blk_ty, blk_iseq, nep, nenv)
1946
2059
  merge_return_env(ep) {|tenv| tenv ? tenv.merge(env) : env }
@@ -1991,27 +2104,27 @@ module TypeProf
1991
2104
 
1992
2105
  def do_define_iseq_method(ep, env, mid, iseq, outer_ep)
1993
2106
  cref = ep.ctx.cref
1994
- recv = env.static_env.recv_ty
1995
2107
  if cref.klass.is_a?(Type::Class)
1996
2108
  typed_mdef = check_typed_method(cref.klass, mid, ep.ctx.cref.singleton)
1997
- recv = Type::Instance.new(recv) if recv.is_a?(Type::Class)
2109
+ recv = cref.klass
2110
+ recv = Type::Instance.new(recv) unless ep.ctx.cref.singleton
1998
2111
  if typed_mdef
1999
- mdef = ISeqMethodDef.new(iseq, cref, outer_ep)
2112
+ mdef = ISeqMethodDef.new(iseq, cref, outer_ep, env.static_env.pub_meth)
2000
2113
  typed_mdef.each do |typed_mdef|
2001
2114
  typed_mdef.do_match_iseq_mdef(mdef, recv, mid, env, ep, self)
2002
2115
  end
2003
2116
  else
2004
2117
  if ep.ctx.cref.singleton
2005
- meth = add_singleton_iseq_method(cref.klass, mid, iseq, cref, outer_ep)
2118
+ meth = add_singleton_iseq_method(cref.klass, mid, iseq, cref, outer_ep, true)
2006
2119
  else
2007
- meth = add_iseq_method(cref.klass, mid, iseq, cref, outer_ep)
2120
+ meth = add_iseq_method(cref.klass, mid, iseq, cref, outer_ep, env.static_env.pub_meth)
2008
2121
  if env.static_env.mod_func
2009
- add_singleton_iseq_method(cref.klass, mid, iseq, cref, outer_ep)
2122
+ add_singleton_iseq_method(cref.klass, mid, iseq, cref, outer_ep, true)
2010
2123
  end
2011
2124
  end
2012
-
2013
- pend_method_execution(iseq, meth, recv, mid, ep.ctx.cref, outer_ep)
2014
2125
  end
2126
+
2127
+ pend_method_execution(iseq, meth, recv, mid, ep.ctx.cref, outer_ep)
2015
2128
  else
2016
2129
  # XXX: what to do?
2017
2130
  end
@@ -2040,7 +2153,7 @@ module TypeProf
2040
2153
 
2041
2154
  bsig ||= BlockSignature.new([], [], nil, Type.nil)
2042
2155
 
2043
- bsig = bsig.screen_name(self)#, block: true)
2156
+ bsig = bsig.screen_name(nil, self)
2044
2157
  ret_ty = ret_ty.screen_name(self)
2045
2158
  ret_ty = (ret_ty.include?("|") ? "(#{ ret_ty })" : ret_ty) # XXX?
2046
2159
 
@@ -2057,7 +2170,7 @@ module TypeProf
2057
2170
  next unless @block_to_ctx[blk.block_body] # this occurs when screen_name is called before type-profiling finished (e.g., error message)
2058
2171
  @block_to_ctx[blk.block_body].each do |blk_ctx|
2059
2172
  if farg_tys
2060
- farg_tys = farg_tys.merge(@method_signatures[blk_ctx])
2173
+ farg_tys = farg_tys.merge_as_block_arguments(@method_signatures[blk_ctx])
2061
2174
  else
2062
2175
  farg_tys = @method_signatures[blk_ctx]
2063
2176
  end
@@ -2067,7 +2180,7 @@ module TypeProf
2067
2180
  end
2068
2181
  end
2069
2182
 
2070
- farg_tys = farg_tys ? farg_tys.screen_name(self) : "(unknown)"
2183
+ farg_tys = farg_tys ? farg_tys.screen_name(nil, self) : "(unknown)"
2071
2184
  ret_ty = ret_ty.screen_name(self)
2072
2185
  ret_ty = (ret_ty.include?("|") ? "(#{ ret_ty })" : ret_ty) # XXX?
2073
2186
 
@@ -2079,7 +2192,7 @@ module TypeProf
2079
2192
  farg_tys = @method_signatures[ctx]
2080
2193
  ret_ty = @return_values[ctx] || Type.bot
2081
2194
 
2082
- farg_tys = farg_tys.screen_name(self)
2195
+ farg_tys = farg_tys.screen_name(ctx.iseq, self)
2083
2196
  ret_ty = ret_ty.screen_name(self)
2084
2197
  ret_ty = (ret_ty.include?("|") ? "(#{ ret_ty })" : ret_ty) # XXX?
2085
2198
  "#{ (farg_tys.empty? ? "" : "#{ farg_tys } ") }-> #{ ret_ty }"