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
@@ -208,10 +208,6 @@ module TypeProf
208
208
  @base_type = base_type
209
209
  end
210
210
 
211
- def self.dummy_elements
212
- Elements.new([], Type.any)
213
- end
214
-
215
211
  attr_reader :elems, :base_type
216
212
 
217
213
  def inspect
@@ -264,6 +260,10 @@ module TypeProf
264
260
  @lead_tys, @rest_ty = lead_tys, rest_ty
265
261
  end
266
262
 
263
+ def self.dummy_elements
264
+ Elements.new([], Type.any)
265
+ end
266
+
267
267
  attr_reader :lead_tys, :rest_ty
268
268
 
269
269
  def to_local_type(id, base_ty)
@@ -796,6 +796,7 @@ module TypeProf
796
796
  class Local < ContainerType
797
797
  def initialize(kind, id, base_type)
798
798
  @kind = kind
799
+ raise if @kind != Cell && @kind != Array && @kind != Hash
799
800
  @id = id
800
801
  raise unless base_type
801
802
  @base_type = base_type
@@ -72,7 +72,7 @@ module TypeProf
72
72
  gvars.dump.each do |gvar_name, entry|
73
73
  next if entry.type == Type.bot
74
74
  s = entry.rbs_declared ? "#" : ""
75
- output.puts s + "#{ gvar_name } : #{ entry.type.screen_name(scratch) }"
75
+ output.puts s + "#{ gvar_name }: #{ entry.type.screen_name(scratch) }"
76
76
  end
77
77
  output.puts
78
78
  end
@@ -269,7 +269,7 @@ module TypeProf
269
269
  output.puts indent + "#{ class_data.kind } #{ name }#{ superclass }"
270
270
  first = true
271
271
  class_data.consts.each do |name, ty|
272
- output.puts indent + " #{ name } : #{ ty }"
272
+ output.puts indent + " #{ name }: #{ ty }"
273
273
  first = false
274
274
  end
275
275
  class_data.included_mods.sort.each do |mod|
@@ -281,20 +281,20 @@ module TypeProf
281
281
  first = false
282
282
  end
283
283
  class_data.ivars.each do |var, ty|
284
- output.puts indent + " #{ var } : #{ ty }" unless var.start_with?("_")
284
+ output.puts indent + " #{ var }: #{ ty }" unless var.start_with?("_")
285
285
  first = false
286
286
  end
287
287
  class_data.cvars.each do |var, ty|
288
- output.puts indent + " #{ var } : #{ ty }"
288
+ output.puts indent + " #{ var }: #{ ty }"
289
289
  first = false
290
290
  end
291
291
  class_data.attr_methods.each do |(method_name, hidden), (kind, ty)|
292
- output.puts indent + " attr_#{ kind } #{ method_name }#{ hidden ? "()" : "" } : #{ ty }"
292
+ output.puts indent + " attr_#{ kind } #{ method_name }#{ hidden ? "()" : "" }: #{ ty }"
293
293
  first = false
294
294
  end
295
295
  class_data.explicit_methods.each do |method_name, sigs|
296
296
  sigs = sigs.sort.join("\n" + indent + "#" + " " * (method_name.size + 6) + "| ")
297
- output.puts indent + "# def #{ method_name } : #{ sigs }"
297
+ output.puts indent + "# def #{ method_name }: #{ sigs }"
298
298
  first = false
299
299
  end
300
300
  prev_pub_meth = true
@@ -304,7 +304,7 @@ module TypeProf
304
304
  output.puts indent + " #{ pub_meth ? "public" : "private" }"
305
305
  prev_pub_meth = pub_meth
306
306
  end
307
- output.puts indent + " def #{ method_name } : #{ sigs }"
307
+ output.puts indent + " def #{ method_name }: #{ sigs }"
308
308
  first = false
309
309
  end
310
310
  show_class_hierarchy(depth + 1, class_data.inner_classes, output, first)
@@ -26,6 +26,13 @@ module TypeProf
26
26
  def load_library(lib)
27
27
  loader = RBS::EnvironmentLoader.new(core_root: nil)
28
28
  loader.add(library: lib)
29
+
30
+ case lib
31
+ when "yaml"
32
+ loader.add(library: "pstore")
33
+ loader.add(library: "dbm")
34
+ end
35
+
29
36
  new_decls = loader.load(env: @env).map {|decl,| decl }
30
37
  RBSReader.load_rbs(@env, new_decls)
31
38
  end
@@ -263,8 +270,11 @@ module TypeProf
263
270
  end
264
271
  return if decl.name == RBS::BuiltinNames::BasicObject.name
