adlint 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (465) hide show
  1. data/AUTHORS +27 -0
  2. data/COPYING +674 -0
  3. data/ChangeLog +820 -0
  4. data/INSTALL +78 -0
  5. data/MANIFEST +464 -0
  6. data/NEWS +38 -0
  7. data/README +74 -0
  8. data/Rakefile +167 -0
  9. data/TODO +29 -0
  10. data/bin/adlint +141 -0
  11. data/bin/adlint_chk +129 -0
  12. data/bin/adlint_cma +122 -0
  13. data/bin/adlint_sma +129 -0
  14. data/bin/adlintize +286 -0
  15. data/etc/conf.d/fallback/cinit.erb +11 -0
  16. data/etc/conf.d/fallback/traits.erb +216 -0
  17. data/etc/conf.d/i686-cygwin/cinit-gcc_4.3.4.erb +149 -0
  18. data/etc/conf.d/i686-cygwin/traits-gcc_4.3.4.erb +227 -0
  19. data/etc/conf.d/i686-devkit/cinit-gcc_4.5.2.erb +224 -0
  20. data/etc/conf.d/i686-devkit/traits-gcc_4.5.2.erb +226 -0
  21. data/etc/conf.d/i686-linux/cinit-gcc_4.5.1.erb +219 -0
  22. data/etc/conf.d/i686-linux/traits-gcc_4.5.1.erb +224 -0
  23. data/etc/conf.d/i686-mingw/cinit-gcc_4.6.1.erb +234 -0
  24. data/etc/conf.d/i686-mingw/traits-gcc_4.6.1.erb +226 -0
  25. data/etc/conf.d/noarch/GNUmakefile.erb +119 -0
  26. data/etc/conf.d/noarch/adlint_all_bat.erb +9 -0
  27. data/etc/conf.d/noarch/adlint_all_sh.erb +10 -0
  28. data/etc/conf.d/noarch/pinit.erb +11 -0
  29. data/etc/mesg.d/en_US/messages.yml +784 -0
  30. data/etc/mesg.d/ja_JP/messages.yml +784 -0
  31. data/lib/adlint/analyzer.rb +294 -0
  32. data/lib/adlint/c/branch.rb +251 -0
  33. data/lib/adlint/c/builtin.rb +92 -0
  34. data/lib/adlint/c/code.rb +490 -0
  35. data/lib/adlint/c/const.rb +465 -0
  36. data/lib/adlint/c/conv.rb +212 -0
  37. data/lib/adlint/c/ctrlexpr.rb +949 -0
  38. data/lib/adlint/c/domain.rb +7499 -0
  39. data/lib/adlint/c/environ.rb +133 -0
  40. data/lib/adlint/c/expr.rb +1725 -0
  41. data/lib/adlint/c/format.rb +3209 -0
  42. data/lib/adlint/c/interp.rb +1740 -0
  43. data/lib/adlint/c/lexer.rb +241 -0
  44. data/lib/adlint/c/mediator.rb +313 -0
  45. data/lib/adlint/c/message.rb +13597 -0
  46. data/lib/adlint/c/metric.rb +765 -0
  47. data/lib/adlint/c/object.rb +1018 -0
  48. data/lib/adlint/c/parser.rb +3800 -0
  49. data/lib/adlint/c/parser.y +2054 -0
  50. data/lib/adlint/c/phase.rb +712 -0
  51. data/lib/adlint/c/resolver.rb +270 -0
  52. data/lib/adlint/c/scanner.rb +248 -0
  53. data/lib/adlint/c/scope.rb +74 -0
  54. data/lib/adlint/c/syntax.rb +4279 -0
  55. data/lib/adlint/c/type.rb +7506 -0
  56. data/lib/adlint/c/util.rb +91 -0
  57. data/lib/adlint/c/value.rb +2310 -0
  58. data/lib/adlint/c.rb +56 -0
  59. data/lib/adlint/code.rb +500 -0
  60. data/lib/adlint/cpp/code.rb +189 -0
  61. data/lib/adlint/cpp/constexpr.rb +721 -0
  62. data/lib/adlint/cpp/constexpr.y +389 -0
  63. data/lib/adlint/cpp/eval.rb +1012 -0
  64. data/lib/adlint/cpp/lexer.rb +860 -0
  65. data/lib/adlint/cpp/macro.rb +637 -0
  66. data/lib/adlint/cpp/message.rb +992 -0
  67. data/lib/adlint/cpp/phase.rb +176 -0
  68. data/lib/adlint/cpp/scanner.rb +93 -0
  69. data/lib/adlint/cpp/source.rb +169 -0
  70. data/lib/adlint/cpp/subst.rb +300 -0
  71. data/lib/adlint/cpp/syntax.rb +1412 -0
  72. data/lib/adlint/cpp/util.rb +97 -0
  73. data/lib/adlint/cpp.rb +43 -0
  74. data/lib/adlint/driver.rb +147 -0
  75. data/lib/adlint/error.rb +179 -0
  76. data/lib/adlint/lang.rb +97 -0
  77. data/lib/adlint/ld/message.rb +259 -0
  78. data/lib/adlint/ld/metric.rb +57 -0
  79. data/lib/adlint/ld/object.rb +542 -0
  80. data/lib/adlint/ld/phase.rb +193 -0
  81. data/lib/adlint/ld/typedef.rb +109 -0
  82. data/lib/adlint/ld/util.rb +88 -0
  83. data/lib/adlint/ld.rb +37 -0
  84. data/lib/adlint/lexer.rb +293 -0
  85. data/lib/adlint/message.rb +368 -0
  86. data/lib/adlint/metric.rb +805 -0
  87. data/lib/adlint/monitor.rb +144 -0
  88. data/lib/adlint/phase.rb +90 -0
  89. data/lib/adlint/prelude.rb +314 -0
  90. data/lib/adlint/report.rb +617 -0
  91. data/lib/adlint/source.rb +155 -0
  92. data/lib/adlint/symbol.rb +127 -0
  93. data/lib/adlint/token.rb +215 -0
  94. data/lib/adlint/traits.rb +643 -0
  95. data/lib/adlint/util.rb +524 -0
  96. data/lib/adlint/version.rb +71 -0
  97. data/lib/adlint.rb +66 -0
  98. data/share/HEADER +45 -0
  99. data/share/demo/Makefile +110 -0
  100. data/share/demo/ambig_operator/ambig_operator.c +289 -0
  101. data/share/demo/arg_points_unset/arg_points_unset.c +37 -0
  102. data/share/demo/array_range/array_range.c +62 -0
  103. data/share/demo/bad_bitfields/bad_bitfields.c +74 -0
  104. data/share/demo/bad_brace/bad_brace.c +19 -0
  105. data/share/demo/bad_charset/abcde$.h +0 -0
  106. data/share/demo/bad_charset/bad_charset.c +22 -0
  107. data/share/demo/bad_comment/bad_comment.c +3 -0
  108. data/share/demo/bad_const/bad_const.c +19 -0
  109. data/share/demo/bad_conv/bad_conv.c +48 -0
  110. data/share/demo/bad_indent/bad_indent.c +50 -0
  111. data/share/demo/bad_init/bad_init.c +49 -0
  112. data/share/demo/bad_macro/bad_macro.c +97 -0
  113. data/share/demo/bitwise_expr/bitwise_expr.c +19 -0
  114. data/share/demo/call_by_value/call_by_value.c +26 -0
  115. data/share/demo/cross_ref/cross_ref.c +21 -0
  116. data/share/demo/dangling_else/dangling_else.c +20 -0
  117. data/share/demo/dead_code/dead_code.c +237 -0
  118. data/share/demo/deep_nest/deep_nest.c +57 -0
  119. data/share/demo/dense_switch/dense_switch.c +62 -0
  120. data/share/demo/direct_recur/direct_recur.c +15 -0
  121. data/share/demo/div_by_zero/div_by_zero.c +35 -0
  122. data/share/demo/dos_source/dos_source.c +7 -0
  123. data/share/demo/funptr_cast/funptr_cast.c +26 -0
  124. data/share/demo/goto_stmt/goto_stmt.c +19 -0
  125. data/share/demo/id_hiding/id_hiding.c +19 -0
  126. data/share/demo/ill_defined/ill_defined.c +13 -0
  127. data/share/demo/implicit_conv/implicit_conv.c +60 -0
  128. data/share/demo/implicit_int/implicit_int.c +14 -0
  129. data/share/demo/incomplete_type/incomplete_type.c +49 -0
  130. data/share/demo/indirect_recur/indirect_recur_1.c +14 -0
  131. data/share/demo/indirect_recur/indirect_recur_1.h +7 -0
  132. data/share/demo/indirect_recur/indirect_recur_2.c +12 -0
  133. data/share/demo/indirect_recur/indirect_recur_2.h +6 -0
  134. data/share/demo/indirect_recur/indirect_recur_3.c +6 -0
  135. data/share/demo/indirect_recur/indirect_recur_3.h +6 -0
  136. data/share/demo/indirect_recur/indirect_recur_4.c +25 -0
  137. data/share/demo/intro_demo/intro_demo.c +76 -0
  138. data/share/demo/intro_demo/intro_demo.h +12 -0
  139. data/share/demo/intro_demo/useless_header.h +5 -0
  140. data/share/demo/invalid_call/invalid_call.c +32 -0
  141. data/share/demo/kandr_fundef/kandr_fundef.c +10 -0
  142. data/share/demo/line_comment/line_comment.c +12 -0
  143. data/share/demo/local_decl/local_decl.c +9 -0
  144. data/share/demo/logical_trick/logical_trick.c +36 -0
  145. data/share/demo/long_sym/long_sym.c +5 -0
  146. data/share/demo/loop_var/loop_var.c +92 -0
  147. data/share/demo/malloc_or_die/malloc_or_die.c +43 -0
  148. data/share/demo/may_be_null/may_be_null.c +52 -0
  149. data/share/demo/may_be_null_arith/may_be_null_arith.c +15 -0
  150. data/share/demo/may_be_unset/may_be_unset.c +34 -0
  151. data/share/demo/mmapped_io/mmapped_io.c +23 -0
  152. data/share/demo/multi_break/multi_break.c +33 -0
  153. data/share/demo/multi_decl/multi_decl_1.c +17 -0
  154. data/share/demo/multi_decl/multi_decl_1.h +6 -0
  155. data/share/demo/multi_decl/multi_decl_2.c +13 -0
  156. data/share/demo/multi_decl/multi_decl_2.h +6 -0
  157. data/share/demo/multi_decl/multi_decl_3.c +22 -0
  158. data/share/demo/multi_def/multi_def_1.c +36 -0
  159. data/share/demo/multi_def/multi_def_1.h +6 -0
  160. data/share/demo/multi_def/multi_def_2.c +22 -0
  161. data/share/demo/multi_def/multi_def_2.h +6 -0
  162. data/share/demo/multi_def/multi_def_3.c +6 -0
  163. data/share/demo/multi_typedef/multi_typedef.c +11 -0
  164. data/share/demo/multi_typedef/multi_typedef_1.h +1 -0
  165. data/share/demo/multi_typedef/multi_typedef_2.h +1 -0
  166. data/share/demo/must_be_false/must_be_false.c +53 -0
  167. data/share/demo/must_be_null/must_be_null.c +13 -0
  168. data/share/demo/must_be_null_arith/must_be_null_arith.c +14 -0
  169. data/share/demo/must_be_true/must_be_true.c +21 -0
  170. data/share/demo/no_eof_nl/no_eof_nl.c +4 -0
  171. data/share/demo/no_void_arg/no_void_arg.c +14 -0
  172. data/share/demo/null_stmt/null_stmt.c +19 -0
  173. data/share/demo/octal_const/octal_const.c +20 -0
  174. data/share/demo/output_by_param/output_by_param.c +17 -0
  175. data/share/demo/overflow/overflow.c +74 -0
  176. data/share/demo/press_release/press_release.c +40 -0
  177. data/share/demo/retn_lvar_addr/retn_lvar_addr.c +47 -0
  178. data/share/demo/shift_expr/shift_expr.c +14 -0
  179. data/share/demo/should_be_typedef/should_be_typedef.c +51 -0
  180. data/share/demo/static_paths/static_paths.c +153 -0
  181. data/share/demo/static_vars/static_vars.c +39 -0
  182. data/share/demo/tag_hiding/tag_hiding.c +18 -0
  183. data/share/demo/tricky_incdec/tricky_incdec.c +12 -0
  184. data/share/demo/undefined_macro/undefined_macro.c +17 -0
  185. data/share/demo/uninit_vars/uninit_vars.c +28 -0
  186. data/share/demo/union_type/union_type.c +23 -0
  187. data/share/demo/unmatch_decl/unmatch_decl_1.c +12 -0
  188. data/share/demo/unmatch_decl/unmatch_decl_1.h +8 -0
  189. data/share/demo/unmatch_decl/unmatch_decl_2.c +10 -0
  190. data/share/demo/unmatch_decl/unmatch_decl_2.h +8 -0
  191. data/share/demo/unmatch_decl/unmatch_decl_3.c +7 -0
  192. data/share/demo/unmatch_paren_macro/unmatch_paren_macro.c +15 -0
  193. data/share/demo/unreachable/unreachable.c +34 -0
  194. data/share/demo/useless_exp_funs/useless_exp_funs_1.c +14 -0
  195. data/share/demo/useless_exp_funs/useless_exp_funs_1.h +1 -0
  196. data/share/demo/useless_exp_funs/useless_exp_funs_2.c +6 -0
  197. data/share/demo/useless_exp_vars/useless_export_1.c +8 -0
  198. data/share/demo/useless_exp_vars/useless_export_1.h +1 -0
  199. data/share/demo/useless_exp_vars/useless_export_2.c +7 -0
  200. data/share/demo/useless_expr/useless_expr.c +17 -0
  201. data/share/demo/useless_funs/useless_funs_1.c +21 -0
  202. data/share/demo/useless_funs/useless_funs_1.h +8 -0
  203. data/share/demo/useless_funs/useless_funs_2.c +6 -0
  204. data/share/demo/useless_header/useless_header.c +9 -0
  205. data/share/demo/useless_header/useless_header_1.h +12 -0
  206. data/share/demo/useless_header/useless_header_2.h +6 -0
  207. data/share/demo/useless_header/useless_header_3.h +9 -0
  208. data/share/demo/useless_header/useless_header_4.h +3 -0
  209. data/share/demo/useless_vars/useless_vars.c +17 -0
  210. data/share/demo/va_funcall/va_funcall.c +25 -0
  211. data/share/demo/various_fundef/various_fundef.c +36 -0
  212. data/share/demo/wchar_wstring/wchar_wstring.c +7 -0
  213. data/share/demo/wrap_around/wrap_around.c +38 -0
  214. data/share/doc/Makefile +16 -0
  215. data/share/doc/adlint_on_adqua.png +0 -0
  216. data/share/doc/adlint_on_eclipse_en.png +0 -0
  217. data/share/doc/adlint_on_eclipse_ja.png +0 -0
  218. data/share/doc/adlint_on_vim_en.png +0 -0
  219. data/share/doc/adlint_on_vim_ja.png +0 -0
  220. data/share/doc/developers_guide_ja.html +171 -0
  221. data/share/doc/developers_guide_ja.texi +87 -0
  222. data/share/doc/gen_mesg_sections.rb +39 -0
  223. data/share/doc/samples/GNUmakefile +162 -0
  224. data/share/doc/samples/adlint_traits.yml +238 -0
  225. data/share/doc/texinfo.css +22 -0
  226. data/share/doc/users_guide_en.html +39975 -0
  227. data/share/doc/users_guide_en.texi +32640 -0
  228. data/share/doc/users_guide_ja.html +40505 -0
  229. data/share/doc/users_guide_ja.texi +33189 -0
  230. data/share/logo/adlint-110.png +0 -0
  231. data/share/logo/adlint-524.png +0 -0
  232. data/share/logo/adlint.svg +4637 -0
  233. data/share/sample/README +6 -0
  234. data/share/sample/bison-2.5/adlint/GNUmakefile +170 -0
  235. data/share/sample/bison-2.5/adlint/adlint_traits.yml +225 -0
  236. data/share/sample/bison-2.5/adlint/lib/GNUmakefile +198 -0
  237. data/share/sample/bison-2.5/adlint/lib/adlint_cinit.h +228 -0
  238. data/share/sample/bison-2.5/adlint/lib/adlint_pinit.h +21 -0
  239. data/share/sample/bison-2.5/adlint/lib/adlint_traits.yml +238 -0
  240. data/share/sample/bison-2.5/adlint/src/GNUmakefile +166 -0
  241. data/share/sample/bison-2.5/adlint/src/adlint_cinit.h +228 -0
  242. data/share/sample/bison-2.5/adlint/src/adlint_pinit.h +21 -0
  243. data/share/sample/bison-2.5/adlint/src/adlint_traits.yml +239 -0
  244. data/share/sample/ctags-5.8/adlint/GNUmakefile +169 -0
  245. data/share/sample/ctags-5.8/adlint/adlint_cinit.h +219 -0
  246. data/share/sample/ctags-5.8/adlint/adlint_pinit.h +13 -0
  247. data/share/sample/ctags-5.8/adlint/adlint_traits.yml +225 -0
  248. data/share/sample/flex-2.5.35/adlint/GNUmakefile +140 -0
  249. data/share/sample/flex-2.5.35/adlint/adlint_cinit.h +219 -0
  250. data/share/sample/flex-2.5.35/adlint/adlint_pinit.h +14 -0
  251. data/share/sample/flex-2.5.35/adlint/adlint_traits.yml +225 -0
  252. data/share/sample/ruby-1.9.3-p0/adlint/GNUmakefile +314 -0
  253. data/share/sample/ruby-1.9.3-p0/adlint/adlint_traits.yml +225 -0
  254. data/share/sample/ruby-1.9.3-p0/adlint/core/GNUmakefile +204 -0
  255. data/share/sample/ruby-1.9.3-p0/adlint/core/adlint_cinit.h +228 -0
  256. data/share/sample/ruby-1.9.3-p0/adlint/core/adlint_pinit.h +28 -0
  257. data/share/sample/ruby-1.9.3-p0/adlint/core/adlint_traits.yml +240 -0
  258. data/share/sample/ruby-1.9.3-p0/adlint/enc/GNUmakefile +163 -0
  259. data/share/sample/ruby-1.9.3-p0/adlint/enc/adlint_cinit.h +228 -0
  260. data/share/sample/ruby-1.9.3-p0/adlint/enc/adlint_pinit.h +24 -0
  261. data/share/sample/ruby-1.9.3-p0/adlint/enc/adlint_traits.yml +240 -0
  262. data/share/sample/ruby-1.9.3-p0/adlint/enc-trans/GNUmakefile +149 -0
  263. data/share/sample/ruby-1.9.3-p0/adlint/enc-trans/adlint_cinit.h +228 -0
  264. data/share/sample/ruby-1.9.3-p0/adlint/enc-trans/adlint_pinit.h +24 -0
  265. data/share/sample/ruby-1.9.3-p0/adlint/enc-trans/adlint_traits.yml +240 -0
  266. data/share/sample/ruby-1.9.3-p0/adlint/ext-bigdecimal/GNUmakefile +131 -0
  267. data/share/sample/ruby-1.9.3-p0/adlint/ext-bigdecimal/adlint_cinit.h +228 -0
  268. data/share/sample/ruby-1.9.3-p0/adlint/ext-bigdecimal/adlint_pinit.h +24 -0
  269. data/share/sample/ruby-1.9.3-p0/adlint/ext-bigdecimal/adlint_traits.yml +241 -0
  270. data/share/sample/ruby-1.9.3-p0/adlint/ext-continuation/GNUmakefile +131 -0
  271. data/share/sample/ruby-1.9.3-p0/adlint/ext-continuation/adlint_cinit.h +228 -0
  272. data/share/sample/ruby-1.9.3-p0/adlint/ext-continuation/adlint_pinit.h +24 -0
  273. data/share/sample/ruby-1.9.3-p0/adlint/ext-continuation/adlint_traits.yml +241 -0
  274. data/share/sample/ruby-1.9.3-p0/adlint/ext-coverage/GNUmakefile +131 -0
  275. data/share/sample/ruby-1.9.3-p0/adlint/ext-coverage/adlint_cinit.h +228 -0
  276. data/share/sample/ruby-1.9.3-p0/adlint/ext-coverage/adlint_pinit.h +24 -0
  277. data/share/sample/ruby-1.9.3-p0/adlint/ext-coverage/adlint_traits.yml +241 -0
  278. data/share/sample/ruby-1.9.3-p0/adlint/ext-curses/GNUmakefile +131 -0
  279. data/share/sample/ruby-1.9.3-p0/adlint/ext-curses/adlint_cinit.h +228 -0
  280. data/share/sample/ruby-1.9.3-p0/adlint/ext-curses/adlint_pinit.h +24 -0
  281. data/share/sample/ruby-1.9.3-p0/adlint/ext-curses/adlint_traits.yml +241 -0
  282. data/share/sample/ruby-1.9.3-p0/adlint/ext-date/GNUmakefile +134 -0
  283. data/share/sample/ruby-1.9.3-p0/adlint/ext-date/adlint_cinit.h +228 -0
  284. data/share/sample/ruby-1.9.3-p0/adlint/ext-date/adlint_pinit.h +24 -0
  285. data/share/sample/ruby-1.9.3-p0/adlint/ext-date/adlint_traits.yml +241 -0
  286. data/share/sample/ruby-1.9.3-p0/adlint/ext-dbm/GNUmakefile +131 -0
  287. data/share/sample/ruby-1.9.3-p0/adlint/ext-dbm/adlint_cinit.h +228 -0
  288. data/share/sample/ruby-1.9.3-p0/adlint/ext-dbm/adlint_pinit.h +24 -0
  289. data/share/sample/ruby-1.9.3-p0/adlint/ext-dbm/adlint_traits.yml +241 -0
  290. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest/GNUmakefile +131 -0
  291. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest/adlint_cinit.h +228 -0
  292. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest/adlint_pinit.h +24 -0
  293. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest/adlint_traits.yml +241 -0
  294. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-bubblebabble/GNUmakefile +131 -0
  295. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-bubblebabble/adlint_cinit.h +228 -0
  296. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-bubblebabble/adlint_pinit.h +24 -0
  297. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-bubblebabble/adlint_traits.yml +242 -0
  298. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-md5/GNUmakefile +132 -0
  299. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-md5/adlint_cinit.h +228 -0
  300. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-md5/adlint_pinit.h +24 -0
  301. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-md5/adlint_traits.yml +242 -0
  302. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-rmd160/GNUmakefile +132 -0
  303. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-rmd160/adlint_cinit.h +228 -0
  304. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-rmd160/adlint_pinit.h +24 -0
  305. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-rmd160/adlint_traits.yml +242 -0
  306. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-sha1/GNUmakefile +132 -0
  307. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-sha1/adlint_cinit.h +228 -0
  308. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-sha1/adlint_pinit.h +24 -0
  309. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-sha1/adlint_traits.yml +242 -0
  310. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-sha2/GNUmakefile +132 -0
  311. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-sha2/adlint_cinit.h +228 -0
  312. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-sha2/adlint_pinit.h +24 -0
  313. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-sha2/adlint_traits.yml +242 -0
  314. data/share/sample/ruby-1.9.3-p0/adlint/ext-dl/GNUmakefile +134 -0
  315. data/share/sample/ruby-1.9.3-p0/adlint/ext-dl/adlint_cinit.h +228 -0
  316. data/share/sample/ruby-1.9.3-p0/adlint/ext-dl/adlint_pinit.h +24 -0
  317. data/share/sample/ruby-1.9.3-p0/adlint/ext-dl/adlint_traits.yml +241 -0
  318. data/share/sample/ruby-1.9.3-p0/adlint/ext-dl-callback/GNUmakefile +140 -0
  319. data/share/sample/ruby-1.9.3-p0/adlint/ext-dl-callback/adlint_cinit.h +228 -0
  320. data/share/sample/ruby-1.9.3-p0/adlint/ext-dl-callback/adlint_pinit.h +24 -0
  321. data/share/sample/ruby-1.9.3-p0/adlint/ext-dl-callback/adlint_traits.yml +242 -0
  322. data/share/sample/ruby-1.9.3-p0/adlint/ext-etc/GNUmakefile +131 -0
  323. data/share/sample/ruby-1.9.3-p0/adlint/ext-etc/adlint_cinit.h +228 -0
  324. data/share/sample/ruby-1.9.3-p0/adlint/ext-etc/adlint_pinit.h +24 -0
  325. data/share/sample/ruby-1.9.3-p0/adlint/ext-etc/adlint_traits.yml +241 -0
  326. data/share/sample/ruby-1.9.3-p0/adlint/ext-fcntl/GNUmakefile +131 -0
  327. data/share/sample/ruby-1.9.3-p0/adlint/ext-fcntl/adlint_cinit.h +228 -0
  328. data/share/sample/ruby-1.9.3-p0/adlint/ext-fcntl/adlint_pinit.h +24 -0
  329. data/share/sample/ruby-1.9.3-p0/adlint/ext-fcntl/adlint_traits.yml +241 -0
  330. data/share/sample/ruby-1.9.3-p0/adlint/ext-fiber/GNUmakefile +131 -0
  331. data/share/sample/ruby-1.9.3-p0/adlint/ext-fiber/adlint_cinit.h +228 -0
  332. data/share/sample/ruby-1.9.3-p0/adlint/ext-fiber/adlint_pinit.h +24 -0
  333. data/share/sample/ruby-1.9.3-p0/adlint/ext-fiber/adlint_traits.yml +241 -0
  334. data/share/sample/ruby-1.9.3-p0/adlint/ext-fiddle/GNUmakefile +134 -0
  335. data/share/sample/ruby-1.9.3-p0/adlint/ext-fiddle/adlint_cinit.h +228 -0
  336. data/share/sample/ruby-1.9.3-p0/adlint/ext-fiddle/adlint_pinit.h +24 -0
  337. data/share/sample/ruby-1.9.3-p0/adlint/ext-fiddle/adlint_traits.yml +242 -0
  338. data/share/sample/ruby-1.9.3-p0/adlint/ext-gdbm/GNUmakefile +131 -0
  339. data/share/sample/ruby-1.9.3-p0/adlint/ext-gdbm/adlint_cinit.h +228 -0
  340. data/share/sample/ruby-1.9.3-p0/adlint/ext-gdbm/adlint_pinit.h +24 -0
  341. data/share/sample/ruby-1.9.3-p0/adlint/ext-gdbm/adlint_traits.yml +241 -0
  342. data/share/sample/ruby-1.9.3-p0/adlint/ext-iconv/GNUmakefile +131 -0
  343. data/share/sample/ruby-1.9.3-p0/adlint/ext-iconv/adlint_cinit.h +228 -0
  344. data/share/sample/ruby-1.9.3-p0/adlint/ext-iconv/adlint_pinit.h +24 -0
  345. data/share/sample/ruby-1.9.3-p0/adlint/ext-iconv/adlint_traits.yml +241 -0
  346. data/share/sample/ruby-1.9.3-p0/adlint/ext-io-console/GNUmakefile +131 -0
  347. data/share/sample/ruby-1.9.3-p0/adlint/ext-io-console/adlint_cinit.h +228 -0
  348. data/share/sample/ruby-1.9.3-p0/adlint/ext-io-console/adlint_pinit.h +24 -0
  349. data/share/sample/ruby-1.9.3-p0/adlint/ext-io-console/adlint_traits.yml +241 -0
  350. data/share/sample/ruby-1.9.3-p0/adlint/ext-io-nonblock/GNUmakefile +131 -0
  351. data/share/sample/ruby-1.9.3-p0/adlint/ext-io-nonblock/adlint_cinit.h +228 -0
  352. data/share/sample/ruby-1.9.3-p0/adlint/ext-io-nonblock/adlint_pinit.h +24 -0
  353. data/share/sample/ruby-1.9.3-p0/adlint/ext-io-nonblock/adlint_traits.yml +241 -0
  354. data/share/sample/ruby-1.9.3-p0/adlint/ext-io-wait/GNUmakefile +131 -0
  355. data/share/sample/ruby-1.9.3-p0/adlint/ext-io-wait/adlint_cinit.h +228 -0
  356. data/share/sample/ruby-1.9.3-p0/adlint/ext-io-wait/adlint_pinit.h +24 -0
  357. data/share/sample/ruby-1.9.3-p0/adlint/ext-io-wait/adlint_traits.yml +241 -0
  358. data/share/sample/ruby-1.9.3-p0/adlint/ext-json-generator/GNUmakefile +131 -0
  359. data/share/sample/ruby-1.9.3-p0/adlint/ext-json-generator/adlint_cinit.h +228 -0
  360. data/share/sample/ruby-1.9.3-p0/adlint/ext-json-generator/adlint_pinit.h +24 -0
  361. data/share/sample/ruby-1.9.3-p0/adlint/ext-json-generator/adlint_traits.yml +241 -0
  362. data/share/sample/ruby-1.9.3-p0/adlint/ext-json-parser/GNUmakefile +131 -0
  363. data/share/sample/ruby-1.9.3-p0/adlint/ext-json-parser/adlint_cinit.h +228 -0
  364. data/share/sample/ruby-1.9.3-p0/adlint/ext-json-parser/adlint_pinit.h +24 -0
  365. data/share/sample/ruby-1.9.3-p0/adlint/ext-json-parser/adlint_traits.yml +241 -0
  366. data/share/sample/ruby-1.9.3-p0/adlint/ext-mathn-complex/GNUmakefile +131 -0
  367. data/share/sample/ruby-1.9.3-p0/adlint/ext-mathn-complex/adlint_cinit.h +228 -0
  368. data/share/sample/ruby-1.9.3-p0/adlint/ext-mathn-complex/adlint_pinit.h +24 -0
  369. data/share/sample/ruby-1.9.3-p0/adlint/ext-mathn-complex/adlint_traits.yml +241 -0
  370. data/share/sample/ruby-1.9.3-p0/adlint/ext-mathn-rational/GNUmakefile +131 -0
  371. data/share/sample/ruby-1.9.3-p0/adlint/ext-mathn-rational/adlint_cinit.h +228 -0
  372. data/share/sample/ruby-1.9.3-p0/adlint/ext-mathn-rational/adlint_pinit.h +24 -0
  373. data/share/sample/ruby-1.9.3-p0/adlint/ext-mathn-rational/adlint_traits.yml +241 -0
  374. data/share/sample/ruby-1.9.3-p0/adlint/ext-nkf/GNUmakefile +131 -0
  375. data/share/sample/ruby-1.9.3-p0/adlint/ext-nkf/adlint_cinit.h +228 -0
  376. data/share/sample/ruby-1.9.3-p0/adlint/ext-nkf/adlint_pinit.h +24 -0
  377. data/share/sample/ruby-1.9.3-p0/adlint/ext-nkf/adlint_traits.yml +241 -0
  378. data/share/sample/ruby-1.9.3-p0/adlint/ext-openssl/GNUmakefile +162 -0
  379. data/share/sample/ruby-1.9.3-p0/adlint/ext-openssl/adlint_cinit.h +228 -0
  380. data/share/sample/ruby-1.9.3-p0/adlint/ext-openssl/adlint_pinit.h +24 -0
  381. data/share/sample/ruby-1.9.3-p0/adlint/ext-openssl/adlint_traits.yml +241 -0
  382. data/share/sample/ruby-1.9.3-p0/adlint/ext-pathname/GNUmakefile +131 -0
  383. data/share/sample/ruby-1.9.3-p0/adlint/ext-pathname/adlint_cinit.h +228 -0
  384. data/share/sample/ruby-1.9.3-p0/adlint/ext-pathname/adlint_pinit.h +24 -0
  385. data/share/sample/ruby-1.9.3-p0/adlint/ext-pathname/adlint_traits.yml +241 -0
  386. data/share/sample/ruby-1.9.3-p0/adlint/ext-psych/GNUmakefile +135 -0
  387. data/share/sample/ruby-1.9.3-p0/adlint/ext-psych/adlint_cinit.h +228 -0
  388. data/share/sample/ruby-1.9.3-p0/adlint/ext-psych/adlint_pinit.h +24 -0
  389. data/share/sample/ruby-1.9.3-p0/adlint/ext-psych/adlint_traits.yml +241 -0
  390. data/share/sample/ruby-1.9.3-p0/adlint/ext-pty/GNUmakefile +131 -0
  391. data/share/sample/ruby-1.9.3-p0/adlint/ext-pty/adlint_cinit.h +228 -0
  392. data/share/sample/ruby-1.9.3-p0/adlint/ext-pty/adlint_pinit.h +24 -0
  393. data/share/sample/ruby-1.9.3-p0/adlint/ext-pty/adlint_traits.yml +241 -0
  394. data/share/sample/ruby-1.9.3-p0/adlint/ext-racc-cparse/GNUmakefile +131 -0
  395. data/share/sample/ruby-1.9.3-p0/adlint/ext-racc-cparse/adlint_cinit.h +228 -0
  396. data/share/sample/ruby-1.9.3-p0/adlint/ext-racc-cparse/adlint_pinit.h +24 -0
  397. data/share/sample/ruby-1.9.3-p0/adlint/ext-racc-cparse/adlint_traits.yml +241 -0
  398. data/share/sample/ruby-1.9.3-p0/adlint/ext-readline/GNUmakefile +131 -0
  399. data/share/sample/ruby-1.9.3-p0/adlint/ext-readline/adlint_cinit.h +228 -0
  400. data/share/sample/ruby-1.9.3-p0/adlint/ext-readline/adlint_pinit.h +24 -0
  401. data/share/sample/ruby-1.9.3-p0/adlint/ext-readline/adlint_traits.yml +241 -0
  402. data/share/sample/ruby-1.9.3-p0/adlint/ext-ripper/GNUmakefile +131 -0
  403. data/share/sample/ruby-1.9.3-p0/adlint/ext-ripper/adlint_cinit.h +228 -0
  404. data/share/sample/ruby-1.9.3-p0/adlint/ext-ripper/adlint_pinit.h +24 -0
  405. data/share/sample/ruby-1.9.3-p0/adlint/ext-ripper/adlint_traits.yml +241 -0
  406. data/share/sample/ruby-1.9.3-p0/adlint/ext-sdbm/GNUmakefile +132 -0
  407. data/share/sample/ruby-1.9.3-p0/adlint/ext-sdbm/adlint_cinit.h +228 -0
  408. data/share/sample/ruby-1.9.3-p0/adlint/ext-sdbm/adlint_pinit.h +24 -0
  409. data/share/sample/ruby-1.9.3-p0/adlint/ext-sdbm/adlint_traits.yml +241 -0
  410. data/share/sample/ruby-1.9.3-p0/adlint/ext-socket/GNUmakefile +144 -0
  411. data/share/sample/ruby-1.9.3-p0/adlint/ext-socket/adlint_cinit.h +228 -0
  412. data/share/sample/ruby-1.9.3-p0/adlint/ext-socket/adlint_pinit.h +24 -0
  413. data/share/sample/ruby-1.9.3-p0/adlint/ext-socket/adlint_traits.yml +241 -0
  414. data/share/sample/ruby-1.9.3-p0/adlint/ext-stringio/GNUmakefile +131 -0
  415. data/share/sample/ruby-1.9.3-p0/adlint/ext-stringio/adlint_cinit.h +228 -0
  416. data/share/sample/ruby-1.9.3-p0/adlint/ext-stringio/adlint_pinit.h +24 -0
  417. data/share/sample/ruby-1.9.3-p0/adlint/ext-stringio/adlint_traits.yml +241 -0
  418. data/share/sample/ruby-1.9.3-p0/adlint/ext-strscan/GNUmakefile +131 -0
  419. data/share/sample/ruby-1.9.3-p0/adlint/ext-strscan/adlint_cinit.h +228 -0
  420. data/share/sample/ruby-1.9.3-p0/adlint/ext-strscan/adlint_pinit.h +24 -0
  421. data/share/sample/ruby-1.9.3-p0/adlint/ext-strscan/adlint_traits.yml +241 -0
  422. data/share/sample/ruby-1.9.3-p0/adlint/ext-syck/GNUmakefile +140 -0
  423. data/share/sample/ruby-1.9.3-p0/adlint/ext-syck/adlint_cinit.h +228 -0
  424. data/share/sample/ruby-1.9.3-p0/adlint/ext-syck/adlint_pinit.h +24 -0
  425. data/share/sample/ruby-1.9.3-p0/adlint/ext-syck/adlint_traits.yml +241 -0
  426. data/share/sample/ruby-1.9.3-p0/adlint/ext-syslog/GNUmakefile +131 -0
  427. data/share/sample/ruby-1.9.3-p0/adlint/ext-syslog/adlint_cinit.h +228 -0
  428. data/share/sample/ruby-1.9.3-p0/adlint/ext-syslog/adlint_pinit.h +24 -0
  429. data/share/sample/ruby-1.9.3-p0/adlint/ext-syslog/adlint_traits.yml +241 -0
  430. data/share/sample/ruby-1.9.3-p0/adlint/ext-zlib/GNUmakefile +131 -0
  431. data/share/sample/ruby-1.9.3-p0/adlint/ext-zlib/adlint_cinit.h +228 -0
  432. data/share/sample/ruby-1.9.3-p0/adlint/ext-zlib/adlint_pinit.h +24 -0
  433. data/share/sample/ruby-1.9.3-p0/adlint/ext-zlib/adlint_traits.yml +241 -0
  434. data/share/sample/screen-4.0.3/adlint/GNUmakefile +162 -0
  435. data/share/sample/screen-4.0.3/adlint/adlint_cinit.h +228 -0
  436. data/share/sample/screen-4.0.3/adlint/adlint_pinit.h +21 -0
  437. data/share/sample/screen-4.0.3/adlint/adlint_traits.yml +238 -0
  438. data/share/sample/vim-7.3/adlint/vim/GNUmakefile +185 -0
  439. data/share/sample/vim-7.3/adlint/vim/adlint_cinit.h +228 -0
  440. data/share/sample/vim-7.3/adlint/vim/adlint_pinit.h +25 -0
  441. data/share/sample/vim-7.3/adlint/vim/adlint_traits.yml +250 -0
  442. data/share/sample/vim-7.3/adlint/xxd/GNUmakefile +131 -0
  443. data/share/sample/vim-7.3/adlint/xxd/adlint_cinit.h +228 -0
  444. data/share/sample/vim-7.3/adlint/xxd/adlint_pinit.h +24 -0
  445. data/share/sample/vim-7.3/adlint/xxd/adlint_traits.yml +237 -0
  446. data/share/sample/zsh-4.3.15/adlint/GNUmakefile +146 -0
  447. data/share/sample/zsh-4.3.15/adlint/adlint_traits.yml +225 -0
  448. data/share/sample/zsh-4.3.15/adlint/builtins/GNUmakefile +132 -0
  449. data/share/sample/zsh-4.3.15/adlint/builtins/adlint_cinit.h +228 -0
  450. data/share/sample/zsh-4.3.15/adlint/builtins/adlint_pinit.h +24 -0
  451. data/share/sample/zsh-4.3.15/adlint/builtins/adlint_traits.yml +240 -0
  452. data/share/sample/zsh-4.3.15/adlint/core/GNUmakefile +153 -0
  453. data/share/sample/zsh-4.3.15/adlint/core/adlint_cinit.h +228 -0
  454. data/share/sample/zsh-4.3.15/adlint/core/adlint_pinit.h +23 -0
  455. data/share/sample/zsh-4.3.15/adlint/core/adlint_traits.yml +239 -0
  456. data/share/sample/zsh-4.3.15/adlint/modules/GNUmakefile +147 -0
  457. data/share/sample/zsh-4.3.15/adlint/modules/adlint_cinit.h +228 -0
  458. data/share/sample/zsh-4.3.15/adlint/modules/adlint_pinit.h +24 -0
  459. data/share/sample/zsh-4.3.15/adlint/modules/adlint_traits.yml +240 -0
  460. data/share/sample/zsh-4.3.15/adlint/zle/GNUmakefile +144 -0
  461. data/share/sample/zsh-4.3.15/adlint/zle/adlint_cinit.h +228 -0
  462. data/share/sample/zsh-4.3.15/adlint/zle/adlint_pinit.h +24 -0
  463. data/share/sample/zsh-4.3.15/adlint/zle/adlint_traits.yml +239 -0
  464. data/spec/MUST_WRITE_SPECS_WITH_RSPEC +0 -0
  465. metadata +532 -0
