typeprof 0.7.0 → 0.10.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 (296) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +8 -5
  3. data/lib/typeprof/analyzer.rb +211 -98
  4. data/lib/typeprof/arguments.rb +2 -0
  5. data/lib/typeprof/block.rb +40 -2
  6. data/lib/typeprof/builtin.rb +301 -99
  7. data/lib/typeprof/cli.rb +2 -0
  8. data/lib/typeprof/config.rb +14 -2
  9. data/lib/typeprof/container-type.rb +5 -4
  10. data/lib/typeprof/export.rb +116 -65
  11. data/lib/typeprof/import.rb +68 -41
  12. data/lib/typeprof/iseq.rb +46 -11
  13. data/lib/typeprof/method.rb +47 -23
  14. data/lib/typeprof/type.rb +96 -18
  15. data/lib/typeprof/version.rb +1 -1
  16. data/smoke/alias.rb +5 -4
  17. data/smoke/alias2.rb +6 -4
  18. data/smoke/any1.rb +2 -1
  19. data/smoke/any2.rb +3 -2
  20. data/smoke/arguments.rb +3 -2
  21. data/smoke/arguments2.rb +11 -10
  22. data/smoke/array-each.rb +2 -1
  23. data/smoke/array-each2.rb +2 -1
  24. data/smoke/array-each3.rb +2 -1
  25. data/smoke/array-ltlt.rb +2 -1
  26. data/smoke/array-ltlt2.rb +2 -1
  27. data/smoke/array-map.rb +2 -1
  28. data/smoke/array-map2.rb +2 -1
  29. data/smoke/array-map3.rb +4 -3
  30. data/smoke/array-mul.rb +3 -2
  31. data/smoke/array-plus1.rb +2 -1
  32. data/smoke/array-plus2.rb +3 -2
  33. data/smoke/array-pop.rb +2 -1
  34. data/smoke/array-range-aref.rb +12 -11
  35. data/smoke/array-replace.rb +2 -1
  36. data/smoke/array-s-aref.rb +2 -1
  37. data/smoke/array1.rb +6 -5
  38. data/smoke/array10.rb +2 -1
  39. data/smoke/array11.rb +2 -1
  40. data/smoke/array12.rb +4 -3
  41. data/smoke/array13.rb +5 -4
  42. data/smoke/array14.rb +2 -1
  43. data/smoke/array15.rb +16 -0
  44. data/smoke/array2.rb +4 -3
  45. data/smoke/array3.rb +5 -4
  46. data/smoke/array4.rb +2 -1
  47. data/smoke/array5.rb +2 -1
  48. data/smoke/array6.rb +4 -2
  49. data/smoke/array7.rb +2 -1
  50. data/smoke/array8.rb +1 -1
  51. data/smoke/array9.rb +2 -1
  52. data/smoke/attr-module.rb +27 -0
  53. data/smoke/attr-vis.rb +43 -0
  54. data/smoke/attr-vis.rbs +4 -0
  55. data/smoke/attr.rb +5 -5
  56. data/smoke/autoload.rb +2 -1
  57. data/smoke/backtrace.rb +4 -3
  58. data/smoke/block-ambiguous.rb +9 -8
  59. data/smoke/block-args1-rest.rb +13 -11
  60. data/smoke/block-args1.rb +11 -10
  61. data/smoke/block-args2-rest.rb +13 -11
  62. data/smoke/block-args2.rb +11 -10
  63. data/smoke/block-args3-rest.rb +15 -13
  64. data/smoke/block-args3.rb +13 -12
  65. data/smoke/block-blockarg.rb +5 -4
  66. data/smoke/block-kwarg.rb +11 -10
  67. data/smoke/block1.rb +2 -1
  68. data/smoke/block10.rb +2 -1
  69. data/smoke/block11.rb +6 -5
  70. data/smoke/block12.rb +3 -2
  71. data/smoke/block14.rb +3 -2
  72. data/smoke/block2.rb +2 -1
  73. data/smoke/block3.rb +3 -3
  74. data/smoke/block4.rb +3 -2
  75. data/smoke/block5.rb +4 -2
  76. data/smoke/block6.rb +3 -2
  77. data/smoke/block7.rb +2 -1
  78. data/smoke/block8.rb +4 -3
  79. data/smoke/block9.rb +2 -1
  80. data/smoke/block_given.rb +37 -0
  81. data/smoke/blown.rb +2 -1
  82. data/smoke/break1.rb +3 -2
  83. data/smoke/break2.rb +2 -1
  84. data/smoke/break3.rb +13 -0
  85. data/smoke/case.rb +2 -1
  86. data/smoke/case2.rb +2 -1
  87. data/smoke/case3.rb +17 -0
  88. data/smoke/class-hierarchy.rb +5 -5
  89. data/smoke/class-hierarchy2.rb +3 -3
  90. data/smoke/class-new.rb +15 -0
  91. data/smoke/class_instance_var.rb +1 -1
  92. data/smoke/class_method.rb +2 -2
  93. data/smoke/class_method2.rb +2 -2
  94. data/smoke/class_method3.rb +4 -2
  95. data/smoke/constant1.rb +6 -6
  96. data/smoke/constant2.rb +6 -4
  97. data/smoke/constant3.rb +2 -1
  98. data/smoke/constant4.rb +2 -1
  99. data/smoke/context-sensitive1.rb +2 -1
  100. data/smoke/cvar.rb +7 -5
  101. data/smoke/cvar2.rb +2 -2
  102. data/smoke/define_method.rb +2 -2
  103. data/smoke/define_method2.rb +2 -2
  104. data/smoke/define_method3.rb +14 -0
  105. data/smoke/define_method3.rbs +3 -0
  106. data/smoke/define_method4.rb +15 -0
  107. data/smoke/define_method4.rbs +3 -0
  108. data/smoke/define_method5.rb +12 -0
  109. data/smoke/define_method6.rb +19 -0
  110. data/smoke/demo.rb +7 -6
  111. data/smoke/demo1.rb +2 -1
  112. data/smoke/demo10.rb +3 -2
  113. data/smoke/demo11.rb +2 -1
  114. data/smoke/demo2.rb +2 -1
  115. data/smoke/demo3.rb +2 -1
  116. data/smoke/demo4.rb +3 -3
  117. data/smoke/demo5.rb +1 -1
  118. data/smoke/demo6.rb +4 -3
  119. data/smoke/demo7.rb +2 -1
  120. data/smoke/demo8.rb +3 -2
  121. data/smoke/demo9.rb +4 -2
  122. data/smoke/dummy-execution1.rb +3 -2
  123. data/smoke/dummy-execution2.rb +2 -2
  124. data/smoke/dummy_element.rb +14 -0
  125. data/smoke/ensure1.rb +3 -2
  126. data/smoke/enum_for.rb +15 -0
  127. data/smoke/enum_for2.rb +17 -0
  128. data/smoke/enumerator.rb +3 -2
  129. data/smoke/expandarray1.rb +2 -1
  130. data/smoke/expandarray2.rb +2 -1
  131. data/smoke/fib.rb +2 -2
  132. data/smoke/flip-flop.rb +28 -0
  133. data/smoke/flow1.rb +2 -1
  134. data/smoke/flow10.rb +17 -0
  135. data/smoke/flow2.rb +2 -1
  136. data/smoke/flow3.rb +2 -1
  137. data/smoke/flow5.rb +2 -1
  138. data/smoke/flow6.rb +2 -1
  139. data/smoke/flow7.rb +2 -1
  140. data/smoke/flow8.rb +2 -1
  141. data/smoke/flow9.rb +12 -0
  142. data/smoke/freeze.rb +2 -1
  143. data/smoke/function.rb +3 -2
  144. data/smoke/gvar.rb +3 -2
  145. data/smoke/gvar2.rb +4 -3
  146. data/smoke/hash-bot.rb +12 -0
  147. data/smoke/hash-fetch.rb +4 -3
  148. data/smoke/hash-merge-bang.rb +2 -1
  149. data/smoke/hash1.rb +3 -2
  150. data/smoke/hash2.rb +2 -1
  151. data/smoke/hash3.rb +2 -1
  152. data/smoke/hash4.rb +2 -1
  153. data/smoke/hash5.rb +1 -1
  154. data/smoke/inheritance.rb +4 -4
  155. data/smoke/inheritance2.rb +2 -2
  156. data/smoke/initialize.rb +7 -5
  157. data/smoke/instance_eval.rb +2 -2
  158. data/smoke/instance_eval2.rb +10 -0
  159. data/smoke/instance_eval3.rb +25 -0
  160. data/smoke/int_times.rb +2 -1
  161. data/smoke/integer.rb +2 -1
  162. data/smoke/ivar.rb +6 -4
  163. data/smoke/ivar2.rb +4 -4
  164. data/smoke/ivar3.rb +4 -3
  165. data/smoke/ivar4.rb +21 -0
  166. data/smoke/kernel-class.rb +2 -1
  167. data/smoke/keyword1.rb +2 -1
  168. data/smoke/keyword2.rb +2 -1
  169. data/smoke/keyword3.rb +2 -1
  170. data/smoke/keyword4.rb +2 -1
  171. data/smoke/keyword5.rb +2 -1
  172. data/smoke/kwrest.rb +3 -2
  173. data/smoke/kwsplat1.rb +5 -4
  174. data/smoke/kwsplat2.rb +2 -1
  175. data/smoke/lit-complex.rb +10 -0
  176. data/smoke/lit-encoding.rb +10 -0
  177. data/smoke/manual-rbs.rb +6 -4
  178. data/smoke/manual-rbs2.rb +2 -1
  179. data/smoke/manual-rbs3.rb +3 -2
  180. data/smoke/masgn1.rb +2 -1
  181. data/smoke/masgn2.rb +3 -2
  182. data/smoke/masgn3.rb +2 -1
  183. data/smoke/method_in_branch.rb +4 -3
  184. data/smoke/method_missing.rb +5 -4
  185. data/smoke/module1.rb +2 -2
  186. data/smoke/module2.rb +1 -1
  187. data/smoke/module3.rb +3 -3
  188. data/smoke/module4.rb +3 -2
  189. data/smoke/module5.rb +17 -0
  190. data/smoke/module6.rb +40 -0
  191. data/smoke/module_function1.rb +4 -3
  192. data/smoke/module_function2.rb +4 -3
  193. data/smoke/multiple-include.rb +2 -1
  194. data/smoke/multiple-superclass.rb +1 -1
  195. data/smoke/next1.rb +3 -2
  196. data/smoke/next2.rb +2 -1
  197. data/smoke/object-send1.rb +4 -3
  198. data/smoke/object-send2.rb +10 -0
  199. data/smoke/object-send3.rb +18 -0
  200. data/smoke/once.rb +2 -1
  201. data/smoke/optional1.rb +2 -1
  202. data/smoke/optional2.rb +2 -1
  203. data/smoke/optional3.rb +2 -1
  204. data/smoke/parameterizedd-self.rb +4 -2
  205. data/smoke/parameterizedd-self2.rb +1 -1
  206. data/smoke/pathname1.rb +2 -1
  207. data/smoke/pathname2.rb +2 -1
  208. data/smoke/pattern-match1.rb +2 -1
  209. data/smoke/pattern-match2.rb +2 -1
  210. data/smoke/prepend1.rb +33 -0
  211. data/smoke/prepend2.rb +10 -0
  212. data/smoke/prepend2.rbs +9 -0
  213. data/smoke/primitive_method.rb +19 -0
  214. data/smoke/printf.rb +2 -2
  215. data/smoke/proc.rb +3 -2
  216. data/smoke/proc2.rb +2 -1
  217. data/smoke/proc3.rb +2 -1
  218. data/smoke/proc4.rb +2 -1
  219. data/smoke/proc5.rb +19 -0
  220. data/smoke/public.rb +38 -0
  221. data/smoke/range.rb +2 -1
  222. data/smoke/rbs-alias.rb +2 -1
  223. data/smoke/rbs-attr.rb +6 -5
  224. data/smoke/rbs-attr2.rb +1 -1
  225. data/smoke/rbs-extend.rb +2 -1
  226. data/smoke/rbs-interface.rb +5 -4
  227. data/smoke/rbs-module.rb +26 -0
  228. data/smoke/rbs-module.rbs +4 -0
  229. data/smoke/rbs-opt-and-rest.rb +10 -0
  230. data/smoke/rbs-opt-and-rest.rbs +3 -0
  231. data/smoke/rbs-proc1.rb +2 -1
  232. data/smoke/rbs-proc2.rb +3 -2
  233. data/smoke/rbs-proc3.rb +2 -1
  234. data/smoke/rbs-record.rb +3 -2
  235. data/smoke/rbs-tyvar.rb +3 -2
  236. data/smoke/rbs-tyvar2.rb +3 -2
  237. data/smoke/rbs-tyvar3.rb +3 -2
  238. data/smoke/rbs-tyvar4.rb +4 -3
  239. data/smoke/rbs-tyvar5.rb +2 -1
  240. data/smoke/rbs-tyvar6.rb +4 -3
  241. data/smoke/rbs-tyvar7.rb +2 -1
  242. data/smoke/rbs-vars.rb +7 -6
  243. data/smoke/redo1.rb +3 -2
  244. data/smoke/redo2.rb +3 -2
  245. data/smoke/req-keyword.rb +2 -1
  246. data/smoke/rescue1.rb +3 -2
  247. data/smoke/rescue2.rb +3 -2
  248. data/smoke/rescue3.rb +20 -0
  249. data/smoke/rescue4.rb +17 -0
  250. data/smoke/respond_to.rb +2 -1
  251. data/smoke/rest-farg.rb +2 -1
  252. data/smoke/rest1.rb +3 -2
  253. data/smoke/rest2.rb +2 -1
  254. data/smoke/rest3.rb +7 -6
  255. data/smoke/rest4.rb +3 -2
  256. data/smoke/rest5.rb +2 -1
  257. data/smoke/rest6.rb +2 -1
  258. data/smoke/retry1.rb +3 -2
  259. data/smoke/return.rb +2 -1
  260. data/smoke/simple.rb +12 -0
  261. data/smoke/singleton_method.rb +1 -1
  262. data/smoke/step.rb +4 -3
  263. data/smoke/string-split.rb +2 -1
  264. data/smoke/struct-keyword_init.rb +10 -0
  265. data/smoke/struct.rb +1 -1
  266. data/smoke/struct2.rb +5 -4
  267. data/smoke/struct3.rb +2 -2
  268. data/smoke/struct4.rb +7 -0
  269. data/smoke/struct5.rb +16 -0
  270. data/smoke/struct6.rb +15 -0
  271. data/smoke/struct7.rb +17 -0
  272. data/smoke/stub-keyword.rb +10 -0
  273. data/smoke/super1.rb +5 -4
  274. data/smoke/super2.rb +1 -1
  275. data/smoke/super3.rb +4 -3
  276. data/smoke/super4.rb +7 -5
  277. data/smoke/super5.rb +6 -4
  278. data/smoke/svar1.rb +2 -1
  279. data/smoke/symbol-proc-attr.rb +22 -0
  280. data/smoke/symbol-proc-attr2.rb +15 -0
  281. data/smoke/symbol-proc-bot.rb +13 -0
  282. data/smoke/symbol-proc.rb +4 -3
  283. data/smoke/tap1.rb +3 -2
  284. data/smoke/toplevel.rb +2 -1
  285. data/smoke/two-map.rb +3 -2
  286. data/smoke/type_var.rb +4 -3
  287. data/smoke/typed_method.rb +2 -1
  288. data/smoke/uninitialize-var.rb +2 -1
  289. data/smoke/union-recv.rb +2 -2
  290. data/smoke/user-demo.rb +3 -3
  291. data/smoke/wrong-extend.rb +3 -2
  292. data/smoke/wrong-include.rb +3 -2
  293. data/smoke/wrong-include2.rb +17 -0
  294. data/typeprof.gemspec +1 -1
  295. metadata +57 -5
  296. data/tools/stackprof-wrapper.rb +0 -10