265
272
  return if decl.name == name
266
- @all_env.class_decls[name].decls.each do |decl|
267
- each_reference(decl.decl, &blk)
273
+ decls = @all_env.class_decls[name]
274
+ if decls
275
+ decls.decls.each do |decl|
276
+ each_reference(decl.decl, &blk)
277
+ end
268
278
  end
269
279
  end
270
280
 
@@ -438,6 +448,8 @@ module TypeProf
438
448
  json = scratch.rbs_reader.load_library(feature)
439
449
  rescue RBS::EnvironmentLoader::UnknownLibraryError
440
450
  return nil
451
+ rescue RBS::DuplicatedDeclarationError
452
+ return true
441
453
  end
442
454
  # need cache?
443
455
  Import.new(scratch, json).import
@@ -49,10 +49,18 @@ module TypeProf
49
49
  insns[i, 0] = [[:_iseq_body_start]]
50
50
  end
51
51
 
52
+ # rescue/ensure clauses need to have a dedicated return addresses
53
+ # because they requires to be virtually called.
54
+ # So, this preprocess adds "nop" to make a new insn for their return addresses
55
+ special_labels = {}
56
+ catch_table.map do |type, iseq, first, last, cont, stack_depth|
57
+ special_labels[cont] = true if type == :rescue || type == :ensure
58
+ end
59
+
52
60
  @insns = []
53
61
  @linenos = []
54
62
 
55
- labels = setup_iseq(insns)
63
+ labels = setup_iseq(insns, special_labels)
56
64
 
57
65
  # checkmatch->branch
58
66
  # send->branch
@@ -60,7 +68,8 @@ module TypeProf
60
68
  @catch_table = []
61
69
  catch_table.map do |type, iseq, first, last, cont, stack_depth|
62
70
  iseq = iseq ? ISeq.new(iseq) : nil
63
- entry = [type, iseq, labels[cont], stack_depth]
71
+ target = labels[special_labels[cont] ? :"#{ cont }_special" : cont]
72
+ entry = [type, iseq, target, stack_depth]
64
73
  labels[first].upto(labels[last]) do |i|
65
74
  @catch_table[i] ||= []
66
75
  @catch_table[i] << entry
@@ -76,19 +85,26 @@ module TypeProf
76
85
  @id <=> other.id
77
86
  end
78
87
 
79
- def setup_iseq(insns)
88
+ def setup_iseq(insns, special_labels)
80
89
  i = 0
81
90
  labels = {}
91
+ ninsns = []
82
92
  insns.each do |e|
83
93
  if e.is_a?(Symbol) && e.to_s.start_with?("label")
94
+ if special_labels[e]
95
+ labels[:"#{ e }_special"] = i
96
+ ninsns << [:nop]
97
+ i += 1
98
+ end
84
99
  labels[e] = i
85
- elsif e.is_a?(Array)
86
- i += 1
100
+ else
101
+ i += 1 if e.is_a?(Array)
102
+ ninsns << e
87
103
  end
88
104
  end
89
105
 
90
106
  lineno = 0
91
- insns.each do |e|
107
+ ninsns.each do |e|
92
108
  case e
93
109
  when Integer # lineno
94
110
  lineno = e
@@ -209,7 +225,7 @@ module TypeProf
209
225
  end
210
226
  end
211
227
  send_branch_list.each do |i, j|
212
- next if (i + 1 .. j).any? {|i| branch_targets[i] }
228
+ next if (i + 1 .. j + 1).any? {|i| branch_targets[i] }
213
229
  _insn, getlocal_operands = @insns[i]
214
230
  _insn, send_operands = @insns[j]
215
231
  _insn, branch_operands = @insns[j + 1]
@@ -87,7 +87,7 @@ module TypeProf
87
87
  # XXX: need to check .rbs msig and .rb fargs
88
88
 
89
89
  ctx = Context.new(@iseq, @cref, mid)
90
- callee_ep = ExecutionPoint.new(ctx, 0, nil)
90
+ callee_ep = ExecutionPoint.new(ctx, 0, @outer_ep)
91
91
 
92
92
  locals = [Type.nil] * @iseq.locals.size
93
93
  nenv = Env.new(StaticEnv.new(recv, msig.blk_ty, false, true), locals, [], Utils::HashWrapper.new({}))
@@ -95,16 +95,15 @@ module TypeProf
95
95
  idx = 0
96
96
  msig.lead_tys.each_with_index do |ty, i|
97
97
  alloc_site2 = alloc_site.add_id(idx += 1)
98
- # nenv is top-level, so it is okay to call Type#localize directly
99
98
  ty = ty.substitute(cur_subst, Config.options[:type_depth_limit]).remove_type_vars
