typeprof 0.7.0 → 0.10.0

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