typeprof 0.8.0 → 0.9.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 (281) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +3 -3
  3. data/lib/typeprof/analyzer.rb +96 -44
  4. data/lib/typeprof/arguments.rb +2 -0
  5. data/lib/typeprof/block.rb +6 -2
  6. data/lib/typeprof/builtin.rb +125 -62
  7. data/lib/typeprof/container-type.rb +5 -4
  8. data/lib/typeprof/export.rb +7 -7
  9. data/lib/typeprof/import.rb +14 -2
  10. data/lib/typeprof/iseq.rb +23 -7
  11. data/lib/typeprof/method.rb +13 -14
  12. data/lib/typeprof/type.rb +52 -2
  13. data/lib/typeprof/version.rb +1 -1
  14. data/smoke/alias.rb +4 -4
  15. data/smoke/alias2.rb +4 -4
  16. data/smoke/any1.rb +1 -1
  17. data/smoke/any2.rb +2 -2
  18. data/smoke/arguments.rb +2 -2
  19. data/smoke/arguments2.rb +10 -10
  20. data/smoke/array-each.rb +1 -1
  21. data/smoke/array-each2.rb +1 -1
  22. data/smoke/array-each3.rb +1 -1
  23. data/smoke/array-ltlt.rb +1 -1
  24. data/smoke/array-ltlt2.rb +1 -1
  25. data/smoke/array-map.rb +1 -1
  26. data/smoke/array-map2.rb +1 -1
  27. data/smoke/array-map3.rb +3 -3
  28. data/smoke/array-mul.rb +2 -2
  29. data/smoke/array-plus1.rb +1 -1
  30. data/smoke/array-plus2.rb +2 -2
  31. data/smoke/array-pop.rb +1 -1
  32. data/smoke/array-range-aref.rb +11 -11
  33. data/smoke/array-replace.rb +1 -1
  34. data/smoke/array-s-aref.rb +1 -1
  35. data/smoke/array1.rb +5 -5
  36. data/smoke/array10.rb +1 -1
  37. data/smoke/array11.rb +1 -1
  38. data/smoke/array12.rb +3 -3
  39. data/smoke/array13.rb +4 -4
  40. data/smoke/array14.rb +1 -1
  41. data/smoke/array15.rb +16 -0
  42. data/smoke/array2.rb +3 -3
  43. data/smoke/array3.rb +4 -4
  44. data/smoke/array4.rb +1 -1
  45. data/smoke/array5.rb +1 -1
  46. data/smoke/array6.rb +2 -2
  47. data/smoke/array7.rb +1 -1
  48. data/smoke/array8.rb +1 -1
  49. data/smoke/array9.rb +1 -1
  50. data/smoke/attr-module.rb +26 -0
  51. data/smoke/attr.rb +5 -5
  52. data/smoke/autoload.rb +1 -1
  53. data/smoke/backtrace.rb +3 -3
  54. data/smoke/block-ambiguous.rb +8 -8
  55. data/smoke/block-args1-rest.rb +11 -11
  56. data/smoke/block-args1.rb +10 -10
  57. data/smoke/block-args2-rest.rb +11 -11
  58. data/smoke/block-args2.rb +10 -10
  59. data/smoke/block-args3-rest.rb +13 -13
  60. data/smoke/block-args3.rb +12 -12
  61. data/smoke/block-blockarg.rb +4 -4
  62. data/smoke/block-kwarg.rb +10 -10
  63. data/smoke/block1.rb +1 -1
  64. data/smoke/block10.rb +1 -1
  65. data/smoke/block11.rb +5 -5
  66. data/smoke/block12.rb +2 -2
  67. data/smoke/block14.rb +2 -2
  68. data/smoke/block2.rb +1 -1
  69. data/smoke/block3.rb +3 -3
  70. data/smoke/block4.rb +2 -2
  71. data/smoke/block5.rb +2 -2
  72. data/smoke/block6.rb +2 -2
  73. data/smoke/block7.rb +1 -1
  74. data/smoke/block8.rb +3 -3
  75. data/smoke/block9.rb +1 -1
  76. data/smoke/blown.rb +1 -1
  77. data/smoke/break1.rb +2 -2
  78. data/smoke/break2.rb +1 -1
  79. data/smoke/break3.rb +13 -0
  80. data/smoke/case.rb +1 -1
  81. data/smoke/case2.rb +1 -1
  82. data/smoke/case3.rb +17 -0
  83. data/smoke/class-hierarchy.rb +5 -5
  84. data/smoke/class-hierarchy2.rb +3 -3
  85. data/smoke/class-new.rb +15 -0
  86. data/smoke/class_instance_var.rb +1 -1
  87. data/smoke/class_method.rb +2 -2
  88. data/smoke/class_method2.rb +2 -2
  89. data/smoke/class_method3.rb +2 -2
  90. data/smoke/constant1.rb +6 -6
  91. data/smoke/constant2.rb +4 -4
  92. data/smoke/constant3.rb +1 -1
  93. data/smoke/constant4.rb +1 -1
  94. data/smoke/context-sensitive1.rb +1 -1
  95. data/smoke/cvar.rb +5 -5
  96. data/smoke/cvar2.rb +2 -2
  97. data/smoke/define_method.rb +2 -2
  98. data/smoke/define_method2.rb +2 -2
  99. data/smoke/define_method3.rb +13 -0
  100. data/smoke/define_method3.rbs +3 -0
  101. data/smoke/define_method4.rb +15 -0
  102. data/smoke/define_method4.rbs +3 -0
  103. data/smoke/define_method5.rb +12 -0
  104. data/smoke/demo.rb +6 -6
  105. data/smoke/demo1.rb +1 -1
  106. data/smoke/demo10.rb +2 -2
  107. data/smoke/demo11.rb +1 -1
  108. data/smoke/demo2.rb +1 -1
  109. data/smoke/demo3.rb +1 -1
  110. data/smoke/demo4.rb +3 -3
  111. data/smoke/demo5.rb +1 -1
  112. data/smoke/demo6.rb +3 -3
  113. data/smoke/demo7.rb +1 -1
  114. data/smoke/demo8.rb +2 -2
  115. data/smoke/demo9.rb +2 -2
  116. data/smoke/dummy-execution1.rb +2 -2
  117. data/smoke/dummy-execution2.rb +2 -2
  118. data/smoke/dummy_element.rb +14 -0
  119. data/smoke/ensure1.rb +2 -2
  120. data/smoke/enumerator.rb +2 -2
  121. data/smoke/expandarray1.rb +1 -1
  122. data/smoke/expandarray2.rb +1 -1
  123. data/smoke/fib.rb +2 -2
  124. data/smoke/flip-flop.rb +28 -0
  125. data/smoke/flow1.rb +1 -1
  126. data/smoke/flow2.rb +1 -1
  127. data/smoke/flow3.rb +1 -1
  128. data/smoke/flow5.rb +1 -1
  129. data/smoke/flow6.rb +1 -1
  130. data/smoke/flow7.rb +1 -1
  131. data/smoke/flow8.rb +1 -1
  132. data/smoke/flow9.rb +12 -0
  133. data/smoke/freeze.rb +1 -1
  134. data/smoke/function.rb +2 -2
  135. data/smoke/gvar.rb +2 -2
  136. data/smoke/gvar2.rb +2 -2
  137. data/smoke/hash-bot.rb +12 -0
  138. data/smoke/hash-fetch.rb +3 -3
  139. data/smoke/hash-merge-bang.rb +1 -1
  140. data/smoke/hash1.rb +2 -2
  141. data/smoke/hash2.rb +1 -1
  142. data/smoke/hash3.rb +1 -1
  143. data/smoke/hash4.rb +1 -1
  144. data/smoke/hash5.rb +1 -1
  145. data/smoke/inheritance.rb +4 -4
  146. data/smoke/inheritance2.rb +2 -2
  147. data/smoke/initialize.rb +5 -5
  148. data/smoke/instance_eval.rb +2 -2
  149. data/smoke/instance_eval2.rb +10 -0
  150. data/smoke/instance_eval3.rb +25 -0
  151. data/smoke/int_times.rb +1 -1
  152. data/smoke/integer.rb +1 -1
  153. data/smoke/ivar.rb +4 -4
  154. data/smoke/ivar2.rb +4 -4
  155. data/smoke/ivar3.rb +2 -2
  156. data/smoke/kernel-class.rb +1 -1
  157. data/smoke/keyword1.rb +1 -1
  158. data/smoke/keyword2.rb +1 -1
  159. data/smoke/keyword3.rb +1 -1
  160. data/smoke/keyword4.rb +1 -1
  161. data/smoke/keyword5.rb +1 -1
  162. data/smoke/kwrest.rb +2 -2
  163. data/smoke/kwsplat1.rb +4 -4
  164. data/smoke/kwsplat2.rb +1 -1
  165. data/smoke/lit-complex.rb +10 -0
  166. data/smoke/lit-encoding.rb +10 -0
  167. data/smoke/manual-rbs.rb +3 -3
  168. data/smoke/manual-rbs2.rb +1 -1
  169. data/smoke/manual-rbs3.rb +2 -2
  170. data/smoke/masgn1.rb +1 -1
  171. data/smoke/masgn2.rb +2 -2
  172. data/smoke/masgn3.rb +1 -1
  173. data/smoke/method_in_branch.rb +2 -2
  174. data/smoke/method_missing.rb +4 -4
  175. data/smoke/module1.rb +2 -2
  176. data/smoke/module2.rb +1 -1
  177. data/smoke/module3.rb +2 -2
  178. data/smoke/module4.rb +2 -2
  179. data/smoke/module5.rb +17 -0
  180. data/smoke/module6.rb +40 -0
  181. data/smoke/module_function1.rb +3 -3
  182. data/smoke/module_function2.rb +3 -3
  183. data/smoke/multiple-include.rb +1 -1
  184. data/smoke/multiple-superclass.rb +1 -1
  185. data/smoke/next1.rb +2 -2
  186. data/smoke/next2.rb +1 -1
  187. data/smoke/object-send1.rb +3 -3
  188. data/smoke/object-send2.rb +10 -0
  189. data/smoke/object-send3.rb +18 -0
  190. data/smoke/once.rb +1 -1
  191. data/smoke/optional1.rb +1 -1
  192. data/smoke/optional2.rb +1 -1
  193. data/smoke/optional3.rb +1 -1
  194. data/smoke/parameterizedd-self.rb +2 -2
  195. data/smoke/parameterizedd-self2.rb +1 -1
  196. data/smoke/pathname1.rb +1 -1
  197. data/smoke/pathname2.rb +1 -1
  198. data/smoke/pattern-match1.rb +1 -1
  199. data/smoke/pattern-match2.rb +1 -1
  200. data/smoke/printf.rb +2 -2
  201. data/smoke/proc.rb +2 -2
  202. data/smoke/proc2.rb +1 -1
  203. data/smoke/proc3.rb +1 -1
  204. data/smoke/proc4.rb +1 -1
  205. data/smoke/proc5.rb +19 -0
  206. data/smoke/public.rb +34 -0
  207. data/smoke/range.rb +1 -1
  208. data/smoke/rbs-alias.rb +1 -1
  209. data/smoke/rbs-attr.rb +3 -3
  210. data/smoke/rbs-attr2.rb +1 -1
  211. data/smoke/rbs-extend.rb +1 -1
  212. data/smoke/rbs-interface.rb +4 -4
  213. data/smoke/rbs-module.rb +26 -0
  214. data/smoke/rbs-module.rbs +4 -0
  215. data/smoke/rbs-opt-and-rest.rb +10 -0
  216. data/smoke/rbs-opt-and-rest.rbs +3 -0
  217. data/smoke/rbs-proc1.rb +1 -1
  218. data/smoke/rbs-proc2.rb +2 -2
  219. data/smoke/rbs-proc3.rb +1 -1
  220. data/smoke/rbs-record.rb +2 -2
  221. data/smoke/rbs-tyvar.rb +2 -2
  222. data/smoke/rbs-tyvar2.rb +2 -2
  223. data/smoke/rbs-tyvar3.rb +2 -2
  224. data/smoke/rbs-tyvar4.rb +3 -3
  225. data/smoke/rbs-tyvar5.rb +1 -1
  226. data/smoke/rbs-tyvar6.rb +3 -3
  227. data/smoke/rbs-tyvar7.rb +1 -1
  228. data/smoke/rbs-vars.rb +6 -6
  229. data/smoke/redo1.rb +2 -2
  230. data/smoke/redo2.rb +2 -2
  231. data/smoke/req-keyword.rb +1 -1
  232. data/smoke/rescue1.rb +2 -2
  233. data/smoke/rescue2.rb +2 -2
  234. data/smoke/rescue3.rb +19 -0
  235. data/smoke/rescue4.rb +17 -0
  236. data/smoke/respond_to.rb +1 -1
  237. data/smoke/rest-farg.rb +1 -1
  238. data/smoke/rest1.rb +2 -2
  239. data/smoke/rest2.rb +1 -1
  240. data/smoke/rest3.rb +6 -6
  241. data/smoke/rest4.rb +2 -2
  242. data/smoke/rest5.rb +1 -1
  243. data/smoke/rest6.rb +1 -1
  244. data/smoke/retry1.rb +2 -2
  245. data/smoke/return.rb +1 -1
  246. data/smoke/singleton_method.rb +1 -1
  247. data/smoke/step.rb +3 -3
  248. data/smoke/string-split.rb +1 -1
  249. data/smoke/struct-keyword_init.rb +20 -0
  250. data/smoke/struct.rb +1 -1
  251. data/smoke/struct2.rb +4 -4
  252. data/smoke/struct3.rb +2 -2
  253. data/smoke/struct4.rb +7 -0
  254. data/smoke/struct5.rb +16 -0
  255. data/smoke/struct6.rb +15 -0
  256. data/smoke/struct7.rb +17 -0
  257. data/smoke/stub-keyword.rb +10 -0
  258. data/smoke/super1.rb +4 -4
  259. data/smoke/super2.rb +1 -1
  260. data/smoke/super3.rb +3 -3
  261. data/smoke/super4.rb +5 -5
  262. data/smoke/super5.rb +4 -4
  263. data/smoke/svar1.rb +1 -1
  264. data/smoke/symbol-proc-attr.rb +22 -0
  265. data/smoke/symbol-proc-attr2.rb +15 -0
  266. data/smoke/symbol-proc-bot.rb +13 -0
  267. data/smoke/symbol-proc.rb +3 -3
  268. data/smoke/tap1.rb +2 -2
  269. data/smoke/toplevel.rb +1 -1
  270. data/smoke/two-map.rb +2 -2
  271. data/smoke/type_var.rb +1 -1
  272. data/smoke/typed_method.rb +1 -1
  273. data/smoke/uninitialize-var.rb +1 -1
  274. data/smoke/union-recv.rb +2 -2
  275. data/smoke/user-demo.rb +3 -3
  276. data/smoke/wrong-extend.rb +2 -2
  277. data/smoke/wrong-include.rb +2 -2
  278. data/smoke/wrong-include2.rb +17 -0
  279. data/typeprof.gemspec +1 -1
  280. metadata +44 -5
  281. data/tools/stackprof-wrapper.rb +0 -10
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: dd38b5e501a5d4fbe4db1ad43015c44ab39dbfefc3f7638516faeb5bcafd21a9
4
- data.tar.gz: 000f140ab750e4ddd57863851c21a830bfe470c0eb7be9e38442ca535f4ef041
3
+ metadata.gz: 1c3bf54ec6fee3b06397893d2f10f1fae8e7af82b8f1640a4ddd305c33922ff7
4
+ data.tar.gz: 944d40a75789b4805e53ca70e169fe68fcd4dbca7f24bc4ccc779964085e980d
5
5
  SHA512:
6
- metadata.gz: '00924963d5f91c4609224615507fcfb240a140c8119bf76f24aa28973342e6b61c528fc579781690f9f0392bf0d125c8bdb70499525791603c111ed9251da931'
7
- data.tar.gz: ee07e0636cd3e26271c468e1927e676a1b320ddefe13dc2412c254cac9aaeac7ca5db1936a26ccc477c2494473fde1d2bdde7a28bd1fa384c6995d7ae4d085ea
6
+ metadata.gz: 726cdbfcda694f189a96f3f35088cbcbd9a3064e79e3838f7758d7bc393bf8591c0559db1c17993f971f9ae2ee4ca3b4c09f5c0ef6d6675752b00b6948cdfe62
7
+ data.tar.gz: b2b7353855183df391d8bc78c247eb7de09c1b65b2753789eb1e1fb0208275d10fec6d2d95745f36771de30af5e32281476100a0654db6f7cf87c8e442b36a65
@@ -1,8 +1,8 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- typeprof (0.8.0)
5
- rbs (>= 0.17.0)
4
+ typeprof (0.9.0)
5
+ rbs (>= 0.20.0)
6
6
 
7
7
  GEM
8
8
  remote: https://rubygems.org/
@@ -11,7 +11,7 @@ GEM
11
11
  docile (1.3.2)