100
- nenv, ty = ty.localize(nenv, alloc_site2, Config.options[:type_depth_limit])
99
+ nenv, ty = scratch.localize_type(ty, nenv, callee_ep, alloc_site2)
101
100
  nenv = nenv.local_update(i, ty)
102
101
  end
103
102
  if msig.opt_tys
104
103
  msig.opt_tys.each_with_index do |ty, i|
105
104
  alloc_site2 = alloc_site.add_id(idx += 1)
106
105
  ty = ty.substitute(cur_subst, Config.options[:type_depth_limit]).remove_type_vars
107
- nenv, ty = ty.localize(nenv, alloc_site2, Config.options[:type_depth_limit])
106
+ nenv, ty = scratch.localize_type(ty, nenv, callee_ep, alloc_site2)
108
107
  nenv = nenv.local_update(lead_num + i, ty)
109
108
  end
110
109
  end
@@ -112,27 +111,27 @@ module TypeProf
112
111
  alloc_site2 = alloc_site.add_id(idx += 1)
113
112
  ty = Type::Array.new(Type::Array::Elements.new([], msig.rest_ty), Type::Instance.new(Type::Builtin[:ary]))
114
113
  ty = ty.substitute(cur_subst, Config.options[:type_depth_limit]).remove_type_vars
115
- nenv, rest_ty = ty.localize(nenv, alloc_site2, Config.options[:type_depth_limit])
114
+ nenv, rest_ty = scratch.localize_type(ty, nenv, callee_ep, alloc_site2)
116
115
  nenv = nenv.local_update(rest_start, rest_ty)
117
116
  end
118
117
  if msig.post_tys
119
118
  msig.post_tys.each_with_index do |ty, i|
120
119
  alloc_site2 = alloc_site.add_id(idx += 1)
121
120
  ty = ty.substitute(cur_subst, Config.options[:type_depth_limit]).remove_type_vars
122
- nenv, ty = ty.localize(nenv, alloc_site2, Config.options[:type_depth_limit])
121
+ nenv, ty = scratch.localize_type(ty, nenv, callee_ep, alloc_site2)
123
122
  nenv = nenv.local_update(post_start + i, ty)
124
123
  end
125
124
  end
126
- if msig.kw_tys
125
+ if msig.kw_tys && keyword # TODO: support the case where RBS writes kw_tys and RB method accepts **kwrest
127
126
  msig.kw_tys.each do |_, key, ty|
128
- i = keyword.index(key)
127
+ i = keyword.index {|callee_key,| callee_key == key }
129
128
  unless i
130
129
  # warn
131
130
  next
132
131
  end
133
132
  alloc_site2 = alloc_site.add_id(key)
134
133
  ty = ty.substitute(cur_subst, Config.options[:type_depth_limit]).remove_type_vars
135
- nenv, ty = ty.localize(nenv, alloc_site2, Config.options[:type_depth_limit])
134
+ nenv, ty = scratch.localize_type(ty, nenv, callee_ep, alloc_site2)
136
135
  nenv = nenv.local_update(kw_start + i, ty)
137
136
  end
138
137
  end
@@ -140,14 +139,15 @@ module TypeProf
140
139
  ty = msig.kw_rest_ty
141
140
  alloc_site2 = alloc_site.add_id(:**)
142
141
  ty = ty.substitute(cur_subst, Config.options[:type_depth_limit]).remove_type_vars
143
- nenv, ty = ty.localize(nenv, alloc_site2, Config.options[:type_depth_limit])
142
+ nenv, ty = scratch.localize_type(ty, nenv, callee_ep, alloc_site2)
144
143
  nenv = nenv.local_update(kw_rest, ty)
145
144
  end
146
145
  nenv = nenv.local_update(block_start, msig.blk_ty) if block_start
147
146
 
148
147
  opt.each do |start_pc|
149
- scratch.merge_env(ExecutionPoint.new(ctx, start_pc, nil), nenv)
148
+ scratch.merge_env(callee_ep.jump(start_pc), nenv)
150
149
  end
150
+ scratch.add_executed_iseq(@iseq)
151
151
 
152
152
  ctx
153
153
  end
@@ -166,8 +166,8 @@ module TypeProf
166
166
  case @kind
167
167
  when :reader
168
168
  if aargs.lead_tys.size == 0
169
- scratch.get_instance_variable(recv, @ivar, caller_ep, caller_env) do |ty, nenv|
170
- ctn[ty, caller_ep, nenv]
169
+ scratch.add_ivar_read!(recv, @ivar, caller_ep) do |ty, _ep|
170
+ ctn[ty, caller_ep, caller_env]
171
171
  end