@@ -3,6 +3,7 @@ module TypeProf
3
3
  class ActualArguments
4
4
  def initialize(lead_tys, rest_ty, kw_tys, blk_ty)
5
5
  @lead_tys = lead_tys
6
+ raise unless lead_tys
6
7
  @rest_ty = rest_ty
7
8
  @kw_tys = kw_tys # kw_tys should be {:key1 => Type, :key2 => Type, ...} or {nil => Type}
8
9
  raise if !kw_tys.is_a?(::Hash)
@@ -58,6 +59,7 @@ module TypeProf
58
59
  subst = Type.merge_substitution(subst, subst2)
59
60
  end
60
61
  msig.opt_tys.each do |farg|
62
+ break if aargs.empty?
61
63
  aarg = aargs.shift
62
64
  return nil unless subst2 = Type.match?(aarg, farg)
63
65
  subst = Type.merge_substitution(subst, subst2)
@@ -29,7 +29,10 @@ module TypeProf
29
29
 
30
30
  def do_call(aargs, caller_ep, caller_env, scratch, replace_recv_ty:, &ctn)
31
31
  blk_env = scratch.return_envs[@outer_ep]
32
- blk_env = blk_env.replace_recv_ty(replace_recv_ty) if replace_recv_ty
32
+ if replace_recv_ty
33
+ replace_recv_ty = scratch.globalize_type(replace_recv_ty, caller_env, caller_ep)
34
+ blk_env = blk_env.replace_recv_ty(replace_recv_ty)
35
+ end
33
36
  aargs = scratch.globalize_type(aargs, caller_env, caller_ep)