12
12
  power_assert (1.2.0)
13
13
  rake (13.0.1)
14
- rbs (0.18.1)
14
+ rbs (0.20.1)
15
15
  simplecov (0.20.0)
16
16
  docile (~> 1.1)
17
17
  simplecov-html (~> 0.11)
@@ -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,12 +87,7 @@ 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
 
@@ -91,7 +102,7 @@ module TypeProf
91
102
 
92
103
  return if recv_ty == :top #OK
93
104
  recv_ty.each_child_global do |ty|
94
- 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
95
106
  end
96
107
  end
97
108
 
@@ -298,8 +309,8 @@ module TypeProf
298
309
  attr_accessor :name, :klass_obj
299
310
 
300
311
  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
312
+ mod_, module_type_args, absolute_paths = @modules[singleton].find {|m,| m == mod }
313
+ if mod_
303
314
  raise "inconsistent include/extend type args in RBS?" if module_type_args != type_args && type_args != [] && type_args != nil
304
315
  else
305
316
  absolute_paths = Utils::MutableSet.new
@@ -335,11 +346,14 @@ module TypeProf
335
346
  end
336
347
  end
337
348
 
338
- def search_method(singleton, mid, &blk)
349
+ def search_method(singleton, mid, visited, &blk)
350
+ # Currently, circular inclusion of modules is allowed
351
+ return if visited[self]
352
+ visited[self] = true
339
353
  mthds = @methods[[singleton, mid]]
340
354
  yield mthds, @klass_obj, singleton if mthds
341
355
  @modules[singleton].each do |mod_def,|
342
- mod_def.search_method(false, mid, &blk)
356
+ mod_def.search_method(false, mid, visited, &blk)
343
357
  end
344
358
  end
345
359
 
@@ -367,7 +381,7 @@ module TypeProf
367
381
  end
368
382
  end
369
383
 
370
- def include_module(including_mod, included_mod, type_args, singleton, absolute_path)
384
+ def include_module(including_mod, included_mod, type_args, singleton, caller_ep)
371
385
  return if included_mod == Type.any
372
386
 
373
387
  including_mod = @class_defs[including_mod.idx]
@@ -375,9 +389,9 @@ module TypeProf
375
389
  if included_mod.is_a?(Type::Class)
376
390
  included_mod = @class_defs[included_mod.idx]
377
391
  if included_mod && included_mod.kind == :module
378
- including_mod.include_module(included_mod, type_args, singleton, absolute_path)
392
+ including_mod.include_module(included_mod, type_args, singleton, caller_ep ? caller_ep.ctx.iseq.absolute_path : nil)
379
393
  else
380
- warn "including something that is not a module"
394
+ warn(caller_ep, "including something that is not a module")
381
395
  end
382
396
  end
383
397
  end
@@ -479,13 +493,13 @@ module TypeProf
479
493
  if klass.kind == :class
480
494
  while klass != :__root__
481
495
  class_def = @class_defs[klass.idx]
482
- class_def.search_method(singleton, mid, &blk)
496
+ class_def.search_method(singleton, mid, {}, &blk)
483
497
  klass = klass.superclass
484
498
  end
485
499
  else
