typeprof 0.4.1 → 0.5.3
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/.github/workflows/main.yml +1 -2
- data/Gemfile.lock +3 -3
- data/README.md +6 -0
- data/lib/typeprof/analyzer.rb +73 -57
- data/lib/typeprof/arguments.rb +27 -19
- data/lib/typeprof/block.rb +5 -2
- data/lib/typeprof/builtin.rb +14 -4
- data/lib/typeprof/config.rb +10 -6
- data/lib/typeprof/container-type.rb +104 -97
- data/lib/typeprof/export.rb +1 -1
- data/lib/typeprof/import.rb +44 -22
- data/lib/typeprof/method.rb +70 -12
- data/lib/typeprof/type.rb +103 -88
- data/lib/typeprof/version.rb +1 -1
- data/smoke/arguments2.rb +1 -1
- data/smoke/block-kwarg.rb +1 -1
- data/smoke/block10.rb +1 -1
- data/smoke/hash-fetch.rb +3 -3
- data/smoke/hash-merge-bang.rb +11 -0
- data/smoke/hash1.rb +1 -1
- data/smoke/hash3.rb +1 -1
- data/smoke/hash4.rb +1 -1
- data/smoke/ivar2.rb +1 -1
- data/smoke/keyword4.rb +1 -1
- data/smoke/kwsplat1.rb +1 -1
- data/smoke/kwsplat2.rb +1 -1
- data/smoke/pattern-match1.rb +23 -0
- data/smoke/pattern-match2.rb +15 -0
- data/smoke/rbs-tyvar3.rb +11 -19
- data/smoke/rbs-tyvar3.rbs +4 -3
- data/smoke/rbs-tyvar4.rb +36 -0
- data/smoke/rbs-tyvar5.rb +12 -0
- data/smoke/rbs-tyvar5.rbs +8 -0
- data/smoke/uninitialize-var.rb +12 -0
- data/typeprof.gemspec +1 -1
- metadata +12 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b1281ceb7a6a28b6dec33aad740d0fa52429a17ca29d57747717247fdb449c79
|
4
|
+
data.tar.gz: 3ad79ab67ba6080e0c1da2b46671012e4db2f886020a11772158449ffd85717b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c0e888c0c1cc871b23592f29d138f7c9c8ca5370fa98699c9b504aa29c79796f58d97653fac98cef2df1d8e7f5c961942ee28d385a95695e4ce7f1ff3c8d24f5
|
7
|
+
data.tar.gz: 3ee4de72a8e26aed401b1879575ef82c0b1215fe9ccb87ee2c781a8138becc9ab948aea00e07e8e344ca4f96610ebfefdc540f175253cfe32dca1f721c232e7f
|
data/.github/workflows/main.yml
CHANGED
@@ -17,9 +17,8 @@ jobs:
|
|
17
17
|
uses: ruby/setup-ruby@v1
|
18
18
|
with:
|
19
19
|
ruby-version: ${{ matrix.ruby-version }}
|
20
|
-
- name:
|
20
|
+
- name: Bundle install
|
21
21
|
run: |
|
22
|
-
cd rbs && bundle install && bundle exec rake parser && cd ..
|
23
22
|
bundle install
|
24
23
|
- name: Run the test suite
|
25
24
|
run: |
|
data/Gemfile.lock
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
typeprof (0.
|
5
|
-
rbs (>= 0.
|
4
|
+
typeprof (0.5.2)
|
5
|
+
rbs (>= 0.17.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.
|
14
|
+
rbs (0.17.0)
|
15
15
|
simplecov (0.19.1)
|
16
16
|
docile (~> 1.1)
|
17
17
|
simplecov-html (~> 0.11)
|
data/README.md
CHANGED
data/lib/typeprof/analyzer.rb
CHANGED
@@ -87,6 +87,11 @@ module TypeProf
|
|
87
87
|
@recv_ty = recv_ty
|
88
88
|
@blk_ty = blk_ty
|
89
89
|
@mod_func = mod_func
|
90
|
+
|
91
|
+
return if recv_ty == :top #OK
|
92
|
+
recv_ty.each_child_global do |ty|
|
93
|
+
raise ty.inspect if !ty.is_a?(Type::Instance) && !ty.is_a?(Type::Class) && ty != Type.any
|
94
|
+
end
|
90
95
|
end
|
91
96
|
|
92
97
|
attr_reader :recv_ty, :blk_ty, :mod_func
|
@@ -129,11 +134,7 @@ module TypeProf
|
|
129
134
|
elems2 = type_params[id]
|
130
135
|
if elems2
|
131
136
|
if elems != elems2
|
132
|
-
|
133
|
-
type_params[id] = elems.zip(elems2).map {|elem1, elem2| elem1.union(elem2) }
|
134
|
-
else
|
135
|
-
type_params[id] = elems.union(elems2)
|
136
|
-
end
|
137
|
+
type_params[id] = elems.union(elems2)
|
137
138
|
end
|
138
139
|
else
|
139
140
|
type_params[id] = elems
|
@@ -151,6 +152,8 @@ module TypeProf
|
|
151
152
|
tys.each do |ty|
|
152
153
|
raise "nil cannot be pushed to the stack" if ty.nil?
|
153
154
|
ty.each_child do |ty|
|
155
|
+
raise if ty.is_a?(Type::Var)
|
156
|
+
#raise if ty.is_a?(Type::Instance) && ty.klass.type_params.size > 1
|
154
157
|
raise "Array cannot be pushed to the stack" if ty.is_a?(Type::Array)
|
155
158
|
raise "Hash cannot be pushed to the stack" if ty.is_a?(Type::Hash)
|
156
159
|
end
|
@@ -293,20 +296,11 @@ module TypeProf
|
|
293
296
|
attr_reader :kind, :superclass, :modules, :consts, :methods, :ivars, :cvars, :absolute_path
|
294
297
|
attr_accessor :name, :klass_obj
|
295
298
|
|
296
|
-
def include_module(mod, absolute_path)
|
299
|
+
def include_module(mod, singleton, absolute_path)
|
297
300
|
# XXX: need to check if mod is already included by the ancestors?
|
298
|
-
absolute_paths = @modules[
|
301
|
+
absolute_paths = @modules[singleton][mod]
|
299
302
|
unless absolute_paths
|
300
|
-
@modules[
|
301
|
-
end
|
302
|
-
absolute_paths << absolute_path
|
303
|
-
end
|
304
|
-
|
305
|
-
def extend_module(mod, absolute_path)
|
306
|
-
# XXX: need to check if mod is already included by the ancestors?
|
307
|
-
absolute_paths = @modules[true][mod]
|
308
|
-
unless absolute_paths
|
309
|
-
@modules[true][mod] = absolute_paths = Utils::MutableSet.new
|
303
|
+
@modules[singleton][mod] = absolute_paths = Utils::MutableSet.new
|
310
304
|
end
|
311
305
|
absolute_paths << absolute_path
|
312
306
|
end
|
@@ -353,7 +347,7 @@ module TypeProf
|
|
353
347
|
end
|
354
348
|
end
|
355
349
|
|
356
|
-
def include_module(including_mod, included_mod, absolute_path)
|
350
|
+
def include_module(including_mod, included_mod, singleton, absolute_path)
|
357
351
|
return if included_mod == Type.any
|
358
352
|
|
359
353
|
including_mod = @class_defs[including_mod.idx]
|
@@ -361,7 +355,7 @@ module TypeProf
|
|
361
355
|
if included_mod.is_a?(Type::Class)
|
362
356
|
included_mod = @class_defs[included_mod.idx]
|
363
357
|
if included_mod && included_mod.kind == :module
|
364
|
-
including_mod.include_module(included_mod, absolute_path)
|
358
|
+
including_mod.include_module(included_mod, singleton, absolute_path)
|
365
359
|
else
|
366
360
|
warn "including something that is not a module"
|
367
361
|
end
|
@@ -369,20 +363,6 @@ module TypeProf
|
|
369
363
|
end
|
370
364
|
end
|
371
365
|
|
372
|
-
def extend_module(extending_mod, extended_mod, absolute_path)
|
373
|
-
extending_mod = @class_defs[extending_mod.idx]
|
374
|
-
extended_mod.each_child do |extended_mod|
|
375
|
-
if extended_mod.is_a?(Type::Class)
|
376
|
-
extended_mod = @class_defs[extended_mod.idx]
|
377
|
-
if extended_mod && extended_mod.kind == :module
|
378
|
-
extending_mod.extend_module(extended_mod, absolute_path)
|
379
|
-
else
|
380
|
-
warn "extending something that is not a module"
|
381
|
-
end
|
382
|
-
end
|
383
|
-
end
|
384
|
-
end
|
385
|
-
|
386
366
|
def cbase_path(cbase)
|
387
367
|
cbase && cbase.idx != 1 ? @class_defs[cbase.idx].name : []
|
388
368
|
end
|
@@ -572,9 +552,7 @@ module TypeProf
|
|
572
552
|
|
573
553
|
ret_ty = @return_values[callee_ctx] ||= Type.bot
|
574
554
|
if ret_ty != Type.bot
|
575
|
-
|
576
|
-
ctn[ret_ty, caller_ep, @return_envs[caller_ep]]
|
577
|
-
end
|
555
|
+
ctn[ret_ty, caller_ep, @return_envs[caller_ep]]
|
578
556
|
end
|
579
557
|
end
|
580
558
|
|
@@ -632,7 +610,7 @@ module TypeProf
|
|
632
610
|
entry = @tbl[site] ||= Entry.new(!ep, {}, Type.bot, Utils::MutableSet.new)
|
633
611
|
if ep
|
634
612
|
if entry.rbs_declared
|
635
|
-
|
613
|
+
unless Type.match?(ty, entry.type)
|
636
614
|
scratch.warn(ep, "inconsistent assignment to RBS-declared global variable")
|
637
615
|
return
|
638
616
|
end
|
@@ -651,6 +629,7 @@ module TypeProf
|
|
651
629
|
end
|
652
630
|
|
653
631
|
def get_ivar(recv)
|
632
|
+
recv = recv.base_type while recv.respond_to?(:base_type)
|
654
633
|
case recv
|
655
634
|
when Type::Class
|
656
635
|
[@class_defs[recv.idx], true]
|
@@ -884,26 +863,41 @@ module TypeProf
|
|
884
863
|
def pend_method_execution(iseq, meth, recv, mid, cref)
|
885
864
|
ctx = Context.new(iseq, cref, mid)
|
886
865
|
ep = ExecutionPoint.new(ctx, 0, nil)
|
887
|
-
locals = [Type.
|
888
|
-
|
889
|
-
|
866
|
+
locals = [Type.nil] * iseq.locals.size
|
867
|
+
|
868
|
+
fargs_format = iseq.fargs_format
|
869
|
+
lead_num = fargs_format[:lead_num] || 0
|
870
|
+
post_num = fargs_format[:post_num] || 0
|
871
|
+
post_index = fargs_format[:post_start]
|
872
|
+
rest_index = fargs_format[:rest_start]
|
873
|
+
keyword = fargs_format[:keyword]
|
874
|
+
kw_index = fargs_format[:kwbits] - keyword.size if keyword
|
875
|
+
kwrest_index = fargs_format[:kwrest]
|
876
|
+
block_index = fargs_format[:block_start]
|
877
|
+
opt = fargs_format[:opt] || [0]
|
878
|
+
|
879
|
+
(lead_num + opt.size - 1).times {|i| locals[i] = Type.any }
|
880
|
+
post_num.times {|i| locals[i + post_index] = Type.any } if post_index
|
881
|
+
locals[rest_index] = Type.any if rest_index
|
890
882
|
if keyword
|
891
|
-
kw_start = iseq.fargs_format[:kwbits]
|
892
|
-
kw_start -= iseq.fargs_format[:keyword].size if kw_start
|
893
883
|
keyword.each_with_index do |kw, i|
|
894
884
|
case
|
895
885
|
when kw.is_a?(Symbol) # required keyword
|
886
|
+
locals[kw_index + i] = Type.any
|
896
887
|
when kw.size == 2 # optional keyword (default value is a literal)
|
897
888
|
_key, default_ty = *kw
|
898
889
|
default_ty = Type.guess_literal_type(default_ty)
|
899
|
-
default_ty = default_ty.
|
900
|
-
locals[
|
890
|
+
default_ty = default_ty.base_type if default_ty.is_a?(Type::Literal)
|
891
|
+
locals[kw_index + i] = default_ty.union(Type.any)
|
901
892
|
else # optional keyword (default value is an expression)
|
893
|
+
locals[kw_index + i] = Type.any
|
902
894
|
end
|
903
895
|
end
|
904
896
|
end
|
897
|
+
locals[kwrest_index] = Type.any if kwrest_index
|
898
|
+
locals[block_index] = Type.nil if block_index
|
905
899
|
|
906
|
-
env = Env.new(StaticEnv.new(recv, Type.
|
900
|
+
env = Env.new(StaticEnv.new(recv, Type.nil, false), locals, [], Utils::HashWrapper.new({}))
|
907
901
|
|
908
902
|
@pending_execution[iseq] ||= [:method, [meth, ep, env]]
|
909
903
|
end
|
@@ -986,7 +980,7 @@ module TypeProf
|
|
986
980
|
when kw.size == 2 # optional keyword (default value is a literal)
|
987
981
|
key, default_ty = *kw
|
988
982
|
default_ty = Type.guess_literal_type(default_ty)
|
989
|
-
default_ty = default_ty.
|
983
|
+
default_ty = default_ty.base_type if default_ty.is_a?(Type::Literal)
|
990
984
|
req = false
|
991
985
|
else # optional keyword (default value is an expression)
|
992
986
|
key, = kw
|
@@ -1029,7 +1023,17 @@ module TypeProf
|
|
1029
1023
|
ty = Type::Literal.new(str, Type::Instance.new(Type::Builtin[:str]))
|
1030
1024
|
env = env.push(ty)
|
1031
1025
|
when :putself
|
1032
|
-
|
1026
|
+
ty = env.static_env.recv_ty
|
1027
|
+
if ty.is_a?(Type::Instance)
|
1028
|
+
klass = ty.klass
|
1029
|
+
if klass.type_params.size >= 1
|
1030
|
+
ty = Type::ContainerType.create_empty_instance(klass)
|
1031
|
+
env, ty = localize_type(ty, env, ep, AllocationSite.new(ep))
|
1032
|
+
else
|
1033
|
+
ty = Type::Instance.new(klass)
|
1034
|
+
end
|
1035
|
+
env, ty = localize_type(ty, env, ep)
|
1036
|
+
end
|
1033
1037
|
env = env.push(ty)
|
1034
1038
|
when :newarray, :newarraykwsplat
|
1035
1039
|
len, = operands
|
@@ -1700,15 +1704,27 @@ module TypeProf
|
|
1700
1704
|
end
|
1701
1705
|
|
1702
1706
|
when :checktype
|
1703
|
-
|
1704
|
-
|
1705
|
-
|
1706
|
-
|
1707
|
-
|
1708
|
-
if res
|
1709
|
-
ty = Type::Instance.new(Type::Builtin[:true])
|
1707
|
+
kind, = operands
|
1708
|
+
case kind
|
1709
|
+
when 5 then klass = :str # T_STRING
|
1710
|
+
when 7 then klass = :ary # T_ARRAY
|
1711
|
+
when 8 then klass = :hash # T_HASH
|
1710
1712
|
else
|
1711
|
-
|
1713
|
+
raise NotImplementedError
|
1714
|
+
end
|
1715
|
+
env, (val,) = env.pop(1)
|
1716
|
+
ty = Type.bot
|
1717
|
+
val.each_child do |val|
|
1718
|
+
#globalize_type(val, env, ep).each_child_global do |val|
|
1719
|
+
val = val.base_type while val.respond_to?(:base_type)
|
1720
|
+
case val
|
1721
|
+
when Type::Instance.new(Type::Builtin[klass])
|
1722
|
+
ty = ty.union(Type::Instance.new(Type::Builtin[:true]))
|
1723
|
+
when Type.any
|
1724
|
+
ty = Type.bool
|
1725
|
+
else
|
1726
|
+
ty = ty.union(Type::Instance.new(Type::Builtin[:false]))
|
1727
|
+
end
|
1712
1728
|
end
|
1713
1729
|
env = env.push(ty)
|
1714
1730
|
else
|
@@ -1857,7 +1873,7 @@ module TypeProf
|
|
1857
1873
|
kw_tys = ty.elems.to_keywords
|
1858
1874
|
when Type::Union
|
1859
1875
|
hash_elems = nil
|
1860
|
-
ty.elems
|
1876
|
+
ty.elems&.each do |(container_kind, base_type), elems|
|
1861
1877
|
if container_kind == Type::Hash
|
1862
1878
|
hash_elems = hash_elems ? hash_elems.union(elems) : elems
|
1863
1879
|
end
|
@@ -1946,7 +1962,7 @@ module TypeProf
|
|
1946
1962
|
end
|
1947
1963
|
end
|
1948
1964
|
|
1949
|
-
@block_to_ctx[blk.block_body]
|
1965
|
+
@block_to_ctx[blk.block_body]&.each do |blk_ctx|
|
1950
1966
|
ret_ty = ret_ty.union(@return_values[blk_ctx]) if @return_values[blk_ctx]
|
1951
1967
|
end
|
1952
1968
|
end
|
data/lib/typeprof/arguments.rb
CHANGED
@@ -25,7 +25,7 @@ module TypeProf
|
|
25
25
|
self
|
26
26
|
end
|
27
27
|
|
28
|
-
def consistent_with_method_signature?(msig
|
28
|
+
def consistent_with_method_signature?(msig)
|
29
29
|
aargs = @lead_tys.dup
|
30
30
|
|
31
31
|
# aargs: lead_tys, rest_ty
|
@@ -36,53 +36,61 @@ module TypeProf
|
|
36
36
|
(lower_bound..upper_bound).each do |n|
|
37
37
|
# BUG: @rest_ty is an Array, so need to squash
|
38
38
|
tmp_aargs = ActualArguments.new(@lead_tys + [@rest_ty] * n, nil, @kw_tys, @blk_ty)
|
39
|
-
|
40
|
-
|
41
|
-
end
|
39
|
+
subst = tmp_aargs.consistent_with_method_signature?(msig) # XXX: wrong subst handling in the loop!
|
40
|
+
return subst if subst
|
42
41
|
end
|
43
|
-
return
|
42
|
+
return nil
|
44
43
|
end
|
45
44
|
|
45
|
+
subst = {}
|
46
46
|
if msig.rest_ty
|
47
|
-
return
|
47
|
+
return nil if aargs.size < msig.lead_tys.size + msig.post_tys.size
|
48
48
|
aargs.shift(msig.lead_tys.size).zip(msig.lead_tys) do |aarg, farg|
|
49
|
-
return
|
49
|
+
return nil unless subst2 = Type.match?(aarg, farg)
|
50
|
+
subst = Type.merge_substitution(subst, subst2)
|
50
51
|
end
|
51
52
|
aargs.pop(msig.post_tys.size).zip(msig.post_tys) do |aarg, farg|
|
52
|
-
return
|
53
|
+
return nil unless subst2 = Type.match?(aarg, farg)
|
54
|
+
subst = Type.merge_substitution(subst, subst2)
|
53
55
|
end
|
54
56
|
msig.opt_tys.each do |farg|
|
55
57
|
aarg = aargs.shift
|
56
|
-
return
|
58
|
+
return nil unless subst2 = Type.match?(aarg, farg)
|
59
|
+
subst = Type.merge_substitution(subst, subst2)
|
57
60
|
end
|
58
61
|
aargs.each do |aarg|
|
59
|
-
return
|
62
|
+
return nil unless subst2 = Type.match?(aarg, msig.rest_ty)
|
63
|
+
subst = Type.merge_substitution(subst, subst2)
|
60
64
|
end
|
61
65
|
else
|
62
|
-
return
|
63
|
-
return
|
66
|
+
return nil if aargs.size < msig.lead_tys.size + msig.post_tys.size
|
67
|
+
return nil if aargs.size > msig.lead_tys.size + msig.post_tys.size + msig.opt_tys.size
|
64
68
|
aargs.shift(msig.lead_tys.size).zip(msig.lead_tys) do |aarg, farg|
|
65
|
-
return
|
69
|
+
return nil unless subst2 = Type.match?(aarg, farg)
|
70
|
+
subst = Type.merge_substitution(subst, subst2)
|
66
71
|
end
|
67
72
|
aargs.pop(msig.post_tys.size).zip(msig.post_tys) do |aarg, farg|
|
68
|
-
return
|
73
|
+
return nil unless subst2 = Type.match?(aarg, farg)
|
74
|
+
subst = Type.merge_substitution(subst, subst2)
|
69
75
|
end
|
70
76
|
aargs.zip(msig.opt_tys) do |aarg, farg|
|
71
|
-
return
|
77
|
+
return nil unless subst2 = Type.match?(aarg, farg)
|
78
|
+
subst = Type.merge_substitution(subst, subst2)
|
72
79
|
end
|
73
80
|
end
|
74
81
|
# XXX: msig.keyword_tys
|
75
82
|
|
76
83
|
case msig.blk_ty
|
77
84
|
when Type::Proc
|
78
|
-
return
|
85
|
+
return nil if @blk_ty == Type.nil
|
79
86
|
when Type.nil
|
80
|
-
return
|
87
|
+
return nil if @blk_ty != Type.nil
|
81
88
|
when Type::Any
|
82
89
|
else
|
83
90
|
raise "unknown type of formal block signature"
|
84
91
|
end
|
85
|
-
|
92
|
+
|
93
|
+
subst
|
86
94
|
end
|
87
95
|
|
88
96
|
def argument_error(given, exp_lower, exp_upper)
|
@@ -345,7 +353,7 @@ module TypeProf
|
|
345
353
|
when kw.size == 2 # optional keyword (default value is a literal)
|
346
354
|
key, default_ty = *kw
|
347
355
|
default_ty = Type.guess_literal_type(default_ty)
|
348
|
-
default_ty = default_ty.
|
356
|
+
default_ty = default_ty.base_type if default_ty.is_a?(Type::Literal)
|
349
357
|
req = false
|
350
358
|
else # optional keyword (default value is an expression)
|
351
359
|
key, = kw
|
data/lib/typeprof/block.rb
CHANGED
@@ -85,10 +85,13 @@ module TypeProf
|
|
85
85
|
end
|
86
86
|
|
87
87
|
def do_call(aargs, caller_ep, caller_env, scratch, replace_recv_ty:, &ctn)
|
88
|
-
|
89
|
-
|
88
|
+
aargs = scratch.globalize_type(aargs, caller_env, caller_ep)
|
89
|
+
subst = aargs.consistent_with_method_signature?(@msig)
|
90
|
+
unless subst
|
90
91
|
scratch.warn(caller_ep, "The arguments is not compatibile to RBS block")
|
91
92
|
end
|
93
|
+
# check?
|
94
|
+
#subst = { Type::Var.new(:self) => caller_env.static_env.recv_ty }
|
92
95
|
# XXX: Update type vars
|
93
96
|
ctn[@ret_ty, caller_ep, caller_env]
|
94
97
|
end
|
data/lib/typeprof/builtin.rb
CHANGED
@@ -54,6 +54,10 @@ module TypeProf
|
|
54
54
|
ctn[ret_ty, ep, env]
|
55
55
|
end
|
56
56
|
|
57
|
+
def vmcore_raise(recv, mid, aargs, ep, env, scratch, &ctn)
|
58
|
+
# no-op
|
59
|
+
end
|
60
|
+
|
57
61
|
def lambda(recv, mid, aargs, ep, env, scratch, &ctn)
|
58
62
|
ctn[aargs.blk_ty, ep, env]
|
59
63
|
end
|
@@ -63,10 +67,11 @@ module TypeProf
|
|
63
67
|
end
|
64
68
|
|
65
69
|
def object_s_new(recv, mid, aargs, ep, env, scratch, &ctn)
|
66
|
-
ty = Type::Instance.new(recv)
|
67
70
|
if recv.type_params.size >= 1
|
68
|
-
ty = Type::
|
71
|
+
ty = Type::ContainerType.create_empty_instance(recv)
|
69
72
|
env, ty = scratch.localize_type(ty, env, ep, AllocationSite.new(ep).add_id(:object_s_new))
|
73
|
+
else
|
74
|
+
ty = Type::Instance.new(recv)
|
70
75
|
end
|
71
76
|
meths = scratch.get_method(recv, false, :initialize)
|
72
77
|
meths.flat_map do |meth|
|
@@ -149,7 +154,11 @@ module TypeProf
|
|
149
154
|
|
150
155
|
def module_include(recv, mid, aargs, ep, env, scratch, &ctn)
|
151
156
|
arg = aargs.lead_tys[0]
|
152
|
-
|
157
|
+
arg.each_child do |arg|
|
158
|
+
if arg.is_a?(Type::Class)
|
159
|
+
scratch.include_module(recv, arg, false, ep.ctx.iseq.absolute_path)
|
160
|
+
end
|
161
|
+
end
|
153
162
|
ctn[recv, ep, env]
|
154
163
|
end
|
155
164
|
|
@@ -157,7 +166,7 @@ module TypeProf
|
|
157
166
|
arg = aargs.lead_tys[0]
|
158
167
|
arg.each_child do |arg|
|
159
168
|
if arg.is_a?(Type::Class)
|
160
|
-
scratch.
|
169
|
+
scratch.include_module(recv, arg, true, ep.ctx.iseq.absolute_path)
|
161
170
|
end
|
162
171
|
end
|
163
172
|
ctn[recv, ep, env]
|
@@ -520,6 +529,7 @@ module TypeProf
|
|
520
529
|
scratch.set_custom_method(klass_vmcore, :"core#set_method_alias", Builtin.method(:vmcore_set_method_alias))
|
521
530
|
scratch.set_custom_method(klass_vmcore, :"core#undef_method", Builtin.method(:vmcore_undef_method))
|
522
531
|
scratch.set_custom_method(klass_vmcore, :"core#hash_merge_kwd", Builtin.method(:vmcore_hash_merge_kwd))
|
532
|
+
scratch.set_custom_method(klass_vmcore, :"core#raise", Builtin.method(:vmcore_raise))
|
523
533
|
scratch.set_custom_method(klass_vmcore, :lambda, Builtin.method(:lambda))
|
524
534
|
scratch.set_singleton_custom_method(klass_obj, :"new", Builtin.method(:object_s_new))
|
525
535
|
scratch.set_singleton_custom_method(klass_obj, :"attr_accessor", Builtin.method(:module_attr_accessor))
|