34
37
 
35
38
  scratch.add_block_signature!(self, aargs.to_block_signature)
@@ -119,11 +122,12 @@ module TypeProf
119
122
  def do_call(aargs, caller_ep, caller_env, scratch, replace_recv_ty:, &ctn)
120
123
  if aargs.lead_tys.size >= 1
121
124
  recv = aargs.lead_tys[0]
125
+ recv = Type.any if recv == Type.bot
122
126
  aargs = ActualArguments.new(aargs.lead_tys[1..], aargs.rest_ty, aargs.kw_tys, aargs.blk_ty)
123
127
  elsif aargs.rest_ty
124
128
  recv = aargs.rest_ty.elems.squash_or_any # XXX: need to shift
125
129
  else
126
- raise
130
+ recv = Type.any
127
131
  end
128
132
 
129
133
  scratch.add_block_signature!(self, aargs.to_block_signature)
@@ -133,4 +137,38 @@ module TypeProf
133
137
  end
134
138
  end
135
139
  end
140
+
141
+ class CustomBlock < Block
142
+ def initialize(caller_ep, mid, &blk)
143
+ @caller_ep = caller_ep
144
+ @mid = mid
145
+ @blk = blk
146
+ end
147
+
148
+ def inspect
149
+ "#<CustomBlock>"
150
+ end
151
+
152
+ def consistent?(other)
153
+ true # XXX
154
+ end
155
+
156
+ def substitute(_subst, _depth)
157
+ self
158
+ end
159
+
160
+ def do_call(aargs, caller_ep, caller_env, scratch, replace_recv_ty:, &ctn)
161
+ aargs = scratch.globalize_type(aargs, caller_env, caller_ep)
162
+
163
+ dummy_ctx = TypedContext.new(@caller_ep, @mid)
164
+
165
+ scratch.add_block_signature!(self, aargs.to_block_signature)
166
+ scratch.add_block_to_ctx!(self, dummy_ctx)
167
+
168
+ @blk.call(aargs, caller_ep, caller_env, scratch, replace_recv_ty: replace_recv_ty) do |ret_ty, ep, env|
169
+ scratch.add_return_value!(dummy_ctx, ret_ty)
170
+ ctn[ret_ty, ep, env]
171
+ end
172
+ end
173
+ end
136
174
  end
@@ -19,7 +19,7 @@ module TypeProf
19
19
  klass, new_mid, old_mid = aargs.lead_tys
20
20
  new_sym = get_sym("alias", new_mid, ep, scratch) or return
21
21
  old_sym = get_sym("alias", old_mid, ep, scratch) or return