@@ -0,0 +1,949 @@
1
+ # Controlling expression of selection-statements and iteration-statements.
2
+ #
3
+ # Author:: Yutaka Yanoh <mailto:yanoh@users.sourceforge.net>
4
+ # Copyright:: Copyright (C) 2010-2012, OGIS-RI Co.,Ltd.
5
+ # License:: GPLv3+: GNU General Public License version 3 or later
6
+ #
7
+ # Owner:: Yutaka Yanoh <mailto:yanoh@users.sourceforge.net>
8
+
9
+ #--
10
+ # ___ ____ __ ___ _________
11
+ # / | / _ |/ / / / | / /__ __/ Source Code Static Analyzer
12
+ # / /| | / / / / / / / |/ / / / AdLint - Advanced Lint
13
+ # / __ |/ /_/ / /___/ / /| / / /
14
+ # /_/ |_|_____/_____/_/_/ |_/ /_/ Copyright (C) 2010-2012, OGIS-RI Co.,Ltd.
15
+ #
16
+ # This file is part of AdLint.
17
+ #
18
+ # AdLint is free software: you can redistribute it and/or modify it under the
19
+ # terms of the GNU General Public License as published by the Free Software
20
+ # Foundation, either version 3 of the License, or (at your option) any later
21
+ # version.
22
+ #
23
+ # AdLint is distributed in the hope that it will be useful, but WITHOUT ANY
24
+ # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
25
+ # A PARTICULAR PURPOSE. See the GNU General Public License for more details.
26
+ #
27
+ # You should have received a copy of the GNU General Public License along with
28
+ # AdLint. If not, see <http://www.gnu.org/licenses/>.
29
+ #
30
+ #++
31
+
32
+ require "adlint/c/syntax"
33
+ require "adlint/c/object"
34
+ require "adlint/c/mediator"
35
+ require "adlint/c/expr"
36
+ require "adlint/c/conv"
37
+
38
+ module AdLint #:nodoc:
39
+ module C #:nodoc:
40
+
41
+ # == DESCRIPTION
42
+ # === Class structure
43
+ # ControllingExpression
44
+ # |
45
+ # +-> ValueDomainManipulator
46
+ # | <-- ValueDomainNarrower
47
+ # | <-- ValueDomainWidener
48
+ # |
49
+ # +-> ValueDomainNarrowing
50
+ # <-- ValueComparison
51
+ # <-- LogicalAnd
52
+ # <-- LogicalOr
53
+ # <-- StrictObjectDerivation
54
+ # <-- DelayedObjectDerivation
55
+ class ControllingExpression
56
+ def initialize(interpreter, branch)
57
+ @interpreter = interpreter
58
+ @branch = branch
59
+ @manipulators = []
60
+ end
61
+
62
+ def ensure_true_by_narrowing(expression = nil)
63
+ if expression
64
+ new_manip = ValueDomainNarrower.new(@interpreter, expression)
65
+ @manipulators.push(new_manip)
66
+ begin
67
+ if @branch.implicit_condition?
68
+ @interpreter._suppress_notification = true
69
+ end
70
+ new_manip.prepare!
71
+ ensure
72
+ if @branch.implicit_condition?
73
+ @interpreter._suppress_notification = false
74
+ end
75
+ end
76
+ else
77
+ new_manip =
78
+ WithoutExpressionValueDomainNarrower.new(@interpreter, @branch.group)
79
+ end
80
+
81
+ @manipulators.push(new_manip)
82
+ new_manip
83
+ end
84
+
85
+ def ensure_true_by_widening(expression = nil)
86
+ if expression
87
+ new_manip = ValueDomainWidener.new(@interpreter, expression)
88
+ begin
89
+ if @branch.implicit_condition?
90
+ @interpreter._suppress_notification = true
91
+ end
92
+ new_manip.prepare!
93
+ ensure
94
+ if @branch.implicit_condition?
95
+ @interpreter._suppress_notification = false
96
+ end
97
+ end
98
+ else
99
+ new_manip =
100
+ WithoutExpressionValueDomainWidener.new(@interpreter, @branch.group)
101
+ end
102
+
103
+ @manipulators.push(new_manip)
104
+ new_manip
105
+ end
106
+
107
+ def undo(path_terminated)
108
+ @manipulators.each { |manip| manip.rollback! } if path_terminated
109
+ end
110
+
111
+ def affected_variables
112
+ @manipulators.map { |manip| manip.affected_variables }.flatten.uniq
113
+ end
114
+
115
+ def save_affected_variables
116
+ @manipulators.each { |manip| manip.save! }
117
+ end
118
+
119
+ def restore_affected_variables
120
+ @manipulators.each { |manip| manip.restore! }
121
+ end
122
+ end
123
+
124
+ class ValueDomainManipulator < SyntaxTreeVisitor
125
+ include InterpreterMediator
126
+ include NotifierMediator
127
+ include Conversion
128
+ include ExpressionUtil
129
+ include MonitorUtil
130
+
131
+ def initialize(interpreter, expression)
132
+ @interpreter = interpreter
133
+ @expression = expression
134
+ @affected_variables = []
135
+ @narrowing = nil
136
+ @value_memory = nil
137
+ end
138
+
139
+ attr_reader :interpreter
140
+ attr_reader :affected_variables
141
+
142
+ def prepare!
143
+ if @expression
144
+ @narrowing = @expression.accept(self)
145
+ @narrowing.execute!
146
+ end
147
+ end
148
+
149
+ def commit!
150
+ if @narrowing
151
+ @narrowing.ensure_result_equal_to(ScalarValue.of_true)
152
+ end
153
+
154
+ commit_changes(@narrowing)
155
+
156
+ if @narrowing
157
+ @affected_variables = @narrowing.narrowed_values.each_key.to_a
158
+ @narrowing = nil
159
+ end
160
+ end
161
+
162
+ def rollback!
163
+ # NOTE: Rollback narrowed version to cut out the value-domain to enter
164
+ # the current branch.
165
+ @affected_variables.each { |variable| variable.value.rollback! }
166
+ end
167
+
168
+ def save!
169
+ @value_memory = {}
170
+ @affected_variables.each do |variable|
171
+ @value_memory[variable] = variable.value.to_single_value.dup
172
+ end
173
+ end
174
+
175
+ def restore!
176
+ if @value_memory
177
+ @value_memory.each do |variable, saved_value|
178
+ variable.assign!(saved_value)
179
+ end
180
+ @value_memory = nil
181
+ end
182
+ end
183
+
184
+ def self.def_strict_object_derivation(method_name)
185
+ class_eval <<-EOS
186
+ define_method("#{method_name}") do |*args|
187
+ StrictObjectDerivation.new(self, args.first)
188
+ end
189
+ EOS
190
+ end
191
+ private_class_method :def_strict_object_derivation
192
+
193
+ def_strict_object_derivation :visit_error_expression
194
+ def_strict_object_derivation :visit_object_specifier
195
+ def_strict_object_derivation :visit_constant_specifier
196
+ def_strict_object_derivation :visit_string_literal_specifier
197
+ def_strict_object_derivation :visit_null_constant_specifier
198
+
199
+ def visit_array_subscript_expression(node)
200
+ checkpoint(node.location)
201
+
202
+ base_narrowing = node.expression.accept(self)
203
+ subscript_narrowing = node.array_subscript.accept(self)
204
+
205
+ DelayedObjectDerivation.new(self, node,
206
+ base_narrowing, subscript_narrowing) do
207
+ checkpoint(node.location)
208
+
209
+ base_narrowing.execute!
210
+ subscript_narrowing.execute!
211
+
212
+ execute_array_subscript_expression(node, base_narrowing.result,
213
+ subscript_narrowing.result)
214
+ end
215
+ end
216
+
217
+ def visit_function_call_expression(node)
218
+ checkpoint(node.location)
219
+
220
+ object_narrowing = node.expression.accept(self)
221
+ arg_narrowings = node.argument_expressions.map { |expr|
222
+ expr.accept(self)
223
+ }
224
+
225
+ DelayedObjectDerivation.new(self, node,
226
+ object_narrowing, *arg_narrowings) do
227
+ checkpoint(node.location)
228
+
229
+ function_calling_context { object_narrowing.execute! }
230
+ args = arg_narrowings.map { |narrowing|
231
+ narrowing.execute!; [narrowing.result, narrowing.node]
232
+ }
233
+
234
+ execute_function_call_expression(node, object_narrowing.result, args)
235
+ end
236
+ end
237
+
238
+ def visit_member_access_by_value_expression(node)
239
+ checkpoint(node.location)
240
+
241
+ object_narrowing = node.expression.accept(self)
242
+
243
+ DelayedObjectDerivation.new(self, node, object_narrowing) do
244
+ checkpoint(node.location)
245
+
246
+ object_narrowing.execute!
247
+
248
+ execute_member_access_by_value_expression(
249
+ node, object_narrowing.result)
250
+ end
251
+ end
252
+
253
+ def visit_member_access_by_pointer_expression(node)
254
+ checkpoint(node.location)
255
+
256
+ object_narrowing = node.expression.accept(self)
257
+
258
+ DelayedObjectDerivation.new(self, node, object_narrowing) do
259
+ checkpoint(node.location)
260
+
261
+ object_narrowing.execute!
262
+
263
+ execute_member_access_by_pointer_expression(
264
+ node, object_narrowing.result)
265
+ end
266
+ end
267
+
268
+ def_strict_object_derivation :visit_bit_access_by_value_expression
269
+ def_strict_object_derivation :visit_bit_access_by_pointer_expression
270
+
271
+ def visit_postfix_increment_expression(node)
272
+ checkpoint(node.location)
273
+
274
+ object_narrowing = node.operand.accept(self)
275
+
276
+ DelayedObjectDerivation.new(self, node, object_narrowing) do
277
+ checkpoint(node.location)
278
+
279
+ variable_reassigning_context { object_narrowing.execute! }
280
+
281
+ execute_postfix_increment_expression(node, object_narrowing.result)
282
+ end
283
+ end
284
+
285
+ def visit_postfix_decrement_expression(node)
286
+ checkpoint(node.location)
287
+
288
+ object_narrowing = node.operand.accept(self)
289
+
290
+ DelayedObjectDerivation.new(self, node, object_narrowing) do
291
+ checkpoint(node.location)
292
+
293
+ variable_reassigning_context { object_narrowing.execute! }
294
+
295
+ execute_postfix_decrement_expression(node, object_narrowing.result)
296
+ end
297
+ end
298
+
299
+ def_strict_object_derivation :visit_compound_literal_expression
300
+
301
+ def visit_prefix_increment_expression(node)
302
+ checkpoint(node.location)
303
+
304
+ object_narrowing = node.operand.accept(self)
305
+
306
+ DelayedObjectDerivation.new(self, node, object_narrowing) do
307
+ checkpoint(node.location)
308
+
309
+ variable_reassigning_context { object_narrowing.execute! }
310
+
311
+ execute_prefix_increment_expression(node, object_narrowing.result)
312
+ end
313
+ end
314
+
315
+ def visit_prefix_decrement_expression(node)
316
+ checkpoint(node.location)
317
+
318
+ object_narrowing = node.operand.accept(self)
319
+
320
+ DelayedObjectDerivation.new(self, node, object_narrowing) do
321
+ checkpoint(node.location)
322
+
323
+ variable_reassigning_context { object_narrowing.execute! }
324
+
325
+ execute_prefix_decrement_expression(node, object_narrowing.result)
326
+ end
327
+ end
328
+
329
+ def_strict_object_derivation :visit_address_expression
330
+
331
+ def visit_indirection_expression(node)
332
+ checkpoint(node.location)
333
+
334
+ object_narrowing = node.operand.accept(self)
335
+
336
+ DelayedObjectDerivation.new(self, node, object_narrowing) do
337
+ checkpoint(node.location)
338
+
339
+ object_narrowing.execute!
340
+
341
+ execute_indirection_expression(node, object_narrowing.result)
342
+ end
343
+ end
344
+
345
+ def visit_unary_arithmetic_expression(node)
346
+ checkpoint(node.location)
347
+
348
+ object_narrowing = node.operand.accept(self)
349
+
350
+ DelayedObjectDerivation.new(self, node, object_narrowing) do
351
+ checkpoint(node.location)
352
+
353
+ object_narrowing.execute!
354
+
355
+ execute_unary_arithmetic_expression(node, object_narrowing.result)
356
+ end
357
+ end
358
+
359
+ def_strict_object_derivation :visit_sizeof_expression
360
+ def_strict_object_derivation :visit_sizeof_type_expression
361
+ def_strict_object_derivation :visit_alignof_expression
362
+ def_strict_object_derivation :visit_alignof_type_expression
363
+
364
+ def visit_cast_expression(node)
365
+ checkpoint(node.location)
366
+
367
+ object_narrowing = node.operand.accept(self)
368
+
369
+ DelayedObjectDerivation.new(self, node, object_narrowing) do
370
+ checkpoint(node.location)
371
+
372
+ object_narrowing.execute!
373
+
374
+ execute_cast_expression(node, object_narrowing.result)
375
+ end
376
+ end
377
+
378
+ def visit_multiplicative_expression(node)
379
+ checkpoint(node.location)
380
+
381
+ lhs_narrowing = node.lhs_operand.accept(self)
382
+ rhs_narrowing = node.rhs_operand.accept(self)
383
+
384
+ DelayedObjectDerivation.new(self, node, lhs_narrowing, rhs_narrowing) do
385
+ checkpoint(node.location)
386
+
387
+ lhs_narrowing.execute!
388
+ rhs_narrowing.execute!
389
+
390
+ execute_multiplicative_expression(
391
+ node, lhs_narrowing.result, rhs_narrowing.result)
392
+ end
393
+ end
394
+
395
+ def visit_additive_expression(node)
396
+ checkpoint(node.location)
397
+
398
+ lhs_narrowing = node.lhs_operand.accept(self)
399
+ rhs_narrowing = node.rhs_operand.accept(self)
400
+
401
+ DelayedObjectDerivation.new(self, node, lhs_narrowing, rhs_narrowing) do
402
+ checkpoint(node.location)
403
+
404
+ lhs_narrowing.execute!
405
+ rhs_narrowing.execute!
406
+
407
+ execute_additive_expression(
408
+ node, lhs_narrowing.result, rhs_narrowing.result)
409
+ end
410
+ end
411
+
412
+ def visit_shift_expression(node)
413
+ checkpoint(node.location)
414
+
415
+ lhs_narrowing = node.lhs_operand.accept(self)
416
+ rhs_narrowing = node.rhs_operand.accept(self)
417
+
418
+ DelayedObjectDerivation.new(self, node, lhs_narrowing, rhs_narrowing) do
419
+ checkpoint(node.location)
420
+
421
+ lhs_narrowing.execute!
422
+ rhs_narrowing.execute!
423
+
424
+ execute_shift_expression(
425
+ node, lhs_narrowing.result, rhs_narrowing.result)
426
+ end
427
+ end
428
+
429
+ def visit_relational_expression(node)
430
+ checkpoint(node.location)
431
+
432
+ lhs_narrowing = node.lhs_operand.accept(self)
433
+ rhs_narrowing = node.rhs_operand.accept(self)
434
+
435
+ ValueComparison.new(self, node, lhs_narrowing, rhs_narrowing)
436
+ end
437
+
438
+ def visit_equality_expression(node)
439
+ checkpoint(node.location)
440
+
441
+ lhs_narrowing = node.lhs_operand.accept(self)
442
+ rhs_narrowing = node.rhs_operand.accept(self)
443
+
444
+ ValueComparison.new(self, node, lhs_narrowing, rhs_narrowing)
445
+ end
446
+
447
+ def visit_and_expression(node)
448
+ checkpoint(node.location)
449
+
450
+ lhs_narrowing = node.lhs_operand.accept(self)
451
+ rhs_narrowing = node.rhs_operand.accept(self)
452
+
453
+ DelayedObjectDerivation.new(self, node, lhs_narrowing, rhs_narrowing) do
454
+ checkpoint(node.location)
455
+
456
+ lhs_narrowing.execute!
457
+ rhs_narrowing.execute!
458
+
459
+ execute_and_expression(node,
460
+ lhs_narrowing.result, rhs_narrowing.result)
461
+ end
462
+ end
463
+
464
+ def visit_exclusive_or_expression(node)
465
+ checkpoint(node.location)
466
+
467
+ lhs_narrowing = node.lhs_operand.accept(self)
468
+ rhs_narrowing = node.rhs_operand.accept(self)
469
+
470
+ DelayedObjectDerivation.new(self, node, lhs_narrowing, rhs_narrowing) do
471
+ checkpoint(node.location)
472
+
473
+ lhs_narrowing.execute!
474
+ rhs_narrowing.execute!
475
+
476
+ execute_exclusive_or_expression(
477
+ node, lhs_narrowing.result, rhs_narrowing.result)
478
+ end
479
+ end
480
+
481
+ def visit_inclusive_or_expression(node)
482
+ checkpoint(node.location)
483
+
484
+ lhs_narrowing = node.lhs_operand.accept(self)
485
+ rhs_narrowing = node.rhs_operand.accept(self)
486
+
487
+ DelayedObjectDerivation.new(self, node, lhs_narrowing, rhs_narrowing) do
488
+ checkpoint(node.location)
489
+
490
+ lhs_narrowing.execute!
491
+ rhs_narrowing.execute!
492
+
493
+ execute_inclusive_or_expression(
494
+ node, lhs_narrowing.result, rhs_narrowing.result)
495
+ end
496
+ end
497
+
498
+ def visit_logical_and_expression(node)
499
+ checkpoint(node.location)
500
+
501
+ lhs_narrowing = node.lhs_operand.accept(self)
502
+ rhs_narrowing = node.rhs_operand.accept(self)
503
+
504
+ LogicalAnd.new(self, node, lhs_narrowing, rhs_narrowing)
505
+ end
506
+
507
+ def visit_logical_or_expression(node)
508
+ checkpoint(node.location)
509
+
510
+ lhs_narrowing = node.lhs_operand.accept(self)
511
+ rhs_narrowing = node.rhs_operand.accept(self)
512
+
513
+ LogicalOr.new(self, node, lhs_narrowing, rhs_narrowing)
514
+ end
515
+
516
+ def_strict_object_derivation :visit_conditional_expression
517
+
518
+ def visit_simple_assignment_expression(node)
519
+ checkpoint(node.location)
520
+
521
+ lhs_narrowing = node.lhs_operand.accept(self)
522
+ rhs_narrowing = node.rhs_operand.accept(self)
523
+
524
+ DelayedObjectDerivation.new(self, node, lhs_narrowing, rhs_narrowing) do
525
+ checkpoint(node.location)
526
+
527
+ variable_reassigning_context { lhs_narrowing.execute! }
528
+ rhs_narrowing.execute!
529
+
530
+ execute_simple_assignment_expression(
531
+ node, lhs_narrowing.result, rhs_narrowing.result)
532
+ end
533
+ end
534
+
535
+ def visit_compound_assignment_expression(node)
536
+ checkpoint(node.location)
537
+
538
+ lhs_narrowing = node.lhs_operand.accept(self)
539
+ rhs_narrowing = node.rhs_operand.accept(self)
540
+
541
+ DelayedObjectDerivation.new(self, node, lhs_narrowing, rhs_narrowing) do
542
+ checkpoint(node.location)
543
+
544
+ variable_reassigning_context { lhs_narrowing.execute! }
545
+ rhs_narrowing.execute!
546
+
547
+ execute_compound_assignment_expression(
548
+ node, lhs_narrowing.result, rhs_narrowing.result)
549
+ end
550
+ end
551
+
552
+ def visit_comma_separated_expression(node)
553
+ checkpoint(node.location)
554
+
555
+ object_narrowings = node.expressions.map { |expr| expr.accept(self) }
556
+
557
+ DelayedObjectDerivation.new(self, node, *object_narrowings) do
558
+ checkpoint(node.location)
559
+
560
+ object_narrowings.map { |narrowing|
561
+ narrowing.execute!
562
+ narrowing.result
563
+ }.last
564
+ end
565
+ end
566
+
567
+ private
568
+ def commit_changes(narrowing)
569
+ subclass_responsibility
570
+ end
571
+ end
572
+
573
+ class ValueDomainNarrower < ValueDomainManipulator
574
+ private
575
+ def commit_changes(narrowing)
576
+ narrowing.narrowed_values.each do |variable, narrowed_value|
577
+ variable.narrow_value_domain!(:==, narrowed_value)
578
+ end
579
+ end
580
+ end
581
+
582
+ class ValueDomainWidener < ValueDomainManipulator
583
+ private
584
+ def commit_changes(narrowing)
585
+ narrowing.narrowed_values.each do |variable, narrowed_value|
586
+ variable.widen_value_domain!(:==, narrowed_value)
587
+ end
588
+ end
589
+ end
590
+
591
+ class WithoutExpressionValueDomainNarrower < ValueDomainManipulator
592
+ def initialize(interpreter, branch_group)
593
+ super(interpreter, nil)
594
+ @branch_group = branch_group
595
+ end
596
+
597
+ def prepare!
598
+ raise TypeError, "no preparation without expression."
599
+ end
600
+
601
+ private
602
+ def commit_changes(narrowing)
603
+ @branch_group.all_condition_variables.each do |variable|
604
+ variable.narrow_value_domain!(:==, variable.type.arbitrary_value)
605
+ end
606
+ true
607
+ end
608
+ end
609
+
610
+ class WithoutExpressionValueDomainWidener < ValueDomainManipulator
611
+ def initialize(interpreter, branch_group)
612
+ super(interpreter, nil)
613
+ @branch_group = branch_group
614
+ end
615
+
616
+ def prepare!
617
+ raise TypeError, "no preparation without expression."
618
+ end
619
+
620
+ private
621
+ def commit_changes(narrowing)
622
+ @branch_group.all_condition_variables.each do |variable|
623
+ variable.widen_value_domain!(:==, variable.type.arbitrary_value)
624
+ end
625
+ true
626
+ end
627
+ end
628
+
629
+ class ValueDomainNarrowing
630
+ include InterpreterMediator
631
+ include NotifierMediator
632
+ include Conversion
633
+
634
+ def initialize(value_domain_manipulator, node, *children)
635
+ @manipulator = value_domain_manipulator
636
+ @node = node
637
+ @children = children
638
+ @original_values = {}
639
+ @narrowed_values = {}
640
+ @result = nil
641
+ end
642
+
643
+ attr_reader :node
644
+ attr_reader :narrowed_values
645
+ attr_reader :result
646
+
647
+ def load_original_values!(narrowing)
648
+ @original_values = narrowing.narrowed_values
649
+ @children.each { |child| child.load_original_values!(narrowing) }
650
+ end
651
+
652
+ def execute!
653
+ @result = do_narrowing
654
+ @children.each do |narrowing|
655
+ @narrowed_values = narrowing.narrowed_values.merge(@narrowed_values)
656
+ end
657
+ end
658
+
659
+ def ensure_result_equal_to(value)
660
+ if @result.variable? && @result.designated_by_lvalue?
661
+ if @result.value.scalar? && value.scalar?
662
+ ensure_relation(@result, :==, value)
663
+ end
664
+ end
665
+ end
666
+
667
+ protected
668
+ attr_reader :original_values
669
+
670
+ private
671
+ def do_narrowing
672
+ subclass_responsibility
673
+ end
674
+
675
+ def do_logical_arithmetic_conversion(node, lhs_variable, rhs_variable)
676
+ lhs_result, rhs_result =
677
+ do_usual_arithmetic_conversion(lhs_variable, rhs_variable)
678
+
679
+ unless lhs_variable == lhs_result
680
+ notify_implicit_conv_performed(node.lhs_operand,
681
+ lhs_variable, lhs_result)
682
+ end
683
+
684
+ unless rhs_variable == rhs_result
685
+ notify_implicit_conv_performed(node.rhs_operand,
686
+ rhs_variable, rhs_result)
687
+ end
688
+
689
+ return lhs_result, rhs_result
690
+ end
691
+
692
+ def ensure_relation(variable, operator_symbol, value)
693
+ target_value = save_original_value(variable).dup
694
+ target_value.narrow_domain!(operator_symbol, value)
695
+ update_narrowed_value(variable, target_value)
696
+ end
697
+
698
+ def save_original_value(variable)
699
+ @original_values[variable.to_named_variable] ||= variable.value.dup
700
+ end
701
+
702
+ def original_value_of(variable)
703
+ @original_values[variable.to_named_variable]
704
+ end
705
+
706
+ def update_narrowed_value(variable, new_value)
707
+ @narrowed_values[variable.to_named_variable] = new_value
708
+ end
709
+
710
+ def narrowing_merge!(lhs_narrowing, rhs_narrowing)
711
+ lhs_values = lhs_narrowing.narrowed_values
712
+ rhs_values = rhs_narrowing.narrowed_values
713
+
714
+ @narrowed_values = lhs_values.merge(rhs_values) { |key, lhs_val, rhs_val|
715
+ result = lhs_val.dup
716
+ result.narrow_domain!(:==, rhs_val)
717
+ result
718
+ }
719
+ end
720
+
721
+ def widening_merge!(lhs_narrowing, rhs_narrowing)
722
+ lhs_values = lhs_narrowing.narrowed_values
723
+ rhs_values = rhs_narrowing.narrowed_values
724
+
725
+ @narrowed_values = lhs_values.merge(rhs_values) { |key, lhs_val, rhs_val|
726
+ result = lhs_val.dup
727
+ result.widen_domain!(:==, rhs_val)
728
+ result
729
+ }
730
+ end
731
+
732
+ def interpreter
733
+ # NOTE: This is private attr_reader for InterpreterMediator.
734
+ # This attribute is read via a normal method to suppress
735
+ # `private attribute?' warning.
736
+ @manipulator.interpreter
737
+ end
738
+ end
739
+
740
+ class ValueComparison < ValueDomainNarrowing
741
+ def initialize(value_domain_manip, node, lhs_narrowing, rhs_narrowing)
742
+ super
743
+ @operator_symbol = node.operator.type.to_sym
744
+ @lhs_narrowing = lhs_narrowing
745
+ @rhs_narrowing = rhs_narrowing
746
+ end
747
+
748
+ private
749
+ def do_narrowing
750
+ @lhs_narrowing.execute!
751
+ lhs_variable = object_to_variable(@lhs_narrowing.result)
752
+
753
+ @rhs_narrowing.execute!
754
+ rhs_variable = object_to_variable(@rhs_narrowing.result)
755
+
756
+ unless lhs_variable.type.scalar? && rhs_variable.type.scalar?
757
+ return temporary_variable(int_type)
758
+ end
759
+
760
+ unless lhs_variable.value.scalar? && rhs_variable.value.scalar?
761
+ return temporary_variable(int_type)
762
+ end
763
+
764
+ lhs_converted, rhs_converted =
765
+ do_logical_arithmetic_conversion(@node, lhs_variable, rhs_variable)
766
+
767
+ case @operator_symbol
768
+ when :==
769
+ result = temporary_variable(int_type,
770
+ lhs_converted.value == rhs_converted.value)
771
+ when :!=
772
+ result = temporary_variable(int_type,
773
+ lhs_converted.value != rhs_converted.value)
774
+ when :<
775
+ result = temporary_variable(int_type,
776
+ lhs_converted.value < rhs_converted.value)
777
+ when :>
778
+ result = temporary_variable(int_type,
779
+ lhs_converted.value > rhs_converted.value)
780
+ when :<=
781
+ result = temporary_variable(int_type,
782
+ lhs_converted.value <= rhs_converted.value)
783
+ when :>=
784
+ result = temporary_variable(int_type,
785
+ lhs_converted.value >= rhs_converted.value)
786
+ else
787
+ # NOTREACHED
788
+ end
789
+
790
+ notify_equality_expr_evaled(@node, lhs_converted, rhs_converted, result)
791
+
792
+ case
793
+ when lhs_converted.designated_by_lvalue?
794
+ ensure_relation(lhs_converted, @operator_symbol, rhs_converted.value)
795
+ when rhs_converted.designated_by_lvalue?
796
+ ensure_relation(rhs_converted, @operator_symbol, lhs_converted.value)
797
+ else
798
+ # NOTE: Domain of the rvalue should not be narrowed.
799
+ end
800
+
801
+ result
802
+ end
803
+ end
804
+
805
+ class LogicalAnd < ValueDomainNarrowing
806
+ def initialize(value_domain_manip, node, lhs_narrowing, rhs_narrowing)
807
+ super
808
+ @lhs_narrowing = lhs_narrowing
809
+ @rhs_narrowing = rhs_narrowing
810
+ end
811
+
812
+ private
813
+ def do_narrowing
814
+ @lhs_narrowing.execute!
815
+ @lhs_narrowing.ensure_result_equal_to(ScalarValue.of_true)
816
+ lhs_variable = object_to_variable(@lhs_narrowing.result)
817
+
818
+ # TODO: Must look about the short-circuit evaluation.
819
+ @rhs_narrowing.load_original_values!(@lhs_narrowing)
820
+ @rhs_narrowing.execute!
821
+ @rhs_narrowing.ensure_result_equal_to(ScalarValue.of_true)
822
+ rhs_variable = object_to_variable(@rhs_narrowing.result)
823
+
824
+ narrowing_merge!(@lhs_narrowing, @rhs_narrowing)
825
+
826
+ unless lhs_variable.type.scalar? && rhs_variable.type.scalar?
827
+ return temporary_variable(int_type)
828
+ end
829
+
830
+ unless lhs_variable.value.scalar? && rhs_variable.value.scalar?
831
+ return temporary_variable(int_type)
832
+ end
833
+
834
+ lhs_converted, rhs_converted =
835
+ do_logical_arithmetic_conversion(@node, lhs_variable, rhs_variable)
836
+
837
+ result = temporary_variable(
838
+ int_type, lhs_converted.value.logical_and(rhs_converted.value))
839
+ notify_logical_and_expr_evaled(@node,
840
+ lhs_converted, rhs_converted, result)
841
+ result
842
+ end
843
+ end
844
+
845
+ class LogicalOr < ValueDomainNarrowing
846
+ def initialize(value_domain_manip, node, lhs_narrowing, rhs_narrowing)
847
+ super
848
+ @lhs_narrowing = lhs_narrowing
849
+ @rhs_narrowing = rhs_narrowing
850
+ end
851
+
852
+ private
853
+ def do_narrowing
854
+ @lhs_narrowing.execute!
855
+ @lhs_narrowing.ensure_result_equal_to(ScalarValue.of_true)
856
+ lhs_variable = object_to_variable(@lhs_narrowing.result)
857
+
858
+ # TODO: Must look about the short-circuit evaluation.
859
+ # FIXME: Base value of the RHS narrowing should be updated to ensure that
860
+ # the LHS condition is false.
861
+ @rhs_narrowing.execute!
862
+ @rhs_narrowing.ensure_result_equal_to(ScalarValue.of_true)
863
+ rhs_variable = object_to_variable(@rhs_narrowing.result)
864
+
865
+ widening_merge!(@lhs_narrowing, @rhs_narrowing)
866
+
867
+ unless lhs_variable.type.scalar? && rhs_variable.type.scalar?
868
+ return temporary_variable(int_type)
869
+ end
870
+
871
+ unless lhs_variable.value.scalar? && rhs_variable.value.scalar?
872
+ return temporary_variable(int_type)
873
+ end
874
+
875
+ lhs_converted, rhs_converted =
876
+ do_logical_arithmetic_conversion(@node, lhs_variable, rhs_variable)
877
+
878
+ result = temporary_variable(
879
+ int_type, lhs_converted.value.logical_or(rhs_converted.value))
880
+ notify_logical_or_expr_evaled(@node,
881
+ lhs_converted, rhs_converted, result)
882
+ result
883
+ end
884
+ end
885
+
886
+ class StrictObjectDerivation < ValueDomainNarrowing
887
+ def initialize(value_domain_manipulator, node)
888
+ super(value_domain_manipulator, node)
889
+ @object = interpret(node)
890
+ end
891
+
892
+ private
893
+ def do_narrowing
894
+ if @object.variable? && @object.named?
895
+ if original_value = original_value_of(@object)
896
+ @object = PhantomVariable.new(@object, original_value)
897
+ end
898
+ end
899
+ @object
900
+ end
901
+ end
902
+
903
+ class DelayedObjectDerivation < ValueDomainNarrowing
904
+ def initialize(value_domain_manipulator, node, *children, &block)
905
+ super(value_domain_manipulator, node, *children)
906
+ @block = block
907
+ end
908
+
909
+ private
910
+ def do_narrowing
911
+ @block.call
912
+ end
913
+ end
914
+
915
+ class PhantomVariable < AliasVariable
916
+ def initialize(named_variable, phantom_value = nil)
917
+ super(named_variable)
918
+
919
+ @base_variable = named_variable
920
+ @phantom_value = phantom_value ?
921
+ phantom_value : named_variable.memory.read_modifiable.dup
922
+ end
923
+
924
+ def value
925
+ @phantom_value
926
+ end
927
+
928
+ def assign!(value)
929
+ @phantom_value = value
930
+ end
931
+
932
+ def to_named_variable
933
+ @base_variable.to_named_variable
934
+ end
935
+
936
+ def pretty_print(pp)
937
+ Summary.new(object_id, name, type, @phantom_value).pretty_print(pp)
938
+ end
939
+
940
+ Summary = Struct.new(:object_id, :name, :type, :value)
941
+
942
+ private
943
+ def modifiable_value
944
+ @phantom_value
945
+ end
946
+ end
947
+
948
+ end
949
+ end