486
500
  # module
487
501
  class_def = @class_defs[klass.idx]
488
- class_def.search_method(singleton, mid, &blk)
502
+ class_def.search_method(singleton, mid, {}, &blk)
489
503
  end
490
504
  if singleton
491
505
  search_method(Type::Builtin[klass_orig.kind], false, mid, &blk)
@@ -545,9 +559,7 @@ module TypeProf
545
559
  end
546
560
 
547
561
  def add_constant(klass, name, value, user_defined)
548
- if klass == Type.any
549
- self
550
- else
562
+ if klass.is_a?(Type::Class)
551
563
  @class_defs[klass.idx].add_constant(name, value, user_defined)
552
564
  end
553
565
  end
@@ -613,6 +625,10 @@ module TypeProf
613
625
  @iseq_method_to_ctxs[iseq_mdef] << ctx
614
626
  end
615
627
 
628
+ def add_executed_iseq(iseq)
629
+ @executed_iseqs << iseq
630
+ end
631
+
616
632
  def add_callsite!(callee_ctx, caller_ep, caller_env, &ctn)
617
633
  @executed_iseqs << callee_ctx.iseq if callee_ctx.is_a?(Context)
618
634
 
@@ -672,7 +688,7 @@ module TypeProf
672
688
  def add_read!(site, ep, &ctn)
673
689
  entry = @tbl[site] ||= Entry.new(false, {}, Type.bot, Utils::MutableSet.new)
674
690
  entry.read_continuations[ep] = ctn
675
- entry.absolute_paths << ep.ctx.iseq.absolute_path
691
+ entry.absolute_paths << ep.ctx.iseq.absolute_path if ep.ctx.is_a?(Context)
676
692
  ctn[entry.type, ep]
677
693
  end
678
694
 
@@ -731,6 +747,7 @@ module TypeProf
731
747
 
732
748
  def add_cvar_read!(klass, var, ep, &ctn)
733
749
  klass.each_child do |klass|
750
+ next unless klass.is_a?(Type::Class)
734
751
  class_def = @class_defs[klass.idx]
735
752
  next unless class_def
736
753
  class_def.cvars.add_read!(var, ep, &ctn)
@@ -739,6 +756,7 @@ module TypeProf
739
756
 
740
757
  def add_cvar_write!(klass, var, ty, ep)
741
758
  klass.each_child do |klass|
759
+ next unless klass.is_a?(Type::Class)
742
760
  class_def = @class_defs[klass.idx]
743
761
  next unless class_def
744
762
  class_def.cvars.add_write!(var, ty, ep, self)
@@ -870,7 +888,7 @@ module TypeProf
870
888
  @pending_execution.delete(iseq)
871
889
  end while @executed_iseqs.include?(iseq)
872
890
 
873
- puts "DEBUG: trigger dummy execution (#{ iseq&.name || "(nil)" }): rest #{ @pending_execution.size }" if Config.verbose >= 2
891
+ puts "DEBUG: trigger stub execution (#{ iseq&.name || "(nil)" }): rest #{ @pending_execution.size }" if Config.verbose >= 2
874
892
 
875
893
  break if !iseq
876
894
  case kind
@@ -974,10 +992,14 @@ module TypeProf
974
992
 
975
993
  def pend_block_dummy_execution(blk, iseq, nep, nenv)
976
994
  @pending_execution[iseq] ||= [:block, [blk, {}]]
977
- if @pending_execution[iseq][1][1][nep]
978
- @pending_execution[iseq][1][1][nep] = @pending_execution[iseq][1][1][nep].merge(nenv)
995
+ if @pending_execution[iseq][0] == :block
996
+ if @pending_execution[iseq][1][1][nep]
997
+ @pending_execution[iseq][1][1][nep] = @pending_execution[iseq][1][1][nep].merge(nenv)
998
+ else
999
+ @pending_execution[iseq][1][1][nep] = nenv
1000
+ end
979
1001
  else
980
- @pending_execution[iseq][1][1][nep] = nenv
1002
+ # XXX: what to do?
981
1003
  end
982
1004
  end
983
1005
 
@@ -1026,7 +1048,7 @@ module TypeProf
1026
1048
  block_start = iseq.fargs_format[:block_start]
1027
1049
 
1028
1050
  lead_tys = env.locals[0, lead_num].map {|ty| globalize_type(ty, env, ep) }
1029
- opt_tys = opt.size > 1 ? env.locals[lead_num, opt.size - 1].map {|ty| globalize_type(ty, env, ep) } : nil
1051
+ opt_tys = opt.size > 1 ? env.locals[lead_num, opt.size - 1].map {|ty| globalize_type(ty, env, ep) } : []
1030
1052
  if rest_start # XXX:squash
1031
1053
  ty = globalize_type(env.locals[lead_num + opt.size - 1], env, ep)
1032
1054
  rest_ty = Type.bot
@@ -1197,11 +1219,11 @@ module TypeProf
1197
1219
  else # module
1198
1220
  superclass = nil
1199
1221
  end
1200
- if cbase == Type.any
1201
- klass = Type.any
1202
- else
1222
+ if cbase.is_a?(Type::Class)
1203
1223
  klass = new_class(cbase, id, [], superclass, ep.ctx.iseq.absolute_path)
1204
1224
  add_superclass_type_args!(klass, superclass.type_params.map { Type.any }) if superclass
1225
+ else
1226
+ klass = Type.any
1205
1227
  end
1206
1228
  end
1207
1229
  singleton = false
@@ -1339,11 +1361,24 @@ module TypeProf
1339
1361
  return
1340
1362
  when :break
1341
1363
  tmp_ep = ep
1342
- tmp_ep = tmp_ep.outer while tmp_ep.ctx.iseq.type != :block
1343
- tmp_ep = tmp_ep.outer
1344
- nenv = @return_envs[tmp_ep].push(ty)
1345
- merge_env(tmp_ep.next, nenv)
1346
- # TODO: jump to ensure?
1364
+ while true
1365
+ if tmp_ep.ctx.iseq.type == :block
1366
+ tmp_ep = tmp_ep.outer
1367
+ nenv = @return_envs[tmp_ep].push(ty)
1368
+ merge_env(tmp_ep.next, nenv)
1369
+ break
1370
+ end
1371
+ _type, _iseq, cont, stack_depth = tmp_ep.ctx.iseq.catch_table[tmp_ep.pc]&.find {|type,| type == :break }
1372
+ if cont
1373
+ nenv = @return_envs[tmp_ep]
1374
+ nenv, = nenv.pop(nenv.stack.size - stack_depth)
1375
+ nenv = nenv.push(ty)
1376
+ tmp_ep = tmp_ep.jump(cont)
1377
+ merge_env(tmp_ep, nenv)
1378
+ break
1379
+ end
1380
+ tmp_ep = tmp_ep.outer
1381
+ end
1347
1382
  when :next, :redo
