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.
- checksums.yaml +4 -4
- data/Gemfile.lock +3 -3
- data/lib/typeprof/analyzer.rb +96 -44
- data/lib/typeprof/arguments.rb +2 -0
- data/lib/typeprof/block.rb +6 -2
- data/lib/typeprof/builtin.rb +125 -62
- data/lib/typeprof/container-type.rb +5 -4
- data/lib/typeprof/export.rb +7 -7
- data/lib/typeprof/import.rb +14 -2
- data/lib/typeprof/iseq.rb +23 -7
- data/lib/typeprof/method.rb +13 -14
- data/lib/typeprof/type.rb +52 -2
- data/lib/typeprof/version.rb +1 -1
- data/smoke/alias.rb +4 -4
- data/smoke/alias2.rb +4 -4
- data/smoke/any1.rb +1 -1
- data/smoke/any2.rb +2 -2
- data/smoke/arguments.rb +2 -2
- data/smoke/arguments2.rb +10 -10
- data/smoke/array-each.rb +1 -1
- data/smoke/array-each2.rb +1 -1
- data/smoke/array-each3.rb +1 -1
- data/smoke/array-ltlt.rb +1 -1
- data/smoke/array-ltlt2.rb +1 -1
- data/smoke/array-map.rb +1 -1
- data/smoke/array-map2.rb +1 -1
- data/smoke/array-map3.rb +3 -3
- data/smoke/array-mul.rb +2 -2
- data/smoke/array-plus1.rb +1 -1
- data/smoke/array-plus2.rb +2 -2
- data/smoke/array-pop.rb +1 -1
- data/smoke/array-range-aref.rb +11 -11
- data/smoke/array-replace.rb +1 -1
- data/smoke/array-s-aref.rb +1 -1
- data/smoke/array1.rb +5 -5
- data/smoke/array10.rb +1 -1
- data/smoke/array11.rb +1 -1
- data/smoke/array12.rb +3 -3
- data/smoke/array13.rb +4 -4
- data/smoke/array14.rb +1 -1
- data/smoke/array15.rb +16 -0
- data/smoke/array2.rb +3 -3
- data/smoke/array3.rb +4 -4
- data/smoke/array4.rb +1 -1
- data/smoke/array5.rb +1 -1
- data/smoke/array6.rb +2 -2
- data/smoke/array7.rb +1 -1
- data/smoke/array8.rb +1 -1
- data/smoke/array9.rb +1 -1
- data/smoke/attr-module.rb +26 -0
- data/smoke/attr.rb +5 -5
- data/smoke/autoload.rb +1 -1
- data/smoke/backtrace.rb +3 -3
- data/smoke/block-ambiguous.rb +8 -8
- data/smoke/block-args1-rest.rb +11 -11
- data/smoke/block-args1.rb +10 -10
- data/smoke/block-args2-rest.rb +11 -11
- data/smoke/block-args2.rb +10 -10
- data/smoke/block-args3-rest.rb +13 -13
- data/smoke/block-args3.rb +12 -12
- data/smoke/block-blockarg.rb +4 -4
- data/smoke/block-kwarg.rb +10 -10
- data/smoke/block1.rb +1 -1
- data/smoke/block10.rb +1 -1
- data/smoke/block11.rb +5 -5
- data/smoke/block12.rb +2 -2
- data/smoke/block14.rb +2 -2
- data/smoke/block2.rb +1 -1
- data/smoke/block3.rb +3 -3
- data/smoke/block4.rb +2 -2
- data/smoke/block5.rb +2 -2
- data/smoke/block6.rb +2 -2
- data/smoke/block7.rb +1 -1
- data/smoke/block8.rb +3 -3
- data/smoke/block9.rb +1 -1
- data/smoke/blown.rb +1 -1
- data/smoke/break1.rb +2 -2
- data/smoke/break2.rb +1 -1
- data/smoke/break3.rb +13 -0
- data/smoke/case.rb +1 -1
- data/smoke/case2.rb +1 -1
- data/smoke/case3.rb +17 -0
- data/smoke/class-hierarchy.rb +5 -5
- data/smoke/class-hierarchy2.rb +3 -3
- data/smoke/class-new.rb +15 -0
- data/smoke/class_instance_var.rb +1 -1
- data/smoke/class_method.rb +2 -2
- data/smoke/class_method2.rb +2 -2
- data/smoke/class_method3.rb +2 -2
- data/smoke/constant1.rb +6 -6
- data/smoke/constant2.rb +4 -4
- data/smoke/constant3.rb +1 -1
- data/smoke/constant4.rb +1 -1
- data/smoke/context-sensitive1.rb +1 -1
- data/smoke/cvar.rb +5 -5
- data/smoke/cvar2.rb +2 -2
- data/smoke/define_method.rb +2 -2
- data/smoke/define_method2.rb +2 -2
- data/smoke/define_method3.rb +13 -0
- data/smoke/define_method3.rbs +3 -0
- data/smoke/define_method4.rb +15 -0
- data/smoke/define_method4.rbs +3 -0
- data/smoke/define_method5.rb +12 -0
- data/smoke/demo.rb +6 -6
- data/smoke/demo1.rb +1 -1
- data/smoke/demo10.rb +2 -2
- data/smoke/demo11.rb +1 -1
- data/smoke/demo2.rb +1 -1
- data/smoke/demo3.rb +1 -1
- data/smoke/demo4.rb +3 -3
- data/smoke/demo5.rb +1 -1
- data/smoke/demo6.rb +3 -3
- data/smoke/demo7.rb +1 -1
- data/smoke/demo8.rb +2 -2
- data/smoke/demo9.rb +2 -2
- data/smoke/dummy-execution1.rb +2 -2
- data/smoke/dummy-execution2.rb +2 -2
- data/smoke/dummy_element.rb +14 -0
- data/smoke/ensure1.rb +2 -2
- data/smoke/enumerator.rb +2 -2
- data/smoke/expandarray1.rb +1 -1
- data/smoke/expandarray2.rb +1 -1
- data/smoke/fib.rb +2 -2
- data/smoke/flip-flop.rb +28 -0
- data/smoke/flow1.rb +1 -1
- data/smoke/flow2.rb +1 -1
- data/smoke/flow3.rb +1 -1
- data/smoke/flow5.rb +1 -1
- data/smoke/flow6.rb +1 -1
- data/smoke/flow7.rb +1 -1
- data/smoke/flow8.rb +1 -1
- data/smoke/flow9.rb +12 -0
- data/smoke/freeze.rb +1 -1
- data/smoke/function.rb +2 -2
- data/smoke/gvar.rb +2 -2
- data/smoke/gvar2.rb +2 -2
- data/smoke/hash-bot.rb +12 -0
- data/smoke/hash-fetch.rb +3 -3
- data/smoke/hash-merge-bang.rb +1 -1
- data/smoke/hash1.rb +2 -2
- data/smoke/hash2.rb +1 -1
- data/smoke/hash3.rb +1 -1
- data/smoke/hash4.rb +1 -1
- data/smoke/hash5.rb +1 -1
- data/smoke/inheritance.rb +4 -4
- data/smoke/inheritance2.rb +2 -2
- data/smoke/initialize.rb +5 -5
- data/smoke/instance_eval.rb +2 -2
- data/smoke/instance_eval2.rb +10 -0
- data/smoke/instance_eval3.rb +25 -0
- data/smoke/int_times.rb +1 -1
- data/smoke/integer.rb +1 -1
- data/smoke/ivar.rb +4 -4
- data/smoke/ivar2.rb +4 -4
- data/smoke/ivar3.rb +2 -2
- data/smoke/kernel-class.rb +1 -1
- data/smoke/keyword1.rb +1 -1
- data/smoke/keyword2.rb +1 -1
- data/smoke/keyword3.rb +1 -1
- data/smoke/keyword4.rb +1 -1
- data/smoke/keyword5.rb +1 -1
- data/smoke/kwrest.rb +2 -2
- data/smoke/kwsplat1.rb +4 -4
- data/smoke/kwsplat2.rb +1 -1
- data/smoke/lit-complex.rb +10 -0
- data/smoke/lit-encoding.rb +10 -0
- data/smoke/manual-rbs.rb +3 -3
- data/smoke/manual-rbs2.rb +1 -1
- data/smoke/manual-rbs3.rb +2 -2
- data/smoke/masgn1.rb +1 -1
- data/smoke/masgn2.rb +2 -2
- data/smoke/masgn3.rb +1 -1
- data/smoke/method_in_branch.rb +2 -2
- data/smoke/method_missing.rb +4 -4
- data/smoke/module1.rb +2 -2
- data/smoke/module2.rb +1 -1
- data/smoke/module3.rb +2 -2
- data/smoke/module4.rb +2 -2
- data/smoke/module5.rb +17 -0
- data/smoke/module6.rb +40 -0
- data/smoke/module_function1.rb +3 -3
- data/smoke/module_function2.rb +3 -3
- data/smoke/multiple-include.rb +1 -1
- data/smoke/multiple-superclass.rb +1 -1
- data/smoke/next1.rb +2 -2
- data/smoke/next2.rb +1 -1
- data/smoke/object-send1.rb +3 -3
- data/smoke/object-send2.rb +10 -0
- data/smoke/object-send3.rb +18 -0
- data/smoke/once.rb +1 -1
- data/smoke/optional1.rb +1 -1
- data/smoke/optional2.rb +1 -1
- data/smoke/optional3.rb +1 -1
- data/smoke/parameterizedd-self.rb +2 -2
- data/smoke/parameterizedd-self2.rb +1 -1
- data/smoke/pathname1.rb +1 -1
- data/smoke/pathname2.rb +1 -1
- data/smoke/pattern-match1.rb +1 -1
- data/smoke/pattern-match2.rb +1 -1
- data/smoke/printf.rb +2 -2
- data/smoke/proc.rb +2 -2
- data/smoke/proc2.rb +1 -1
- data/smoke/proc3.rb +1 -1
- data/smoke/proc4.rb +1 -1
- data/smoke/proc5.rb +19 -0
- data/smoke/public.rb +34 -0
- data/smoke/range.rb +1 -1
- data/smoke/rbs-alias.rb +1 -1
- data/smoke/rbs-attr.rb +3 -3
- data/smoke/rbs-attr2.rb +1 -1
- data/smoke/rbs-extend.rb +1 -1
- data/smoke/rbs-interface.rb +4 -4
- data/smoke/rbs-module.rb +26 -0
- data/smoke/rbs-module.rbs +4 -0
- data/smoke/rbs-opt-and-rest.rb +10 -0
- data/smoke/rbs-opt-and-rest.rbs +3 -0
- data/smoke/rbs-proc1.rb +1 -1
- data/smoke/rbs-proc2.rb +2 -2
- data/smoke/rbs-proc3.rb +1 -1
- data/smoke/rbs-record.rb +2 -2
- data/smoke/rbs-tyvar.rb +2 -2
- data/smoke/rbs-tyvar2.rb +2 -2
- data/smoke/rbs-tyvar3.rb +2 -2
- data/smoke/rbs-tyvar4.rb +3 -3
- data/smoke/rbs-tyvar5.rb +1 -1
- data/smoke/rbs-tyvar6.rb +3 -3
- data/smoke/rbs-tyvar7.rb +1 -1
- data/smoke/rbs-vars.rb +6 -6
- data/smoke/redo1.rb +2 -2
- data/smoke/redo2.rb +2 -2
- data/smoke/req-keyword.rb +1 -1
- data/smoke/rescue1.rb +2 -2
- data/smoke/rescue2.rb +2 -2
- data/smoke/rescue3.rb +19 -0
- data/smoke/rescue4.rb +17 -0
- data/smoke/respond_to.rb +1 -1
- data/smoke/rest-farg.rb +1 -1
- data/smoke/rest1.rb +2 -2
- data/smoke/rest2.rb +1 -1
- data/smoke/rest3.rb +6 -6
- data/smoke/rest4.rb +2 -2
- data/smoke/rest5.rb +1 -1
- data/smoke/rest6.rb +1 -1
- data/smoke/retry1.rb +2 -2
- data/smoke/return.rb +1 -1
- data/smoke/singleton_method.rb +1 -1
- data/smoke/step.rb +3 -3
- data/smoke/string-split.rb +1 -1
- data/smoke/struct-keyword_init.rb +20 -0
- data/smoke/struct.rb +1 -1
- data/smoke/struct2.rb +4 -4
- data/smoke/struct3.rb +2 -2
- data/smoke/struct4.rb +7 -0
- data/smoke/struct5.rb +16 -0
- data/smoke/struct6.rb +15 -0
- data/smoke/struct7.rb +17 -0
- data/smoke/stub-keyword.rb +10 -0
- data/smoke/super1.rb +4 -4
- data/smoke/super2.rb +1 -1
- data/smoke/super3.rb +3 -3
- data/smoke/super4.rb +5 -5
- data/smoke/super5.rb +4 -4
- data/smoke/svar1.rb +1 -1
- data/smoke/symbol-proc-attr.rb +22 -0
- data/smoke/symbol-proc-attr2.rb +15 -0
- data/smoke/symbol-proc-bot.rb +13 -0
- data/smoke/symbol-proc.rb +3 -3
- data/smoke/tap1.rb +2 -2
- data/smoke/toplevel.rb +1 -1
- data/smoke/two-map.rb +2 -2
- data/smoke/type_var.rb +1 -1
- data/smoke/typed_method.rb +1 -1
- data/smoke/uninitialize-var.rb +1 -1
- data/smoke/union-recv.rb +2 -2
- data/smoke/user-demo.rb +3 -3
- data/smoke/wrong-extend.rb +2 -2
- data/smoke/wrong-include.rb +2 -2
- data/smoke/wrong-include2.rb +17 -0
- data/typeprof.gemspec +1 -1
- metadata +44 -5
- 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
|
data/lib/typeprof/export.rb
CHANGED
@@ -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 }
|
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 }
|
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 }
|
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 }
|
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 ? "()" : "" }
|
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 }
|
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 }
|
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)
|
data/lib/typeprof/import.rb
CHANGED
@@ -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]
|
267
|
-
|
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
|
data/lib/typeprof/iseq.rb
CHANGED
@@ -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
|
-
|
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
|
-
|
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
|
-
|
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]
|
data/lib/typeprof/method.rb
CHANGED
@@ -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,
|
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 =
|
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 =
|
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 =
|
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 =
|
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
|
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 =
|
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 =
|
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(
|
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.
|
170
|
-
ctn[ty, caller_ep,
|
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
|
data/lib/typeprof/type.rb
CHANGED
@@ -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
|
-
|
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
|
data/lib/typeprof/version.rb
CHANGED
data/smoke/alias.rb
CHANGED
@@ -21,11 +21,11 @@ __END__
|
|
21
21
|
# Classes
|
22
22
|
class Object
|
23
23
|
private
|
24
|
-
def foo
|
25
|
-
def bar
|
24
|
+
def foo: (Integer) -> Integer
|
25
|
+
def bar: (String) -> String
|
26
26
|
end
|
27
27
|
|
28
28
|
class Test
|
29
|
-
def baz
|
30
|
-
def qux
|
29
|
+
def baz: (Integer) -> Integer
|
30
|
+
def qux: (String) -> String
|
31
31
|
end
|
data/smoke/alias2.rb
CHANGED
data/smoke/any1.rb
CHANGED
data/smoke/any2.rb
CHANGED
data/smoke/arguments.rb
CHANGED
data/smoke/arguments2.rb
CHANGED
@@ -43,14 +43,14 @@ __END__
|
|
43
43
|
# Classes
|
44
44
|
class Object
|
45
45
|
private
|
46
|
-
def f1
|
47
|
-
def f2
|
48
|
-
def f3
|
49
|
-
def f4
|
50
|
-
def f5
|
51
|
-
def f6
|
52
|
-
def f7
|
53
|
-
def f8
|
54
|
-
def f9
|
55
|
-
def f10
|
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
|