22
- scratch.alias_method(klass, ep.ctx.cref.singleton, new_sym, old_sym)
22
+ scratch.alias_method(klass, ep.ctx.cref.singleton, new_sym, old_sym, ep)
23
23
  ctn[Type.nil, ep, env]
24
24
  end
25
25
 
@@ -82,14 +82,17 @@ module TypeProf
82
82
  end
83
83
 
84
84
  def object_is_a?(recv, mid, aargs, ep, env, scratch, &ctn)
85
- raise unless aargs.lead_tys.size != 0
86
- if recv.is_a?(Type::Instance)
87
- if recv.klass == aargs.lead_tys[0] # XXX: inheritance
88
- true_val = Type::Instance.new(Type::Builtin[:true])
89
- ctn[true_val, ep, env]
85
+ if aargs.lead_tys.size == 1
86
+ if recv.is_a?(Type::Instance)
87
+ if recv.klass == aargs.lead_tys[0] # XXX: inheritance
88
+ true_val = Type::Instance.new(Type::Builtin[:true])
89
+ ctn[true_val, ep, env]
90
+ else
91
+ false_val = Type::Instance.new(Type::Builtin[:false])
92
+ ctn[false_val, ep, env]
93
+ end
90
94
  else
91
- false_val = Type::Instance.new(Type::Builtin[:false])
92
- ctn[false_val, ep, env]
95
+ ctn[Type.bool, ep, env]
93
96
  end
94
97
  else
95
98
  ctn[Type.bool, ep, env]
@@ -97,16 +100,19 @@ module TypeProf
97
100
  end
98
101
 
99
102
  def object_respond_to?(recv, mid, aargs, ep, env, scratch, &ctn)
100
- raise unless aargs.lead_tys.size != 0
101
- sym = get_sym("respond_to?", aargs.lead_tys[0], ep, scratch)
102
- if sym
103
- klass, singleton = recv.method_dispatch_info
104
- if scratch.get_method(klass, singleton, sym)
105
- true_val = Type::Instance.new(Type::Builtin[:true])
106
- ctn[true_val, ep, env]
103
+ if aargs.lead_tys.size == 1
104
+ sym = get_sym("respond_to?", aargs.lead_tys[0], ep, scratch)
105
+ if sym
106
+ klass, singleton = recv.method_dispatch_info
107
+ if scratch.get_method(klass, singleton, sym)
108
+ true_val = Type::Instance.new(Type::Builtin[:true])
109
+ ctn[true_val, ep, env]
110
+ else
111
+ false_val = Type::Instance.new(Type::Builtin[:false])
112
+ ctn[false_val, ep, env]
113
+ end
107
114
  else
108
- false_val = Type::Instance.new(Type::Builtin[:false])
109
- ctn[false_val, ep, env]
115
+ ctn[Type.bool, ep, env]
110
116
  end
111
117
  else
112
118
  ctn[Type.bool, ep, env]
@@ -124,10 +130,12 @@ module TypeProf
124
130
  def object_send(recv, mid, aargs, ep, env, scratch, &ctn)
125
131
  if aargs.lead_tys.size >= 1
126
132
  mid_ty, = aargs.lead_tys
127
- else
133
+ elsif aargs.rest_ty
128
134
  mid_ty = aargs.rest_ty
135
+ else
136
+ return ctn[Type.any, ep, env]
129
137
  end
130
- aargs = ActualArguments.new(aargs.lead_tys[1..-1], aargs.rest_ty, aargs.kw_tys, aargs.blk_ty)
138
+ aargs = ActualArguments.new(aargs.lead_tys[1..] || [], aargs.rest_ty, aargs.kw_tys, aargs.blk_ty)
131
139
  found = false
132
140
  mid_ty.each_child do |mid|
133
141
  if mid.is_a?(Type::Symbol)
@@ -148,8 +156,70 @@ module TypeProf
148
156
  return
149
157
  end
150
158
  naargs = ActualArguments.new([recv], nil, {}, Type.nil)
151
- scratch.do_invoke_block(aargs.blk_ty, naargs, ep, env, replace_recv_ty: recv) do |_ret_ty, ep|
152
- ctn[recv, ep, scratch.return_envs[ep]]
159
+ nrecv = recv
160
+ nrecv = nrecv.base_type if nrecv.is_a?(Type::ContainerType)
161
+ scratch.do_invoke_block(aargs.blk_ty, naargs, ep, env, replace_recv_ty: nrecv) do |_ret_ty, ep|
162
+ ctn[recv, ep, env]
163
+ end
164
+ end
165
+
166
+ def object_enum_for(recv, mid, aargs, ep, env, scratch, &ctn)
167
+ if aargs.lead_tys.size >= 1
168
+ mid_ty, = aargs.lead_tys
169
+ naargs = ActualArguments.new(aargs.lead_tys[1..], aargs.rest_ty, aargs.kw_tys, aargs.blk_ty)
170
+ elsif aargs.rest_ty
171
+ mid_ty = aargs.rest_ty
172
+ naargs = aargs
173
+ else
174
+ mid_ty = Type::Symbol.new(:each, Type::Instance.new(Type::Builtin[:sym]))
175
+ naargs = aargs
176
+ end
177
+
178
+ elem_ty = Type.bot
179
+ enum_for_blk = CustomBlock.new(ep, mid) do |aargs, caller_ep, caller_env, scratch, replace_recv_ty:, &blk_ctn|
180
+ if aargs.lead_tys.size >= 1
181
+ elem_ty = elem_ty.union(aargs.lead_tys[0])
182
+ else
183
+ elem_ty = elem_ty.union(Type.any)
184
+ end
185
+ ctn[Type::Cell.new(Type::Cell::Elements.new([elem_ty, Type.any]), Type::Instance.new(Type::Builtin[:enumerator])), ep, env]
186
+ blk_ctn[Type.any, caller_ep, caller_env]
187
+ end
188
+ enum_for_blk_ty = Type::Proc.new(enum_for_blk, Type::Instance.new(Type::Builtin[:proc]))
189
+
190
+ naargs = ActualArguments.new(naargs.lead_tys, naargs.rest_ty, naargs.kw_tys, enum_for_blk_ty)
191
+ mid_ty.each_child do |mid|
192
+ if mid.is_a?(Type::Symbol)
193
+ mid = mid.sym
194
+ scratch.do_send(recv, mid, naargs, ep, env) do |_ret_ty, _ep|
195
+ ctn[Type::Cell.new(Type::Cell::Elements.new([elem_ty, Type.any]), Type::Instance.new(Type::Builtin[:enumerator])), ep, env]
196
+ end
197
+ end
198
+ end
199
+ end
200
+
201
+ def object_privitive_method(recv, mid, aargs, ep, env, scratch, &ctn)
202
+ ctn[Type::Symbol.new(ep.ctx.mid, Type::Instance.new(Type::Builtin[:sym])), ep, env]
203
+ end
204
+
205
+ def object_block_given?(recv, mid, aargs, ep, env, scratch, &ctn)
206
+ procs = Type.bot
207
+ no_proc = false
208
+ env.static_env.blk_ty.each_child do |blk_ty|
209
+ case blk_ty
210
+ when Type::Proc
211
+ procs = procs.union(blk_ty)
212
+ when Type.nil
213
+ no_proc = true
214
+ else
215
+ ctn[Type.bool, ep, env]
216
+ end
217
+ end
218
+ if procs != Type.bot
219
+ ctn[Type::Instance.new(Type::Builtin[:true]), ep, env.replace_blk_ty(procs)]
220
+ end
221
+ if no_proc
222
+ ctn[Type::Instance.new(Type::Builtin[:false]), ep, env.replace_blk_ty(Type.nil)]
153
223
  end