1348
1383
  # begin; rescue; next; end
1349
1384
  tmp_ep = ep.outer
@@ -1585,7 +1620,7 @@ module TypeProf
1585
1620
  warn(ep, "already initialized constant #{ Type::Instance.new(cbase).screen_name(self) }::#{ name }")
1586
1621
  end
1587
1622
  ty.each_child do |ty|
1588
- if ty.is_a?(Type::Class) && ty.superclass == Type::Builtin[:struct]
1623
+ if ty.is_a?(Type::Class) && cbase.is_a?(Type::Class) && ty.superclass == Type::Builtin[:struct]
1589
1624
  @class_defs[ty.idx].name = cbase_path(cbase) + [name]
1590
1625
  end
1591
1626
  end
@@ -1594,7 +1629,6 @@ module TypeProf
1594
1629
  when :getspecial
1595
1630
  key, type = operands
1596
1631
  if type == 0
1597
- raise NotImplementedError
1598
1632
  case key
1599
1633
  when 0 # VM_SVAR_LASTLINE
1600
1634
  env = env.push(Type.any) # or String | NilClass only?
@@ -1612,8 +1646,12 @@ module TypeProf
1612
1646
  return
1613
1647
  end
1614
1648
  when :setspecial
1615
- # flip-flop
1616
- raise NotImplementedError, "setspecial"
1649
+ key, = operands
1650
+ if key >= 2 # flip-flop
1651
+ env, = env.pop(1)
1652
+ else
1653
+ raise "unknown setspecial key: #{ key }"
1654
+ end
1617
1655
 
1618
1656
  when :dup
1619
1657
  env, (ty,) = env.pop(1)
@@ -1664,10 +1702,16 @@ module TypeProf
1664
1702
  env = env.push(Type.optional(sym_ty))
1665
1703
  when :checkmatch
1666
1704
  flag, = operands
1705
+
1706
+ # This flag means that the stack top is an array, and the check needs to be applied to find all elements
1707
+ # However, currently TypeProf uses very conservative interpretation (all check returns both true and false),
1708
+ # so we just ignore the flag now
1667
1709
  _array = flag & 4 != 0
1710
+
1668
1711
  case flag & 3
1669
- when 1
1670
- raise NotImplementedError
1712
+ when 1 # VM_CHECKMATCH_TYPE_WHEN
1713
+ env, = env.pop(2)
1714
+ env = env.push(Type.bool)
1671
1715
  when 2 # VM_CHECKMATCH_TYPE_CASE
1672
1716
  env, = env.pop(2)
1673
1717
  env = env.push(Type.bool)
@@ -1877,6 +1921,10 @@ module TypeProf
1877
1921
  rest_ty = aargs.last
1878
1922
  aargs = aargs[0..-2]
1879
1923
  if flag_args_kw_splat
1924
+ # XXX: The types contained in ActualArguments are expected to be all local types.
1925
+ # This "globalize_type" breaks the invariant, and violates the assertion of Union#globalize that asserts @elems be nil.
1926
+ # To fix this issue fundamentally, ActualArguments should keep all arguments as-is (as like the VM does),
1927
+ # and globalize some types on the on-demand bases.
1880
1928
  ty = globalize_type(rest_ty, env, ep)
1881
1929
  if ty.is_a?(Type::Array)
1882
1930
  _, (ty,) = ty.elems.take_last(1)
@@ -1909,6 +1957,10 @@ module TypeProf
1909
1957
  aargs = ActualArguments.new(aargs, rest_ty, kw_tys, blk_ty)
1910
1958
  elsif flag_args_kw_splat
1911
1959
  last = aargs.last
1960
+ # XXX: The types contained in ActualArguments are expected to be all local types.
1961
+ # This "globalize_type" breaks the invariant, and violates the assertion of Union#globalize that asserts @elems be nil.
1962
+ # To fix this issue fundamentally, ActualArguments should keep all arguments as-is (as like the VM does),
1963
+ # and globalize some types on the on-demand bases.
1912
1964
  ty = globalize_type(last, env, ep)
1913
1965
  case ty
1914
1966
  when Type::Hash
@@ -2003,10 +2055,10 @@ module TypeProf
2003
2055
 
2004
2056
  def do_define_iseq_method(ep, env, mid, iseq, outer_ep)
2005
2057
  cref = ep.ctx.cref
2006
- recv = env.static_env.recv_ty
2007
2058
  if cref.klass.is_a?(Type::Class)
2008
2059
  typed_mdef = check_typed_method(cref.klass, mid, ep.ctx.cref.singleton)
2009
- recv = Type::Instance.new(recv) if recv.is_a?(Type::Class)
2060
+ recv = cref.klass
2061
+ recv = Type::Instance.new(recv) unless ep.ctx.cref.singleton
2010
2062
  if typed_mdef
2011
2063
  mdef = ISeqMethodDef.new(iseq, cref, outer_ep, env.static_env.pub_meth)
2012
2064
  typed_mdef.each do |typed_mdef|
@@ -2021,9 +2073,9 @@ module TypeProf
2021
2073
  add_singleton_iseq_method(cref.klass, mid, iseq, cref, outer_ep, true)
2022
2074
  end
2023
2075
  end
2024
-
2025
- pend_method_execution(iseq, meth, recv, mid, ep.ctx.cref, outer_ep)
2026
2076
  end
2077
+
2078
+ pend_method_execution(iseq, meth, recv, mid, ep.ctx.cref, outer_ep)
2027
2079
  else
2028
2080
  # XXX: what to do?
2029
2081
  end
@@ -2069,7 +2121,7 @@ module TypeProf
2069
2121
  next unless @block_to_ctx[blk.block_body] # this occurs when screen_name is called before type-profiling finished (e.g., error message)
2070
2122
  @block_to_ctx[blk.block_body].each do |blk_ctx|
2071
2123
  if farg_tys
2072
- farg_tys = farg_tys.merge(@method_signatures[blk_ctx])
2124
+ farg_tys = farg_tys.merge_as_block_arguments(@method_signatures[blk_ctx])
2073
2125
  else
2074
2126
  farg_tys = @method_signatures[blk_ctx]
2075
2127
  end
@@ -3,6 +3,7 @@ module TypeProf
3
3
  class ActualArguments
4
4
  def initialize(lead_tys, rest_ty, kw_tys, blk_ty)
5
5
  @lead_tys = lead_tys
6
+ raise unless lead_tys
6
7
  @rest_ty = rest_ty
7
8
  @kw_tys = kw_tys # kw_tys should be {:key1 => Type, :key2 => Type, ...} or {nil => Type}
8
9
  raise if !kw_tys.is_a?(::Hash)
@@ -58,6 +59,7 @@ module TypeProf
58
59
  subst = Type.merge_substitution(subst, subst2)