172
172
  else
173
173
  ctn[Type.any, caller_ep, caller_env]
@@ -291,7 +291,6 @@ module TypeProf
291
291
  end
292
292
 
293
293
  def do_send(recv, mid, aargs, caller_ep, caller_env, scratch, &ctn)
294
- scratch.merge_return_env(caller_ep) {|env| env ? env.merge(caller_env) : caller_env } # for Kernel#lambda
295
294
  @impl[recv, mid, aargs, caller_ep, caller_env, scratch, &ctn]
296
295
  end
297
296
  end
@@ -315,9 +315,14 @@ module TypeProf
315
315
  def globalize(env, visited, depth)
316
316
  return Type.any if depth <= 0
317
317
  tys = Utils::Set[]
318
- raise if @elems
318
+ if @elems
319
+ # XXX: If @elems is non nil, the Union type should global, so calling globalize against such a type should not occur.
320
+ # However, currently, ActualArguments may contain global types for flag_args_kw_splat case.
321
+ # This should be fixed in future in ActualArguments side. See Scratch#setup_actual_arguments.
322
+ #raise
323
+ end
319
324
 
320
- elems = {}
325
+ elems = @elems ? @elems.dup : {}
321
326
  @types.each do |ty|
322
327
  ty = ty.globalize(env, visited, depth - 1)
323
328
  case ty
@@ -492,6 +497,8 @@ module TypeProf
492
497
  def initialize(klass)
493
498
  raise unless klass
494
499
  raise if klass == Type.any
500
+ raise if klass.is_a?(Type::Instance)
501
+ raise if klass.is_a?(Type::Union)
495
502
  @klass = klass
496
503
  end
497
504
 
@@ -682,6 +689,8 @@ module TypeProf
682
689
  Type::Literal.new(obj, Type::Instance.new(Type::Builtin[:int]))
683
690
  when ::Rational
684
691
  Type::Literal.new(obj, Type::Instance.new(Type::Builtin[:rational]))
692
+ when ::Complex
693
+ Type::Literal.new(obj, Type::Instance.new(Type::Builtin[:complex]))
685
694
  when ::Float
686
695
  Type::Literal.new(obj, Type::Instance.new(Type::Builtin[:float]))
687
696
  when ::Class
@@ -718,6 +727,8 @@ module TypeProf
718
727
  Type.nil
719
728
  when ::Range
720
729
  Type::Literal.new(obj, Type::Instance.new(Type::Builtin[:range]))
730
+ when ::Encoding
731
+ Type::Literal.new(obj, Type::Instance.new(Type::Builtin[:encoding]))
721
732
  else
722
733
  raise "unknown object: #{ obj.inspect }"
723
734
  end
@@ -820,6 +831,7 @@ module TypeProf
820
831
  def initialize(lead_tys, opt_tys, rest_ty, post_tys, kw_tys, kw_rest_ty, blk_ty)
821
832
  @lead_tys = lead_tys
822
833
  @opt_tys = opt_tys
834
+ raise unless opt_tys.is_a?(Array)
823
835
  @rest_ty = rest_ty
824
836
  @post_tys = post_tys
825
837
  raise unless post_tys
@@ -842,6 +854,44 @@ module TypeProf
842
854
  MethodSignature.new(lead_tys, opt_tys, rest_ty, post_tys, kw_tys, kw_rest_ty, blk_ty)
843
855
  end
844
856
 