154
224
  end
155
225
 
@@ -159,10 +229,16 @@ module TypeProf
159
229
  ctn[Type.any, ep, env]
160
230
  return
161
231
  end
232
+
233
+ unless recv.is_a?(Type::Class)
234
+ # XXX: warn?
235
+ return ctn[Type.any, ep, env]
236
+ end
237
+
162
238
  arg = aargs.lead_tys[0]
163
239
  arg.each_child do |arg|
164
240
  if arg.is_a?(Type::Class)
165
- scratch.include_module(recv, arg, nil, false, ep.ctx.iseq.absolute_path)
241
+ scratch.mix_module(:after, recv, arg, nil, ep.ctx.cref.singleton, ep)
166
242
  end
167
243
  end
168
244
  ctn[recv, ep, env]
@@ -174,10 +250,38 @@ module TypeProf
174
250
  ctn[Type.any, ep, env]
175
251
  return
176
252
  end
253
+
254
+ unless recv.is_a?(Type::Class)
255
+ # XXX: warn?
256
+ return ctn[Type.any, ep, env]
257
+ end
258
+
259
+ arg = aargs.lead_tys[0]
260
+ arg.each_child do |arg|
261
+ if arg.is_a?(Type::Class)
262
+ # if ep.ctx.cref.singleton is true, the meta-meta level is ignored. Should we warn?
263
+ scratch.mix_module(:after, recv, arg, nil, true, ep)
264
+ end
265
+ end
266
+ ctn[recv, ep, env]
267
+ end
268
+
269
+ def module_prepend(recv, mid, aargs, ep, env, scratch, &ctn)
270
+ if aargs.lead_tys.size != 1
271
+ scratch.warn(ep, "Module#prepend without an argument is ignored")
272
+ ctn[Type.any, ep, env]
273
+ return
274
+ end
275
+
276
+ unless recv.is_a?(Type::Class)
277
+ # XXX: warn?
278
+ return ctn[Type.any, ep, env]
279
+ end
280
+
177
281
  arg = aargs.lead_tys[0]
178
282
  arg.each_child do |arg|
179
283
  if arg.is_a?(Type::Class)
180
- scratch.include_module(recv, arg, nil, true, ep.ctx.iseq.absolute_path)
284
+ scratch.mix_module(:before, recv, arg, nil, ep.ctx.cref.singleton, ep)
181
285
  end
182
286
  end
183
287
  ctn[recv, ep, env]
@@ -198,6 +302,46 @@ module TypeProf
198
302
  end
199
303
  end
200
304
 
305
+ def module_public(recv, mid, aargs, ep, env, scratch, &ctn)
306
+ if aargs.lead_tys.empty?
307
+ ctn[recv, ep, env.method_public_set(true)]
308
+ else
309
+ if recv.is_a?(Type::Class)
310
+ aargs.lead_tys.each do |aarg|
311
+ sym = get_sym("public", aarg, ep, scratch) or next
312
+ meths = scratch.get_method(recv, false, sym)
313
+ next unless meths
314
+ meths.each do |mdef|
315
+ mdef.pub_meth = true if mdef.respond_to?(:pub_meth=)
316
+ end
317
+ end
318
+ else
319
+ # XXX: warn?
320
+ end
321
+ ctn[recv, ep, env]
322
+ end
323
+ end
324
+
325
+ def module_private(recv, mid, aargs, ep, env, scratch, &ctn)
326
+ if aargs.lead_tys.empty?
327
+ ctn[recv, ep, env.method_public_set(false)]
328
+ else
329
+ if recv.is_a?(Type::Class)
330
+ aargs.lead_tys.each do |aarg|
331
+ sym = get_sym("private", aarg, ep, scratch) or next
332
+ meths = scratch.get_method(recv, false, sym)
333
+ next unless meths
334
+ meths.each do |mdef|
335
+ mdef.pub_meth = false if mdef.respond_to?(:pub_meth=)
336
+ end
337
+ end
338
+ else
339
+ # XXX: warn?
340
+ end
341
+ ctn[recv, ep, env]
342
+ end
343
+ end
344
+
201
345
  def module_define_method(recv, mid, aargs, ep, env, scratch, &ctn)
202
346
  if aargs.lead_tys.size != 1
203
347
  scratch.warn(ep, "Module#define with #{ aargs.lead_tys.size } argument is ignored")
@@ -206,23 +350,25 @@ module TypeProf
206
350
  end
207
351
 
208
352
  mid, = aargs.lead_tys
209
- if mid.is_a?(Type::Symbol)
210
- mid = mid.sym
211
- aargs.blk_ty.each_child do |blk_ty|
212
- if blk_ty.is_a?(Type::Proc)
213
- blk = blk_ty.block_body
214
- case blk
215
- when ISeqBlock
216
- scratch.do_define_iseq_method(ep, env, mid, blk.iseq, ep)
353
+ mid.each_child do |mid|
354
+ if mid.is_a?(Type::Symbol)
355
+ mid = mid.sym
356
+ aargs.blk_ty.each_child do |blk_ty|
357
+ if blk_ty.is_a?(Type::Proc)
358
+ blk = blk_ty.block_body
359
+ case blk
360
+ when ISeqBlock
361
+ scratch.do_define_iseq_method(ep, env, mid, blk.iseq, blk.outer_ep)
362
+ else
363
+ # XXX: what to do?
364
+ end
217
365
  else
218
366
  # XXX: what to do?
219
367
  end
220
- else
221
- # XXX: what to do?
222
368
  end
369
+ else
370
+ # XXX: what to do?
223
371
  end
224
- else
225
- # XXX: what to do?
226
372
  end
227
373
  ctn[Type.any, ep, env]
228
374
  end
@@ -231,7 +377,7 @@ module TypeProf
231
377
  aargs.lead_tys.each do |aarg|
232
378
  sym = get_sym("attr_accessor", aarg, ep, scratch) or next
233
379
  cref = ep.ctx.cref
234
- scratch.add_attr_method(cref.klass, ep.ctx.iseq.absolute_path, sym, :"@#{ sym }", :accessor)
380
+ scratch.add_attr_method(cref.klass, sym, :"@#{ sym }", :accessor, env.static_env.pub_meth, ep)
235
381
  end