59
60
  end
60
61
  msig.opt_tys.each do |farg|
62
+ break if aargs.empty?
61
63
  aarg = aargs.shift
62
64
  return nil unless subst2 = Type.match?(aarg, farg)
63
65
  subst = Type.merge_substitution(subst, subst2)
@@ -29,7 +29,10 @@ module TypeProf
29
29
 
30
30
  def do_call(aargs, caller_ep, caller_env, scratch, replace_recv_ty:, &ctn)
31
31
  blk_env = scratch.return_envs[@outer_ep]
32
- blk_env = blk_env.replace_recv_ty(replace_recv_ty) if replace_recv_ty
32
+ if replace_recv_ty
33
+ replace_recv_ty = scratch.globalize_type(replace_recv_ty, caller_env, caller_ep)
34
+ blk_env = blk_env.replace_recv_ty(replace_recv_ty)
35
+ end
33
36
  aargs = scratch.globalize_type(aargs, caller_env, caller_ep)
34
37
 
35
38
  scratch.add_block_signature!(self, aargs.to_block_signature)
@@ -119,11 +122,12 @@ module TypeProf
119
122
  def do_call(aargs, caller_ep, caller_env, scratch, replace_recv_ty:, &ctn)
120
123
  if aargs.lead_tys.size >= 1
121
124
  recv = aargs.lead_tys[0]
125
+ recv = Type.any if recv == Type.bot
122
126
  aargs = ActualArguments.new(aargs.lead_tys[1..], aargs.rest_ty, aargs.kw_tys, aargs.blk_ty)
123
127
  elsif aargs.rest_ty
124
128
  recv = aargs.rest_ty.elems.squash_or_any # XXX: need to shift
125
129
  else
126
- raise
130
+ recv = Type.any
127
131
  end
128
132
 
129
133
  scratch.add_block_signature!(self, aargs.to_block_signature)
@@ -82,14 +82,17 @@ module TypeProf
82
82
  end
83
83
 
84
84
  def object_is_a?(recv, mid, aargs, ep, env, scratch, &ctn)
85
- raise unless aargs.lead_tys.size != 0
86
- if recv.is_a?(Type::Instance)
87
- if recv.klass == aargs.lead_tys[0] # XXX: inheritance
88
- true_val = Type::Instance.new(Type::Builtin[:true])
89
- ctn[true_val, ep, env]
85
+ if aargs.lead_tys.size == 1
86
+ if recv.is_a?(Type::Instance)
87
+ if recv.klass == aargs.lead_tys[0] # XXX: inheritance
88
+ true_val = Type::Instance.new(Type::Builtin[:true])
89
+ ctn[true_val, ep, env]
90
+ else
91
+ false_val = Type::Instance.new(Type::Builtin[:false])
92
+ ctn[false_val, ep, env]
93
+ end
90
94
  else
91
- false_val = Type::Instance.new(Type::Builtin[:false])
92
- ctn[false_val, ep, env]
95
+ ctn[Type.bool, ep, env]
93
96
  end
94
97
  else
95
98
  ctn[Type.bool, ep, env]
@@ -97,16 +100,19 @@ module TypeProf
97
100
  end
98
101
 
99
102
  def object_respond_to?(recv, mid, aargs, ep, env, scratch, &ctn)
100
- raise unless aargs.lead_tys.size != 0
101
- sym = get_sym("respond_to?", aargs.lead_tys[0], ep, scratch)
102
- if sym
103
- klass, singleton = recv.method_dispatch_info
104
- if scratch.get_method(klass, singleton, sym)
105
- true_val = Type::Instance.new(Type::Builtin[:true])
106
- ctn[true_val, ep, env]
103
+ if aargs.lead_tys.size == 1
104
+ sym = get_sym("respond_to?", aargs.lead_tys[0], ep, scratch)
105
+ if sym
106
+ klass, singleton = recv.method_dispatch_info
107
+ if scratch.get_method(klass, singleton, sym)
108
+ true_val = Type::Instance.new(Type::Builtin[:true])
109
+ ctn[true_val, ep, env]
110
+ else
111
+ false_val = Type::Instance.new(Type::Builtin[:false])
112
+ ctn[false_val, ep, env]
113
+ end
107
114
  else
108
- false_val = Type::Instance.new(Type::Builtin[:false])
109
- ctn[false_val, ep, env]
115
+ ctn[Type.bool, ep, env]
110
116
  end
111
117
  else
112
118
  ctn[Type.bool, ep, env]
@@ -124,10 +130,12 @@ module TypeProf
124
130
  def object_send(recv, mid, aargs, ep, env, scratch, &ctn)
125
131
  if aargs.lead_tys.size >= 1
126
132
  mid_ty, = aargs.lead_tys
127
- else
133
+ elsif aargs.rest_ty
128
134
  mid_ty = aargs.rest_ty
135
+ else
136
+ return ctn[Type.any, ep, env]
129
137
  end
130
- aargs = ActualArguments.new(aargs.lead_tys[1..-1], aargs.rest_ty, aargs.kw_tys, aargs.blk_ty)
138
+ aargs = ActualArguments.new(aargs.lead_tys[1..] || [], aargs.rest_ty, aargs.kw_tys, aargs.blk_ty)
131
139
  found = false
132
140
  mid_ty.each_child do |mid|
133
141
  if mid.is_a?(Type::Symbol)
@@ -148,8 +156,10 @@ module TypeProf
148
156
  return
149
157
  end
150
158
  naargs = ActualArguments.new([recv], nil, {}, Type.nil)
151
- scratch.do_invoke_block(aargs.blk_ty, naargs, ep, env, replace_recv_ty: recv) do |_ret_ty, ep|
152
- ctn[recv, ep, scratch.return_envs[ep]]
159
+ nrecv = recv
160
+ nrecv = nrecv.base_type if nrecv.is_a?(Type::ContainerType)
161
+ scratch.do_invoke_block(aargs.blk_ty, naargs, ep, env, replace_recv_ty: nrecv) do |_ret_ty, ep|
162
+ ctn[recv, ep, env]
153
163
  end
154
164
  end
155
165
 
@@ -159,10 +169,16 @@ module TypeProf
159
169
  ctn[Type.any, ep, env]
160
170
  return
161
171
  end
172
+
173
+ unless recv.is_a?(Type::Class)
174
+ # XXX: warn?
175
+ return ctn[Type.any, ep, env]
176
+ end
177
+
162
178
  arg = aargs.lead_tys[0]
163
179
  arg.each_child do |arg|
164
180
  if arg.is_a?(Type::Class)
165
- scratch.include_module(recv, arg, nil, false, ep.ctx.iseq.absolute_path)
181
+ scratch.include_module(recv, arg, nil, false, ep)
166
182
  end
167
183
  end
168
184
  ctn[recv, ep, env]
