typeprof 0.8.0 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
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