236
382
  ctn[Type.nil, ep, env]
237
383
  end
@@ -240,7 +386,7 @@ module TypeProf
240
386
  aargs.lead_tys.each do |aarg|
241
387
  sym = get_sym("attr_reader", aarg, ep, scratch) or next
242
388
  cref = ep.ctx.cref
243
- scratch.add_attr_method(cref.klass, ep.ctx.iseq.absolute_path, sym, :"@#{ sym }", :reader)
389
+ scratch.add_attr_method(cref.klass, sym, :"@#{ sym }", :reader, env.static_env.pub_meth, ep)
244
390
  end
245
391
  ctn[Type.nil, ep, env]
246
392
  end
@@ -249,7 +395,7 @@ module TypeProf
249
395
  aargs.lead_tys.each do |aarg|
250
396
  sym = get_sym("attr_writer", aarg, ep, scratch) or next
251
397
  cref = ep.ctx.cref
252
- scratch.add_attr_method(cref.klass, ep.ctx.iseq.absolute_path, sym, :"@#{ sym }", :writer)
398
+ scratch.add_attr_method(cref.klass, sym, :"@#{ sym }", :writer, env.static_env.pub_meth, ep)
253
399
  end
254
400
  ctn[Type.nil, ep, env]
255
401
  end
@@ -291,14 +437,19 @@ module TypeProf
291
437
  return ctn[Type.any, ep, env] unless recv.is_a?(Type::Local) && recv.kind == Type::Array
292
438
 
293
439
  if aargs.lead_tys.size != 2
440
+ # XXX: Support `ary[idx, len] = val`
294
441
  #raise NotImplementedError # XXX
295
- ctn[Type.any, ep, env]
442
+ return ctn[Type.any, ep, env]
296
443
  end
297
444
 
298
445
  idx = aargs.lead_tys.first
299
446
  if idx.is_a?(Type::Literal)
300
447
  idx = idx.lit
301
- raise NotImplementedError if !idx.is_a?(Integer)
448
+ if !idx.is_a?(Integer)
449
+ # XXX: Support `ary[idx..end] = val`
450
+ #raise NotImplementedError # XXX
451
+ return ctn[Type.any, ep, env]
452
+ end
302
453
  else
303
454
  idx = nil
304
455
  end
@@ -335,6 +486,7 @@ module TypeProf
335
486
  recv.each_child do |recv|
336
487
  if recv.is_a?(Type::Local) && recv.kind == Type::Hash
337
488
  ty = scratch.get_hash_elem_type(env, ep, recv.id, idx)
489
+ ty = Type.nil if ty == Type.bot
338
490
  else
339
491
  ty = Type.any
340
492
  end
@@ -345,7 +497,11 @@ module TypeProf
345
497
  def hash_aset(recv, mid, aargs, ep, env, scratch, &ctn)
346
498
  return ctn[Type.any, ep, env] unless recv.is_a?(Type::Local) && recv.kind == Type::Hash
347
499
 
348
- raise NotImplementedError if aargs.lead_tys.size != 2
500
+ if aargs.lead_tys.size != 2
501
+ # XXX: error?
502
+ ctn[Type.any, ep, env]
503
+ return
504
+ end
349
505
 
350
506
  idx = aargs.lead_tys.first
351
507
  idx = scratch.globalize_type(idx, env, ep)
@@ -364,18 +520,7 @@ module TypeProf
364
520
  end
365
521
 
366
522
  def struct_initialize(recv, mid, aargs, ep, env, scratch, &ctn)
367
- recv = Type::Instance.new(recv)
368
- scratch.add_ivar_read!(recv, :_members, ep) do |member_ary_ty, ep|
369
- member_ary_ty.elems.lead_tys.zip(aargs.lead_tys) do |sym, ty|
370
- ty ||= Type.nil
371
- scratch.set_instance_variable(recv, sym.sym, ty, ep, env)
372
- end
373
- end
374
- ctn[recv, ep, env]
375
- end
376
-
377
- def struct_i_new(recv, mid, aargs, ep, env, scratch, &ctn)
378
- struct_klass = recv
523
+ struct_klass = recv.klass
379
524
  while struct_klass.superclass != Type::Builtin[:struct]
380
525
  struct_klass = struct_klass.superclass
381
526
  end
@@ -383,34 +528,57 @@ module TypeProf
383
528
  ctn[Type.any, ep, env]
384
529
  return
385
530
  end
386
- if struct_klass != recv
387
- scratch.add_ivar_read!(Type::Instance.new(struct_klass), :_members, ep) do |ty, ep|
388
- scratch.add_ivar_write!(Type::Instance.new(recv), :_members, ty, ep)
389
- end
390
- end
391
- meths = scratch.get_method(recv, false, :initialize)
392
- meths.flat_map do |meth|
393
- meth.do_send(recv, :initialize, aargs, ep, env, scratch) do |ret_ty, ep, env|
394
- ctn[Type::Instance.new(recv), ep, env]
531
+ scratch.add_ivar_read!(Type::Instance.new(struct_klass), :_keyword_init, ep) do |keyword_init, ep|
532
+ scratch.add_ivar_read!(Type::Instance.new(struct_klass), :_members, ep) do |member_ary_ty, ep|
533
+ next if member_ary_ty == Type.nil
534
+ if keyword_init == Type::Instance.new(Type::Builtin[:true])
535
+ # TODO: support kw_rest_ty
536
+ aargs.kw_tys.each do |key, val_ty|
537
+ found = false
538
+ member_ary_ty.elems.lead_tys.each do |sym|
539
+ if sym.sym == key
540
+ found = true
541
+ scratch.set_instance_variable(recv, sym.sym, val_ty, ep, env)
542
+ end
543
+ end
544
+ unless found
545
+ # TODO: what to do when not found?
546
+ end
547
+ end
548
+ else
549
+ member_ary_ty.elems.lead_tys.zip(aargs.lead_tys) do |sym, ty|
550
+ ty ||= Type.nil
551
+ scratch.set_instance_variable(recv, sym.sym, ty, ep, env)
552
+ end
553
+ end
395
554
  end
396
555
  end
556
+ ctn[recv, ep, env]
397
557
  end
398
558
 
399
559
  def struct_s_new(recv, mid, aargs, ep, env, scratch, &ctn)
400
560
  # TODO: keyword_init
401
561
 
562
+ keyword_init = false
563
+ if aargs.kw_tys && aargs.kw_tys[:keyword_init] # XXX: more canonical way to extract keyword...
564
+ if aargs.kw_tys[:keyword_init] == Type::Instance.new(Type::Builtin[:true])
565
+ keyword_init = true
566
+ end
567
+ end
568
+
402
569
  fields = aargs.lead_tys.map {|ty| get_sym("Struct.new", ty, ep, scratch) }.compact