@@ -174,10 +190,16 @@ module TypeProf
174
190
  ctn[Type.any, ep, env]
175
191
  return
176
192
  end
193
+
194
+ unless recv.is_a?(Type::Class)
195
+ # XXX: warn?
196
+ return ctn[Type.any, ep, env]
197
+ end
198
+
177
199
  arg = aargs.lead_tys[0]
178
200
  arg.each_child do |arg|
179
201
  if arg.is_a?(Type::Class)
180
- scratch.include_module(recv, arg, nil, true, ep.ctx.iseq.absolute_path)
202
+ scratch.include_module(recv, arg, nil, true, ep)
181
203
  end
182
204
  end
183
205
  ctn[recv, ep, env]
@@ -202,13 +224,17 @@ module TypeProf
202
224
  if aargs.lead_tys.empty?
203
225
  ctn[recv, ep, env.method_public_set(true)]
204
226
  else
205
- aargs.lead_tys.each do |aarg|
206
- sym = get_sym("public", aarg, ep, scratch) or next
207
- meths = scratch.get_method(recv, false, sym)
208
- next unless meths
209
- meths.each do |mdef|
210
- mdef.pub_meth = true
227
+ if recv.is_a?(Type::Class)
228
+ aargs.lead_tys.each do |aarg|
229
+ sym = get_sym("public", aarg, ep, scratch) or next
230
+ meths = scratch.get_method(recv, false, sym)
231
+ next unless meths
232
+ meths.each do |mdef|
233
+ mdef.pub_meth = true if mdef.respond_to?(:pub_meth=)
234
+ end
211
235
  end
236
+ else
237
+ # XXX: warn?
212
238
  end
213
239
  ctn[recv, ep, env]
214
240
  end
@@ -218,13 +244,17 @@ module TypeProf
218
244
  if aargs.lead_tys.empty?
219
245
  ctn[recv, ep, env.method_public_set(false)]
220
246
  else
221
- aargs.lead_tys.each do |aarg|
222
- sym = get_sym("private", aarg, ep, scratch) or next
223
- meths = scratch.get_method(recv, false, sym)
224
- next unless meths
225
- meths.each do |mdef|
226
- mdef.pub_meth = false
247
+ if recv.is_a?(Type::Class)
248
+ aargs.lead_tys.each do |aarg|
249
+ sym = get_sym("private", aarg, ep, scratch) or next
250
+ meths = scratch.get_method(recv, false, sym)
251
+ next unless meths
252
+ meths.each do |mdef|
253
+ mdef.pub_meth = false if mdef.respond_to?(:pub_meth=)
254
+ end
227
255
  end
256
+ else
257
+ # XXX: warn?
228
258
  end
229
259
  ctn[recv, ep, env]
230
260
  end
@@ -245,7 +275,7 @@ module TypeProf
245
275
  blk = blk_ty.block_body
246
276
  case blk
247
277
  when ISeqBlock
248
- scratch.do_define_iseq_method(ep, env, mid, blk.iseq, ep)
278
+ scratch.do_define_iseq_method(ep, env, mid, blk.iseq, blk.outer_ep)
249
279
  else
250
280
  # XXX: what to do?
251
281
  end
@@ -323,14 +353,19 @@ module TypeProf
323
353
  return ctn[Type.any, ep, env] unless recv.is_a?(Type::Local) && recv.kind == Type::Array
324
354
 
325
355
  if aargs.lead_tys.size != 2
356
+ # XXX: Support `ary[idx, len] = val`
326
357
  #raise NotImplementedError # XXX
327
- ctn[Type.any, ep, env]
358
+ return ctn[Type.any, ep, env]
328
359
  end
329
360
 
330
361
  idx = aargs.lead_tys.first
331
362
  if idx.is_a?(Type::Literal)
332
363
  idx = idx.lit
333
- raise NotImplementedError if !idx.is_a?(Integer)
364
+ if !idx.is_a?(Integer)
365
+ # XXX: Support `ary[idx..end] = val`
366
+ #raise NotImplementedError # XXX
367
+ return ctn[Type.any, ep, env]
368
+ end
334
369
  else
335
370
  idx = nil
336
371
  end
@@ -367,6 +402,7 @@ module TypeProf
367
402
  recv.each_child do |recv|
368
403
  if recv.is_a?(Type::Local) && recv.kind == Type::Hash
369
404
  ty = scratch.get_hash_elem_type(env, ep, recv.id, idx)
405
+ ty = Type.nil if ty == Type.bot
370
406
  else
371
407
  ty = Type.any
372
408
  end
@@ -377,7 +413,11 @@ module TypeProf
377
413
  def hash_aset(recv, mid, aargs, ep, env, scratch, &ctn)
378
414
  return ctn[Type.any, ep, env] unless recv.is_a?(Type::Local) && recv.kind == Type::Hash
379
415
 
380
- raise NotImplementedError if aargs.lead_tys.size != 2
416
+ if aargs.lead_tys.size != 2
417
+ # XXX: error?
418
+ ctn[Type.any, ep, env]
419
+ return
420
+ end
381
421
 
382
422
  idx = aargs.lead_tys.first
383
423
  idx = scratch.globalize_type(idx, env, ep)
@@ -396,18 +436,7 @@ module TypeProf
396
436
  end
397
437
 
398
438
  def struct_initialize(recv, mid, aargs, ep, env, scratch, &ctn)
399
- recv = Type::Instance.new(recv)
400
- scratch.add_ivar_read!(recv, :_members, ep) do |member_ary_ty, ep|
401
- member_ary_ty.elems.lead_tys.zip(aargs.lead_tys) do |sym, ty|
402
- ty ||= Type.nil
403
- scratch.set_instance_variable(recv, sym.sym, ty, ep, env)
404
- end
405
- end
406
- ctn[recv, ep, env]
407
- end
408
-
409
- def struct_i_new(recv, mid, aargs, ep, env, scratch, &ctn)
410
- struct_klass = recv
439
+ struct_klass = recv.klass
411
440
  while struct_klass.superclass != Type::Builtin[:struct]
412
441
  struct_klass = struct_klass.superclass
413
442
  end
@@ -415,15 +444,24 @@ module TypeProf
415
444
  ctn[Type.any, ep, env]
416
445
  return
417
446
  end
418
- if struct_klass != recv
419
- scratch.add_ivar_read!(Type::Instance.new(struct_klass), :_members, ep) do |ty, ep|
420
- scratch.add_ivar_write!(Type::Instance.new(recv), :_members, ty, ep)
447
+ scratch.add_ivar_read!(Type::Instance.new(struct_klass), :_members, ep) do |member_ary_ty, ep|
448
+ next if member_ary_ty == Type.bot
449
+ member_ary_ty.elems.lead_tys.zip(aargs.lead_tys) do |sym, ty|
450
+ ty ||= Type.nil
451
+ scratch.set_instance_variable(recv, sym.sym, ty, ep, env)
421
452
  end