857
+ def merge_as_block_arguments(other)
858
+ lead_tys1, opt_tys1, rest_ty1, post_tys1 = @lead_tys, @opt_tys, @rest_ty, @post_tys
859
+ lead_tys2, opt_tys2, rest_ty2, post_tys2 = other.lead_tys, other.opt_tys, other.rest_ty, other.post_tys
860
+
861
+ case
862
+ when lead_tys1.size > lead_tys2.size
863
+ n = lead_tys2.size
864
+ lead_tys1, opt_tys1 = lead_tys1[0, n], lead_tys1[n..] + opt_tys1
865
+ when lead_tys1.size < lead_tys2.size
866
+ n = lead_tys1.size
867
+ lead_tys2, opt_tys2 = lead_tys2[0, n], lead_tys2[n..] + opt_tys2
868
+ end
869
+ case
870
+ when post_tys1.size > post_tys2.size
871
+ i = post_tys1.size - post_tys2.size
872
+ if rest_ty1
873
+ rest_ty1 = post_tys[0, i].inject(rest_ty1) {|ty1, ty2| ty1.union(ty2) }
874
+ post_tys1 = post_tys1[i..]
875
+ else
876
+ opt_tys1, post_tys1 = opt_tys1 + post_tys1[0, i], post_tys1[i..]
877
+ end
878
+ when post_tys1.size < post_tys2.size
879
+ i = post_tys2.size - post_tys1.size
880
+ if rest_ty2
881
+ rest_ty2 = post_tys[0, i].inject(rest_ty2) {|ty1, ty2| ty1.union(ty2) }
882
+ post_tys2 = post_tys2[i..]
883
+ else
884
+ opt_tys2, post_tys2 = opt_tys2 + post_tys2[0, i], post_tys2[i..]
885
+ end
886
+ end
887
+
888
+ # XXX: tweak keywords too
889
+
890
+ msig1 = MethodSignature.new(lead_tys1, opt_tys1, rest_ty1, post_tys1, @kw_tys, @kw_rest_ty, @blk_ty)
891
+ msig2 = MethodSignature.new(lead_tys2, opt_tys2, rest_ty2, post_tys2, other.kw_tys, other.kw_rest_ty, other.blk_ty)
892
+ msig1.merge(msig2)
893
+ end
894
+
845
895
  def merge(other)
846
896
  raise if @lead_tys.size != other.lead_tys.size
847
897
  raise if @post_tys.size != other.post_tys.size
@@ -1,3 +1,3 @@
1
1
  module TypeProf
2
- VERSION = "0.8.0"
2
+ VERSION = "0.9.0"
3
3
  end
@@ -21,11 +21,11 @@ __END__
21
21
  # Classes
22
22
  class Object
23
23
  private
24
- def foo : (Integer) -> Integer
25
- def bar : (String) -> String
24
+ def foo: (Integer) -> Integer
25
+ def bar: (String) -> String
26
26
  end
27
27
 
28
28
  class Test
29
- def baz : (Integer) -> Integer
30
- def qux : (String) -> String
29
+ def baz: (Integer) -> Integer
30
+ def qux: (String) -> String
31
31
  end
@@ -12,8 +12,8 @@ Foo[:x, :y, :z]
12
12
  __END__
13
13
  # Classes
14
14
  class Foo
15
- @a : :x
16
- @b : :y
17
- @c : :z
18
- def initialize : (:x, :y, :z) -> [:x, :y, :z]
15
+ @a: :x
16
+ @b: :y
17
+ @c: :z
18
+ def initialize: (:x, :y, :z) -> [:x, :y, :z]
19
19
  end
@@ -12,5 +12,5 @@ smoke/any1.rb:2: [error] undefined method: Integer#undefined_method
12
12
  # Classes
13
13
  class Object
14
14
  private
15
- def foo : -> untyped
15
+ def foo: -> untyped
16
16
  end
@@ -13,6 +13,6 @@ __END__
13
13
  # Classes
14
14
  class Object
15
15
  private
16
- def foo : -> untyped
17
- def bar : -> Integer
16
+ def foo: -> untyped
17
+ def bar: -> Integer
18
18
  end
@@ -12,6 +12,6 @@ smoke/arguments.rb:6: [error] wrong number of arguments (given 2, expected 1)
12
12
  # Classes
13
13
  class Object
14
14
  private
15
- def foo : (untyped) -> nil
16
- def bar : (untyped) -> nil
15
+ def foo: (untyped) -> nil
16
+ def bar: (untyped) -> nil
17
17
  end
@@ -43,14 +43,14 @@ __END__
43
43
  # Classes
44
44
  class Object
45
45
  private
46
- def f1 : -> nil
47
- def f2 : (:x, :y, :z) -> nil
48
- def f3 : (?String, ?String) -> nil
49
- def f4 : (*:a | :b | :c) -> nil
50
- def f5 : (:x, ?String, :z) -> nil
51
- def f6 : (k: :kk) -> nil
52
- def f7 : (?k: Integer) -> nil
53
- def f8 : (?k: String) -> nil
54
- def f9 : (**{k: :kk}) -> nil
55
- def f10 : { (Integer) -> nil } -> nil
46
+ def f1: -> nil
47
+ def f2: (:x, :y, :z) -> nil
48
+ def f3: (?String, ?String) -> nil
49
+ def f4: (*:a | :b | :c) -> nil
50
+ def f5: (:x, ?String, :z) -> nil
51
+ def f6: (k: :kk) -> nil
52
+ def f7: (?k: Integer) -> nil
53
+ def f8: (?k: String) -> nil
54
+ def f9: (**{k: :kk}) -> nil
55
+ def f10: { (Integer) -> nil } -> nil
56
56
  end