403
570
  struct_klass = scratch.new_struct(ep)
404
571
 
405
- scratch.set_singleton_custom_method(struct_klass, :new, Builtin.method(:struct_i_new))
406
- scratch.set_singleton_custom_method(struct_klass, :[], Builtin.method(:struct_i_new))
572
+ scratch.set_singleton_custom_method(struct_klass, :new, Builtin.method(:object_s_new))
573
+ scratch.set_singleton_custom_method(struct_klass, :[], Builtin.method(:object_s_new))
407
574
  fields.each do |field|
408
- scratch.add_attr_method(struct_klass, ep.ctx.iseq.absolute_path, field, field, :accessor)
575
+ scratch.add_attr_method(struct_klass, field, field, :accessor, true, ep)
409
576
  end
410
577
  fields = fields.map {|field| Type::Symbol.new(field, Type::Instance.new(Type::Builtin[:sym])) }
411
578
  base_ty = Type::Instance.new(Type::Builtin[:ary])
412
579
  fields = Type::Array.new(Type::Array::Elements.new(fields), base_ty)
413
580
  scratch.add_ivar_write!(Type::Instance.new(struct_klass), :_members, fields, ep)
581
+ scratch.add_ivar_write!(Type::Instance.new(struct_klass), :_keyword_init, Type::Instance.new(Type::Builtin[:true]), ep) if keyword_init
414
582
  #set_singleton_custom_method(struct_klass, :members, Builtin.method(:...))
415
583
 
416
584
  ctn[struct_klass, ep, env]
@@ -459,11 +627,20 @@ module TypeProf
459
627
  end
460
628
 
461
629
  def kernel_require(recv, mid, aargs, ep, env, scratch, &ctn)
462
- raise NotImplementedError if aargs.lead_tys.size != 1
630
+ if aargs.lead_tys.size != 1
631
+ # XXX: handle correctly
632
+ ctn[Type.any, ep, env]
633
+ return
634
+ end
635
+
463
636
  feature = aargs.lead_tys.first
464
637
  if feature.is_a?(Type::Literal)
465
638
  feature = feature.lit
466
639
 
640
+ unless feature.is_a?(String)
641
+ return ctn[Type.any, ep, env]
642
+ end
643
+
467
644
  action, arg = Builtin.file_require(feature, scratch)
468
645
  case action
469
646
  when :do
@@ -473,22 +650,31 @@ module TypeProf
473
650
  ctn[result, ep, env]
474
651
  when :error
475
652
  scratch.warn(ep, arg)
476
- result = Type::Instance.new(Type.bool)
653
+ result = Type.bool
477
654
  ctn[result, ep, env]
478
655
  end
479
656
  else
480
657
  scratch.warn(ep, "require target cannot be identified statically")
481
- result = Type::Instance.new(Type.bool)
658
+ result = Type.bool
482
659
  ctn[result, ep, env]
483
660
  end
484
661
  end
485
662
 
486
663
  def kernel_require_relative(recv, mid, aargs, ep, env, scratch, &ctn)
487
- raise NotImplementedError if aargs.lead_tys.size != 1
664
+ if aargs.lead_tys.size != 1
665
+ # XXX: handle correctly
666
+ ctn[Type.any, ep, env]
667
+ return
668
+ end
669
+
488
670
  feature = aargs.lead_tys.first
489
671
  if feature.is_a?(Type::Literal)
490
672
  feature = feature.lit
491
673
 
674
+ unless feature.is_a?(String)
675
+ return ctn[Type.any, ep, env]
676
+ end
677
+
492
678
  if scratch.loaded_features[feature]
493
679
  result = Type::Instance.new(Type::Builtin[:false])
494
680
  return ctn[result, ep, env]
@@ -509,7 +695,12 @@ module TypeProf
509
695
  end
510
696
 
511
697
  def kernel_autoload(recv, mid, aargs, ep, env, scratch, &ctn)
512
- raise NotImplementedError if aargs.lead_tys.size != 2
698
+ if aargs.lead_tys.size != 2
699
+ # XXX: handle correctly
700
+ ctn[Type.any, ep, env]
701
+ return
702
+ end
703
+
513
704
  feature = aargs.lead_tys[1]
514
705
  if feature.is_a?(Type::Literal)
515
706
  feature = feature.lit
@@ -551,8 +742,8 @@ module TypeProf
551
742
  end
552
743
 
553
744
  def self.setup_initial_global_env(scratch)
554
- klass_basic_obj = scratch.new_class(nil, :BasicObject, [], :__root__, nil, nil) # cbase, name, superclass
555
- klass_obj = scratch.new_class(nil, :Object, [], klass_basic_obj, [], nil)
745
+ klass_basic_obj = scratch.new_class(nil, :BasicObject, [], :__root__, nil) # cbase, name, superclass
746
+ klass_obj = scratch.new_class(nil, :Object, [], klass_basic_obj, nil)
556
747
  scratch.add_constant(klass_obj, :Object, klass_obj, nil)
557
748
  scratch.add_constant(klass_obj, :BasicObject, klass_basic_obj, nil)
558
749
 
@@ -561,23 +752,26 @@ module TypeProf
561
752
 
562
753
  Import.import_builtin(scratch)
563
754
 