422
453
  end
454
+ ctn[recv, ep, env]
455
+ end
456
+
457
+ def struct_i_new(recv, mid, aargs, ep, env, scratch, &ctn)
458
+ # TODO: keyword_init
459
+
423
460
  meths = scratch.get_method(recv, false, :initialize)
461
+ recv = Type::Instance.new(recv)
424
462
  meths.flat_map do |meth|
425
463
  meth.do_send(recv, :initialize, aargs, ep, env, scratch) do |ret_ty, ep, env|
426
- ctn[Type::Instance.new(recv), ep, env]
464
+ ctn[recv, ep, env]
427
465
  end
428
466
  end
429
467
  end
@@ -491,11 +529,20 @@ module TypeProf
491
529
  end
492
530
 
493
531
  def kernel_require(recv, mid, aargs, ep, env, scratch, &ctn)
494
- raise NotImplementedError if aargs.lead_tys.size != 1
532
+ if aargs.lead_tys.size != 1
533
+ # XXX: handle correctly
534
+ ctn[Type.any, ep, env]
535
+ return
536
+ end
537
+
495
538
  feature = aargs.lead_tys.first
496
539
  if feature.is_a?(Type::Literal)
497
540
  feature = feature.lit
498
541
 
542
+ unless feature.is_a?(String)
543
+ return ctn[Type.any, ep, env]
544
+ end
545
+
499
546
  action, arg = Builtin.file_require(feature, scratch)
500
547
  case action
501
548
  when :do
@@ -505,22 +552,31 @@ module TypeProf
505
552
  ctn[result, ep, env]
506
553
  when :error
507
554
  scratch.warn(ep, arg)
508
- result = Type::Instance.new(Type.bool)
555
+ result = Type.bool
509
556
  ctn[result, ep, env]
510
557
  end
511
558
  else
512
559
  scratch.warn(ep, "require target cannot be identified statically")
513
- result = Type::Instance.new(Type.bool)
560
+ result = Type.bool
514
561
  ctn[result, ep, env]
515
562
  end
516
563
  end
517
564
 
518
565
  def kernel_require_relative(recv, mid, aargs, ep, env, scratch, &ctn)
519
- raise NotImplementedError if aargs.lead_tys.size != 1
566
+ if aargs.lead_tys.size != 1
567
+ # XXX: handle correctly
568
+ ctn[Type.any, ep, env]
569
+ return
570
+ end
571
+
520
572
  feature = aargs.lead_tys.first
521
573
  if feature.is_a?(Type::Literal)
522
574
  feature = feature.lit
523
575
 
576
+ unless feature.is_a?(String)
577
+ return ctn[Type.any, ep, env]
578
+ end
579
+
524
580
  if scratch.loaded_features[feature]
525
581
  result = Type::Instance.new(Type::Builtin[:false])
526
582
  return ctn[result, ep, env]
@@ -541,7 +597,12 @@ module TypeProf
541
597
  end
542
598
 
543
599
  def kernel_autoload(recv, mid, aargs, ep, env, scratch, &ctn)
544
- raise NotImplementedError if aargs.lead_tys.size != 2
600
+ if aargs.lead_tys.size != 2
601
+ # XXX: handle correctly
602
+ ctn[Type.any, ep, env]
603
+ return
604
+ end
605
+
545
606
  feature = aargs.lead_tys[1]
546
607
  if feature.is_a?(Type::Literal)
547
608
  feature = feature.lit
@@ -597,6 +658,7 @@ module TypeProf
597
658
  Type::Builtin[:int] = scratch.get_constant(klass_obj, :Integer)
598
659
  Type::Builtin[:float] = scratch.get_constant(klass_obj, :Float)
599
660
  Type::Builtin[:rational] = scratch.get_constant(klass_obj, :Rational)
661
+ Type::Builtin[:complex] = scratch.get_constant(klass_obj, :Complex)
600
662
  Type::Builtin[:sym] = scratch.get_constant(klass_obj, :Symbol)
601
663
  Type::Builtin[:str] = scratch.get_constant(klass_obj, :String)
602
664
  Type::Builtin[:struct] = scratch.get_constant(klass_obj, :Struct)
@@ -610,6 +672,7 @@ module TypeProf
610
672
  Type::Builtin[:class] = scratch.get_constant(klass_obj, :Class)
611
673
  Type::Builtin[:module] = scratch.get_constant(klass_obj, :Module)
612
674
  Type::Builtin[:exc] = scratch.get_constant(klass_obj, :Exception)
675
+ Type::Builtin[:encoding] = scratch.get_constant(klass_obj, :Encoding)
613
676
 
614
677
  klass_vmcore = Type::Builtin[:vmcore]
615
678
  klass_ary = Type::Builtin[:ary]
@@ -624,9 +687,6 @@ module TypeProf
624
687
  scratch.set_custom_method(klass_vmcore, :"core#raise", Builtin.method(:vmcore_raise))
625
688
  scratch.set_custom_method(klass_vmcore, :lambda, Builtin.method(:lambda))
626
689
  scratch.set_singleton_custom_method(klass_obj, :"new", Builtin.method(:object_s_new))
627
- scratch.set_singleton_custom_method(klass_obj, :"attr_accessor", Builtin.method(:module_attr_accessor))
628
- scratch.set_singleton_custom_method(klass_obj, :"attr_reader", Builtin.method(:module_attr_reader))
629
- scratch.set_singleton_custom_method(klass_obj, :"attr_writer", Builtin.method(:module_attr_writer))
630
690
  scratch.set_custom_method(klass_obj, :p, Builtin.method(:kernel_p))
631
691
  scratch.set_custom_method(klass_obj, :is_a?, Builtin.method(:object_is_a?))
632
692
  scratch.set_custom_method(klass_obj, :respond_to?, Builtin.method(:object_respond_to?))
@@ -641,6 +701,9 @@ module TypeProf
641
701
  scratch.set_custom_method(klass_module, :public, Builtin.method(:module_public))
642
702
  scratch.set_custom_method(klass_module, :private, Builtin.method(:module_private))
643
703
  scratch.set_custom_method(klass_module, :define_method, Builtin.method(:module_define_method))
704
+ scratch.set_custom_method(klass_module, :"attr_accessor", Builtin.method(:module_attr_accessor))
705
+ scratch.set_custom_method(klass_module, :"attr_reader", Builtin.method(:module_attr_reader))
706
+ scratch.set_custom_method(klass_module, :"attr_writer", Builtin.method(:module_attr_writer))
644
707
 
645
708
  scratch.set_custom_method(klass_proc, :[], Builtin.method(:proc_call))
646
709
  scratch.set_custom_method(klass_proc, :call, Builtin.method(:proc_call))