564
- Type::Builtin[:vmcore] = scratch.new_class(klass_obj, :VMCore, [], klass_obj, [], nil)
565
- Type::Builtin[:int] = scratch.get_constant(klass_obj, :Integer)
566
- Type::Builtin[:float] = scratch.get_constant(klass_obj, :Float)
567
- Type::Builtin[:rational] = scratch.get_constant(klass_obj, :Rational)
568
- Type::Builtin[:sym] = scratch.get_constant(klass_obj, :Symbol)
569
- Type::Builtin[:str] = scratch.get_constant(klass_obj, :String)
570
- Type::Builtin[:struct] = scratch.get_constant(klass_obj, :Struct)
571
- Type::Builtin[:ary] = scratch.get_constant(klass_obj, :Array)
572
- Type::Builtin[:hash] = scratch.get_constant(klass_obj, :Hash)
573
- Type::Builtin[:io] = scratch.get_constant(klass_obj, :IO)
574
- Type::Builtin[:proc] = scratch.get_constant(klass_obj, :Proc)
575
- Type::Builtin[:range] = scratch.get_constant(klass_obj, :Range)
576
- Type::Builtin[:regexp] = scratch.get_constant(klass_obj, :Regexp)
577
- Type::Builtin[:matchdata] = scratch.get_constant(klass_obj, :MatchData)
578
- Type::Builtin[:class] = scratch.get_constant(klass_obj, :Class)
579
- Type::Builtin[:module] = scratch.get_constant(klass_obj, :Module)
580
- Type::Builtin[:exc] = scratch.get_constant(klass_obj, :Exception)
755
+ Type::Builtin[:vmcore] = scratch.new_class(klass_obj, :VMCore, [], klass_obj, nil)
756
+ Type::Builtin[:int] = scratch.get_constant(klass_obj, :Integer)
757
+ Type::Builtin[:float] = scratch.get_constant(klass_obj, :Float)
758
+ Type::Builtin[:rational] = scratch.get_constant(klass_obj, :Rational)
759
+ Type::Builtin[:complex] = scratch.get_constant(klass_obj, :Complex)
760
+ Type::Builtin[:sym] = scratch.get_constant(klass_obj, :Symbol)
761
+ Type::Builtin[:str] = scratch.get_constant(klass_obj, :String)
762
+ Type::Builtin[:struct] = scratch.get_constant(klass_obj, :Struct)
763
+ Type::Builtin[:ary] = scratch.get_constant(klass_obj, :Array)
764
+ Type::Builtin[:hash] = scratch.get_constant(klass_obj, :Hash)
765
+ Type::Builtin[:io] = scratch.get_constant(klass_obj, :IO)
766
+ Type::Builtin[:proc] = scratch.get_constant(klass_obj, :Proc)
767
+ Type::Builtin[:range] = scratch.get_constant(klass_obj, :Range)
768
+ Type::Builtin[:regexp] = scratch.get_constant(klass_obj, :Regexp)
769
+ Type::Builtin[:matchdata] = scratch.get_constant(klass_obj, :MatchData)
770
+ Type::Builtin[:class] = scratch.get_constant(klass_obj, :Class)
771
+ Type::Builtin[:module] = scratch.get_constant(klass_obj, :Module)
772
+ Type::Builtin[:exc] = scratch.get_constant(klass_obj, :Exception)
773
+ Type::Builtin[:encoding] = scratch.get_constant(klass_obj, :Encoding)
774
+ Type::Builtin[:enumerator] = scratch.get_constant(klass_obj, :Enumerator)
581
775
 
582
776
  klass_vmcore = Type::Builtin[:vmcore]
583
777
  klass_ary = Type::Builtin[:ary]
@@ -592,21 +786,29 @@ module TypeProf
592
786
  scratch.set_custom_method(klass_vmcore, :"core#raise", Builtin.method(:vmcore_raise))
593
787
  scratch.set_custom_method(klass_vmcore, :lambda, Builtin.method(:lambda))
594
788
  scratch.set_singleton_custom_method(klass_obj, :"new", Builtin.method(:object_s_new))
595
- scratch.set_singleton_custom_method(klass_obj, :"attr_accessor", Builtin.method(:module_attr_accessor))
596
- scratch.set_singleton_custom_method(klass_obj, :"attr_reader", Builtin.method(:module_attr_reader))
597
- scratch.set_singleton_custom_method(klass_obj, :"attr_writer", Builtin.method(:module_attr_writer))
598
- scratch.set_custom_method(klass_obj, :p, Builtin.method(:kernel_p))
789
+ scratch.set_custom_method(klass_obj, :p, Builtin.method(:kernel_p), false)
599
790
  scratch.set_custom_method(klass_obj, :is_a?, Builtin.method(:object_is_a?))
600
791
  scratch.set_custom_method(klass_obj, :respond_to?, Builtin.method(:object_respond_to?))
601
792
  scratch.set_custom_method(klass_obj, :class, Builtin.method(:object_class))
602
793
  scratch.set_custom_method(klass_obj, :send, Builtin.method(:object_send))
603
794
  scratch.set_custom_method(klass_obj, :instance_eval, Builtin.method(:object_instance_eval))
604
- scratch.set_custom_method(klass_obj, :proc, Builtin.method(:lambda))
795
+ scratch.set_custom_method(klass_obj, :proc, Builtin.method(:lambda), false)
796
+ scratch.set_custom_method(klass_obj, :__method__, Builtin.method(:object_privitive_method), false)
797
+ scratch.set_custom_method(klass_obj, :block_given?, Builtin.method(:object_block_given?), false)
798
+
799
+ scratch.set_custom_method(klass_obj, :enum_for, Builtin.method(:object_enum_for))
800
+ scratch.set_custom_method(klass_obj, :to_enum, Builtin.method(:object_enum_for))
605
801
 
606
802
  scratch.set_custom_method(klass_module, :include, Builtin.method(:module_include))
607
803
  scratch.set_custom_method(klass_module, :extend, Builtin.method(:module_extend))
608
- scratch.set_custom_method(klass_module, :module_function, Builtin.method(:module_module_function))
804
+ scratch.set_custom_method(klass_module, :prepend, Builtin.method(:module_prepend))
805
+ scratch.set_custom_method(klass_module, :module_function, Builtin.method(:module_module_function), false)
806
+ scratch.set_custom_method(klass_module, :public, Builtin.method(:module_public), false)
807
+ scratch.set_custom_method(klass_module, :private, Builtin.method(:module_private), false)
609
808
  scratch.set_custom_method(klass_module, :define_method, Builtin.method(:module_define_method))
809
+ scratch.set_custom_method(klass_module, :"attr_accessor", Builtin.method(:module_attr_accessor))
810
+ scratch.set_custom_method(klass_module, :"attr_reader", Builtin.method(:module_attr_reader))
811
+ scratch.set_custom_method(klass_module, :"attr_writer", Builtin.method(:module_attr_writer))
610
812
 
611
813
  scratch.set_custom_method(klass_proc, :[], Builtin.method(:proc_call))
612
814
  scratch.set_custom_method(klass_proc, :call, Builtin.method(:proc_call))
@@ -621,10 +823,10 @@ module TypeProf
621
823
  scratch.set_custom_method(klass_struct, :initialize, Builtin.method(:struct_initialize))
622
824
  scratch.set_singleton_custom_method(klass_struct, :new, Builtin.method(:struct_s_new))
623
825
 
624
- scratch.set_custom_method(klass_obj, :require, Builtin.method(:kernel_require))
625
- scratch.set_custom_method(klass_obj, :require_relative, Builtin.method(:kernel_require_relative))
626
- scratch.set_custom_method(klass_obj, :Array, Builtin.method(:kernel_Array))
627
- scratch.set_custom_method(klass_obj, :autoload, Builtin.method(:kernel_autoload))
826
+ scratch.set_custom_method(klass_obj, :require, Builtin.method(:kernel_require), false)
827
+ scratch.set_custom_method(klass_obj, :require_relative, Builtin.method(:kernel_require_relative), false)
828
+ scratch.set_custom_method(klass_obj, :Array, Builtin.method(:kernel_Array), false)
829
+ scratch.set_custom_method(klass_obj, :autoload, Builtin.method(:kernel_autoload), false)
628
830
  scratch.set_custom_method(klass_module, :autoload, Builtin.method(:module_autoload))
629
831
 
630
832
  # remove BasicObject#method_missing