clojure 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (1378) hide show
  1. data/.document +5 -0
  2. data/.gitignore +21 -0
  3. data/LICENSE +23 -0
  4. data/README.rdoc +18 -0
  5. data/Rakefile +18 -0
  6. data/VERSION +1 -0
  7. data/bin/clj +13 -0
  8. data/epl-v10.html +261 -0
  9. data/lib/clojure/asm/AnnotationVisitor.class +0 -0
  10. data/lib/clojure/asm/AnnotationWriter.class +0 -0
  11. data/lib/clojure/asm/Attribute.class +0 -0
  12. data/lib/clojure/asm/ByteVector.class +0 -0
  13. data/lib/clojure/asm/ClassAdapter.class +0 -0
  14. data/lib/clojure/asm/ClassReader.class +0 -0
  15. data/lib/clojure/asm/ClassVisitor.class +0 -0
  16. data/lib/clojure/asm/ClassWriter.class +0 -0
  17. data/lib/clojure/asm/Edge.class +0 -0
  18. data/lib/clojure/asm/FieldVisitor.class +0 -0
  19. data/lib/clojure/asm/FieldWriter.class +0 -0
  20. data/lib/clojure/asm/Frame.class +0 -0
  21. data/lib/clojure/asm/Handler.class +0 -0
  22. data/lib/clojure/asm/Item.class +0 -0
  23. data/lib/clojure/asm/Label.class +0 -0
  24. data/lib/clojure/asm/MethodAdapter.class +0 -0
  25. data/lib/clojure/asm/MethodVisitor.class +0 -0
  26. data/lib/clojure/asm/MethodWriter.class +0 -0
  27. data/lib/clojure/asm/Opcodes.class +0 -0
  28. data/lib/clojure/asm/Type.class +0 -0
  29. data/lib/clojure/asm/commons/AdviceAdapter.class +0 -0
  30. data/lib/clojure/asm/commons/AnalyzerAdapter.class +0 -0
  31. data/lib/clojure/asm/commons/CodeSizeEvaluator.class +0 -0
  32. data/lib/clojure/asm/commons/EmptyVisitor.class +0 -0
  33. data/lib/clojure/asm/commons/GeneratorAdapter.class +0 -0
  34. data/lib/clojure/asm/commons/LocalVariablesSorter.class +0 -0
  35. data/lib/clojure/asm/commons/Method.class +0 -0
  36. data/lib/clojure/asm/commons/SerialVersionUIDAdder$Item.class +0 -0
  37. data/lib/clojure/asm/commons/SerialVersionUIDAdder.class +0 -0
  38. data/lib/clojure/asm/commons/StaticInitMerger.class +0 -0
  39. data/lib/clojure/asm/commons/TableSwitchGenerator.class +0 -0
  40. data/lib/clojure/core$_DOT__DOT___3630.class +0 -0
  41. data/lib/clojure/core$_EQ__EQ___3398.class +0 -0
  42. data/lib/clojure/core$_EQ___3291.class +0 -0
  43. data/lib/clojure/core$_GT__EQ___3390.class +0 -0
  44. data/lib/clojure/core$_GT___3382.class +0 -0
  45. data/lib/clojure/core$_LT__EQ___3374.class +0 -0
  46. data/lib/clojure/core$_LT___3366.class +0 -0
  47. data/lib/clojure/core$_PLUS___3332.class +0 -0
  48. data/lib/clojure/core$_SLASH___3350.class +0 -0
  49. data/lib/clojure/core$_STAR___3341.class +0 -0
  50. data/lib/clojure/core$__GT___3634.class +0 -0
  51. data/lib/clojure/core$___3358.class +0 -0
  52. data/lib/clojure/core$accessor__4294.class +0 -0
  53. data/lib/clojure/core$aclone__4211.class +0 -0
  54. data/lib/clojure/core$add_classpath__4707.class +0 -0
  55. data/lib/clojure/core$add_doc__5153.class +0 -0
  56. data/lib/clojure/core$add_watch__3697.class +0 -0
  57. data/lib/clojure/core$add_watcher__3703$fn__3705.class +0 -0
  58. data/lib/clojure/core$add_watcher__3703.class +0 -0
  59. data/lib/clojure/core$agent__3684.class +0 -0
  60. data/lib/clojure/core$agent_errors__3712.class +0 -0
  61. data/lib/clojure/core$aget__4217.class +0 -0
  62. data/lib/clojure/core$alength__4205.class +0 -0
  63. data/lib/clojure/core$alias__4367.class +0 -0
  64. data/lib/clojure/core$all_ns__4318.class +0 -0
  65. data/lib/clojure/core$alter__3759.class +0 -0
  66. data/lib/clojure/core$alter_meta_BANG___3750.class +0 -0
  67. data/lib/clojure/core$alter_var_root__4827.class +0 -0
  68. data/lib/clojure/core$amap__4725.class +0 -0
  69. data/lib/clojure/core$ancestors__4866$fn__4869.class +0 -0
  70. data/lib/clojure/core$ancestors__4866.class +0 -0
  71. data/lib/clojure/core$and__3308.class +0 -0
  72. data/lib/clojure/core$apply__3243.class +0 -0
  73. data/lib/clojure/core$areduce__4729.class +0 -0
  74. data/lib/clojure/core$array__4040.class +0 -0
  75. data/lib/clojure/core$array_map__4401.class +0 -0
  76. data/lib/clojure/core$aset__4224.class +0 -0
  77. data/lib/clojure/core$aset_boolean__4244.class +0 -0
  78. data/lib/clojure/core$aset_byte__4260.class +0 -0
  79. data/lib/clojure/core$aset_char__4264.class +0 -0
  80. data/lib/clojure/core$aset_double__4252.class +0 -0
  81. data/lib/clojure/core$aset_float__4248.class +0 -0
  82. data/lib/clojure/core$aset_int__4236.class +0 -0
  83. data/lib/clojure/core$aset_long__4240.class +0 -0
  84. data/lib/clojure/core$aset_short__4256.class +0 -0
  85. data/lib/clojure/core$asm_type__5683.class +0 -0
  86. data/lib/clojure/core$assert__4528.class +0 -0
  87. data/lib/clojure/core$assert_args__3659.class +0 -0
  88. data/lib/clojure/core$assoc__3148.class +0 -0
  89. data/lib/clojure/core$assoc_in__5075.class +0 -0
  90. data/lib/clojure/core$associative_QMARK___5102.class +0 -0
  91. data/lib/clojure/core$atom__3728.class +0 -0
  92. data/lib/clojure/core$await1__4014.class +0 -0
  93. data/lib/clojure/core$await__4007$count_down__4009.class +0 -0
  94. data/lib/clojure/core$await__4007.class +0 -0
  95. data/lib/clojure/core$await_for__4017$count_down__4019.class +0 -0
  96. data/lib/clojure/core$await_for__4017.class +0 -0
  97. data/lib/clojure/core$bases__4836.class +0 -0
  98. data/lib/clojure/core$bean__5303$fn__5305$fn__5307.class +0 -0
  99. data/lib/clojure/core$bean__5303$fn__5305.class +0 -0
  100. data/lib/clojure/core$bean__5303$fn__5321$thisfn__5323$fn__5324.class +0 -0
  101. data/lib/clojure/core$bean__5303$fn__5321$thisfn__5323.class +0 -0
  102. data/lib/clojure/core$bean__5303$fn__5321.class +0 -0
  103. data/lib/clojure/core$bean__5303$fn__5330.class +0 -0
  104. data/lib/clojure/core$bean__5303$fn__5333.class +0 -0
  105. data/lib/clojure/core$bean__5303$fn__5336.class +0 -0
  106. data/lib/clojure/core$bean__5303$fn__5339.class +0 -0
  107. data/lib/clojure/core$bean__5303$fn__5342.class +0 -0
  108. data/lib/clojure/core$bean__5303$fn__5346.class +0 -0
  109. data/lib/clojure/core$bean__5303$fn__5349.class +0 -0
  110. data/lib/clojure/core$bean__5303$snapshot__5315$fn__5317.class +0 -0
  111. data/lib/clojure/core$bean__5303$snapshot__5315.class +0 -0
  112. data/lib/clojure/core$bean__5303$v__5312.class +0 -0
  113. data/lib/clojure/core$bean__5303.class +0 -0
  114. data/lib/clojure/core$bigdec__4136.class +0 -0
  115. data/lib/clojure/core$bigint__4133.class +0 -0
  116. data/lib/clojure/core$binding__3672$var_ize__3674.class +0 -0
  117. data/lib/clojure/core$binding__3672.class +0 -0
  118. data/lib/clojure/core$bit_and__3509.class +0 -0
  119. data/lib/clojure/core$bit_and_not__3524.class +0 -0
  120. data/lib/clojure/core$bit_clear__3527.class +0 -0
  121. data/lib/clojure/core$bit_flip__3533.class +0 -0
  122. data/lib/clojure/core$bit_not__3503.class +0 -0
  123. data/lib/clojure/core$bit_or__3515.class +0 -0
  124. data/lib/clojure/core$bit_set__3530.class +0 -0
  125. data/lib/clojure/core$bit_shift_left__3539.class +0 -0
  126. data/lib/clojure/core$bit_shift_right__3542.class +0 -0
  127. data/lib/clojure/core$bit_test__3536.class +0 -0
  128. data/lib/clojure/core$bit_xor__3521.class +0 -0
  129. data/lib/clojure/core$boolean__4101.class +0 -0
  130. data/lib/clojure/core$bound_fn__4679$fn__4681.class +0 -0
  131. data/lib/clojure/core$bound_fn__4679.class +0 -0
  132. data/lib/clojure/core$butlast__3156.class +0 -0
  133. data/lib/clojure/core$byte__4089.class +0 -0
  134. data/lib/clojure/core$cast__3160.class +0 -0
  135. data/lib/clojure/core$char__4095.class +0 -0
  136. data/lib/clojure/core$class_QMARK___4824.class +0 -0
  137. data/lib/clojure/core$class__4043.class +0 -0
  138. data/lib/clojure/core$clear_agent_errors__3715.class +0 -0
  139. data/lib/clojure/core$clojure_version__5781.class +0 -0
  140. data/lib/clojure/core$coll_QMARK___5087.class +0 -0
  141. data/lib/clojure/core$comment__4501.class +0 -0
  142. data/lib/clojure/core$commute__3756.class +0 -0
  143. data/lib/clojure/core$comp__3775$fn__3777.class +0 -0
  144. data/lib/clojure/core$comp__3775.class +0 -0
  145. data/lib/clojure/core$comparator__3965$fn__3967.class +0 -0
  146. data/lib/clojure/core$comparator__3965.class +0 -0
  147. data/lib/clojure/core$compare__3304.class +0 -0
  148. data/lib/clojure/core$compare_and_set_BANG___3738.class +0 -0
  149. data/lib/clojure/core$compile__5065$fn__5067.class +0 -0
  150. data/lib/clojure/core$compile__5065.class +0 -0
  151. data/lib/clojure/core$complement__3551$fn__3553.class +0 -0
  152. data/lib/clojure/core$complement__3551.class +0 -0
  153. data/lib/clojure/core$concat__3255$cat__3269$fn__3270.class +0 -0
  154. data/lib/clojure/core$concat__3255$cat__3269.class +0 -0
  155. data/lib/clojure/core$concat__3255$fn__3257.class +0 -0
  156. data/lib/clojure/core$concat__3255$fn__3261.class +0 -0
  157. data/lib/clojure/core$concat__3255$fn__3265.class +0 -0
  158. data/lib/clojure/core$concat__3255.class +0 -0
  159. data/lib/clojure/core$cond__3237.class +0 -0
  160. data/lib/clojure/core$condp__5146$emit__5148.class +0 -0
  161. data/lib/clojure/core$condp__5146.class +0 -0
  162. data/lib/clojure/core$conj__3121.class +0 -0
  163. data/lib/clojure/core$cons__3107.class +0 -0
  164. data/lib/clojure/core$constantly__3560$fn__3562.class +0 -0
  165. data/lib/clojure/core$constantly__3560.class +0 -0
  166. data/lib/clojure/core$construct_proxy__5265.class +0 -0
  167. data/lib/clojure/core$contains_QMARK___3582.class +0 -0
  168. data/lib/clojure/core$count__3569.class +0 -0
  169. data/lib/clojure/core$counted_QMARK___5111.class +0 -0
  170. data/lib/clojure/core$create_ns__4312.class +0 -0
  171. data/lib/clojure/core$create_struct__4282.class +0 -0
  172. data/lib/clojure/core$ctor_sigs__5565$iter__5567__5569$fn__5570.class +0 -0
  173. data/lib/clojure/core$ctor_sigs__5565$iter__5567__5569.class +0 -0
  174. data/lib/clojure/core$ctor_sigs__5565.class +0 -0
  175. data/lib/clojure/core$cycle__3899$fn__3901.class +0 -0
  176. data/lib/clojure/core$cycle__3899.class +0 -0
  177. data/lib/clojure/core$dec__3422.class +0 -0
  178. data/lib/clojure/core$decimal_QMARK___4121.class +0 -0
  179. data/lib/clojure/core$declare__5118$fn__5120.class +0 -0
  180. data/lib/clojure/core$declare__5118.class +0 -0
  181. data/lib/clojure/core$def_aset__4233.class +0 -0
  182. data/lib/clojure/core$definline__4716.class +0 -0
  183. data/lib/clojure/core$defmacro__3190.class +0 -0
  184. data/lib/clojure/core$defmethod__3641.class +0 -0
  185. data/lib/clojure/core$defmulti__3638.class +0 -0
  186. data/lib/clojure/core$defn__3158.class +0 -0
  187. data/lib/clojure/core$defn___4565.class +0 -0
  188. data/lib/clojure/core$defonce__4973.class +0 -0
  189. data/lib/clojure/core$defstruct__4285.class +0 -0
  190. data/lib/clojure/core$delay_QMARK___3278.class +0 -0
  191. data/lib/clojure/core$delay__3275.class +0 -0
  192. data/lib/clojure/core$deref__3725.class +0 -0
  193. data/lib/clojure/core$derive__4877$tf__4880$fn__4882.class +0 -0
  194. data/lib/clojure/core$derive__4877$tf__4880.class +0 -0
  195. data/lib/clojure/core$derive__4877.class +0 -0
  196. data/lib/clojure/core$descendants__4873.class +0 -0
  197. data/lib/clojure/core$destructure__4413$pb__4415$pmap__4419$fn__4421$fn__4423.class +0 -0
  198. data/lib/clojure/core$destructure__4413$pb__4415$pmap__4419$fn__4421.class +0 -0
  199. data/lib/clojure/core$destructure__4413$pb__4415$pmap__4419$fn__4427.class +0 -0
  200. data/lib/clojure/core$destructure__4413$pb__4415$pmap__4419$fn__4430.class +0 -0
  201. data/lib/clojure/core$destructure__4413$pb__4415$pmap__4419.class +0 -0
  202. data/lib/clojure/core$destructure__4413$pb__4415$pvec__4416.class +0 -0
  203. data/lib/clojure/core$destructure__4413$pb__4415.class +0 -0
  204. data/lib/clojure/core$destructure__4413$process_entry__4436.class +0 -0
  205. data/lib/clojure/core$destructure__4413.class +0 -0
  206. data/lib/clojure/core$disj__3594.class +0 -0
  207. data/lib/clojure/core$dissoc__3589.class +0 -0
  208. data/lib/clojure/core$distinct_QMARK___4901.class +0 -0
  209. data/lib/clojure/core$distinct__4646$step__4648$fn__4649$fn__4652.class +0 -0
  210. data/lib/clojure/core$distinct__4646$step__4648$fn__4649.class +0 -0
  211. data/lib/clojure/core$distinct__4646$step__4648.class +0 -0
  212. data/lib/clojure/core$distinct__4646.class +0 -0
  213. data/lib/clojure/core$doall__4003.class +0 -0
  214. data/lib/clojure/core$doc__4590.class +0 -0
  215. data/lib/clojure/core$dorun__3998.class +0 -0
  216. data/lib/clojure/core$doseq__3993$step__3995.class +0 -0
  217. data/lib/clojure/core$doseq__3993.class +0 -0
  218. data/lib/clojure/core$dosync__4672.class +0 -0
  219. data/lib/clojure/core$dotimes__4025.class +0 -0
  220. data/lib/clojure/core$doto__4187$fn__4189.class +0 -0
  221. data/lib/clojure/core$doto__4187.class +0 -0
  222. data/lib/clojure/core$double__4077.class +0 -0
  223. data/lib/clojure/core$double_array__4742.class +0 -0
  224. data/lib/clojure/core$doubles__4790.class +0 -0
  225. data/lib/clojure/core$drop__3872$fn__3878.class +0 -0
  226. data/lib/clojure/core$drop__3872$step__3874.class +0 -0
  227. data/lib/clojure/core$drop__3872.class +0 -0
  228. data/lib/clojure/core$drop_last__3882$fn__3885.class +0 -0
  229. data/lib/clojure/core$drop_last__3882.class +0 -0
  230. data/lib/clojure/core$drop_while__3889$fn__3895.class +0 -0
  231. data/lib/clojure/core$drop_while__3889$step__3891.class +0 -0
  232. data/lib/clojure/core$drop_while__3889.class +0 -0
  233. data/lib/clojure/core$empty_QMARK___5084.class +0 -0
  234. data/lib/clojure/core$empty__4721.class +0 -0
  235. data/lib/clojure/core$ensure__3765.class +0 -0
  236. data/lib/clojure/core$enumeration_seq__4935.class +0 -0
  237. data/lib/clojure/core$escape_class_name__5576.class +0 -0
  238. data/lib/clojure/core$eval__3990.class +0 -0
  239. data/lib/clojure/core$eval__4760$fn__4762.class +0 -0
  240. data/lib/clojure/core$eval__4760.class +0 -0
  241. data/lib/clojure/core$eval__4772$fn__4774.class +0 -0
  242. data/lib/clojure/core$eval__4772.class +0 -0
  243. data/lib/clojure/core$eval__4784$fn__4786.class +0 -0
  244. data/lib/clojure/core$eval__4784.class +0 -0
  245. data/lib/clojure/core$eval__4796$fn__4798.class +0 -0
  246. data/lib/clojure/core$eval__4796.class +0 -0
  247. data/lib/clojure/core$even_QMARK___3545.class +0 -0
  248. data/lib/clojure/core$every_QMARK___3806.class +0 -0
  249. data/lib/clojure/core$false_QMARK___3202.class +0 -0
  250. data/lib/clojure/core$ffirst__3125.class +0 -0
  251. data/lib/clojure/core$file_seq__4601$fn__4603.class +0 -0
  252. data/lib/clojure/core$file_seq__4601$fn__4606.class +0 -0
  253. data/lib/clojure/core$file_seq__4601.class +0 -0
  254. data/lib/clojure/core$filter__3845$fn__3851.class +0 -0
  255. data/lib/clojure/core$filter__3845$step__3847.class +0 -0
  256. data/lib/clojure/core$filter__3845.class +0 -0
  257. data/lib/clojure/core$filter_key__4306.class +0 -0
  258. data/lib/clojure/core$find__3599.class +0 -0
  259. data/lib/clojure/core$find_doc__4571.class +0 -0
  260. data/lib/clojure/core$find_field__5583$fn__5585.class +0 -0
  261. data/lib/clojure/core$find_field__5583.class +0 -0
  262. data/lib/clojure/core$find_ns__4309.class +0 -0
  263. data/lib/clojure/core$find_var__3678.class +0 -0
  264. data/lib/clojure/core$first__3115.class +0 -0
  265. data/lib/clojure/core$float_QMARK___4124.class +0 -0
  266. data/lib/clojure/core$float__4071.class +0 -0
  267. data/lib/clojure/core$float_array__4735.class +0 -0
  268. data/lib/clojure/core$floats__4766.class +0 -0
  269. data/lib/clojure/core$flush__4156.class +0 -0
  270. data/lib/clojure/core$fn_QMARK___5099.class +0 -0
  271. data/lib/clojure/core$fn__3113.class +0 -0
  272. data/lib/clojure/core$fn__3288.class +0 -0
  273. data/lib/clojure/core$fn__3301.class +0 -0
  274. data/lib/clojure/core$fn__3329.class +0 -0
  275. data/lib/clojure/core$fn__3338.class +0 -0
  276. data/lib/clojure/core$fn__3347.class +0 -0
  277. data/lib/clojure/core$fn__3355.class +0 -0
  278. data/lib/clojure/core$fn__3363.class +0 -0
  279. data/lib/clojure/core$fn__3371.class +0 -0
  280. data/lib/clojure/core$fn__3379.class +0 -0
  281. data/lib/clojure/core$fn__3387.class +0 -0
  282. data/lib/clojure/core$fn__3395.class +0 -0
  283. data/lib/clojure/core$fn__3413.class +0 -0
  284. data/lib/clojure/core$fn__3419.class +0 -0
  285. data/lib/clojure/core$fn__3425.class +0 -0
  286. data/lib/clojure/core$fn__3431.class +0 -0
  287. data/lib/clojure/core$fn__3437.class +0 -0
  288. data/lib/clojure/core$fn__3443.class +0 -0
  289. data/lib/clojure/core$fn__3449.class +0 -0
  290. data/lib/clojure/core$fn__3455.class +0 -0
  291. data/lib/clojure/core$fn__3461.class +0 -0
  292. data/lib/clojure/core$fn__3467.class +0 -0
  293. data/lib/clojure/core$fn__3473.class +0 -0
  294. data/lib/clojure/core$fn__3479.class +0 -0
  295. data/lib/clojure/core$fn__3485.class +0 -0
  296. data/lib/clojure/core$fn__3500.class +0 -0
  297. data/lib/clojure/core$fn__3506.class +0 -0
  298. data/lib/clojure/core$fn__3512.class +0 -0
  299. data/lib/clojure/core$fn__3518.class +0 -0
  300. data/lib/clojure/core$fn__4050.class +0 -0
  301. data/lib/clojure/core$fn__4056.class +0 -0
  302. data/lib/clojure/core$fn__4062.class +0 -0
  303. data/lib/clojure/core$fn__4068.class +0 -0
  304. data/lib/clojure/core$fn__4074.class +0 -0
  305. data/lib/clojure/core$fn__4080.class +0 -0
  306. data/lib/clojure/core$fn__4086.class +0 -0
  307. data/lib/clojure/core$fn__4092.class +0 -0
  308. data/lib/clojure/core$fn__4098.class +0 -0
  309. data/lib/clojure/core$fn__4139.class +0 -0
  310. data/lib/clojure/core$fn__4142.class +0 -0
  311. data/lib/clojure/core$fn__4202.class +0 -0
  312. data/lib/clojure/core$fn__4208.class +0 -0
  313. data/lib/clojure/core$fn__4214.class +0 -0
  314. data/lib/clojure/core$fn__4221.class +0 -0
  315. data/lib/clojure/core$fn__4443$psig__4445.class +0 -0
  316. data/lib/clojure/core$fn__4443.class +0 -0
  317. data/lib/clojure/core$fn__4732.class +0 -0
  318. data/lib/clojure/core$fn__4739.class +0 -0
  319. data/lib/clojure/core$fn__4746.class +0 -0
  320. data/lib/clojure/core$fn__4753.class +0 -0
  321. data/lib/clojure/core$fn__4769.class +0 -0
  322. data/lib/clojure/core$fn__4781.class +0 -0
  323. data/lib/clojure/core$fn__4793.class +0 -0
  324. data/lib/clojure/core$fn__4805.class +0 -0
  325. data/lib/clojure/core$fn__4976.class +0 -0
  326. data/lib/clojure/core$fn__4980.class +0 -0
  327. data/lib/clojure/core$fn__4984.class +0 -0
  328. data/lib/clojure/core$fn__5379$fn__5381.class +0 -0
  329. data/lib/clojure/core$fn__5379.class +0 -0
  330. data/lib/clojure/core$fn__5385.class +0 -0
  331. data/lib/clojure/core$fn__5388.class +0 -0
  332. data/lib/clojure/core$fn__5394.class +0 -0
  333. data/lib/clojure/core$fn__5397.class +0 -0
  334. data/lib/clojure/core$fn__5400.class +0 -0
  335. data/lib/clojure/core$fn__5403.class +0 -0
  336. data/lib/clojure/core$fn__5406$fn__5408.class +0 -0
  337. data/lib/clojure/core$fn__5406.class +0 -0
  338. data/lib/clojure/core$fn__5412$fn__5414.class +0 -0
  339. data/lib/clojure/core$fn__5412.class +0 -0
  340. data/lib/clojure/core$fn__5418.class +0 -0
  341. data/lib/clojure/core$fn__5421.class +0 -0
  342. data/lib/clojure/core$fn__5427.class +0 -0
  343. data/lib/clojure/core$fn__5430.class +0 -0
  344. data/lib/clojure/core$fn__5433.class +0 -0
  345. data/lib/clojure/core$fn__5436.class +0 -0
  346. data/lib/clojure/core$fn__5439.class +0 -0
  347. data/lib/clojure/core$fn__5442.class +0 -0
  348. data/lib/clojure/core$fn__5445.class +0 -0
  349. data/lib/clojure/core$fn__5448.class +0 -0
  350. data/lib/clojure/core$fn__5453$fn__5455.class +0 -0
  351. data/lib/clojure/core$fn__5453.class +0 -0
  352. data/lib/clojure/core$fn__5459.class +0 -0
  353. data/lib/clojure/core$fn__5462.class +0 -0
  354. data/lib/clojure/core$fn__5467.class +0 -0
  355. data/lib/clojure/core$fn__5470.class +0 -0
  356. data/lib/clojure/core$fn__5479.class +0 -0
  357. data/lib/clojure/core$fn__5484$fn__5486.class +0 -0
  358. data/lib/clojure/core$fn__5484.class +0 -0
  359. data/lib/clojure/core$fn__5490.class +0 -0
  360. data/lib/clojure/core$fn__5493.class +0 -0
  361. data/lib/clojure/core$fn__5496.class +0 -0
  362. data/lib/clojure/core$fn__5500.class +0 -0
  363. data/lib/clojure/core$fn__5503.class +0 -0
  364. data/lib/clojure/core$fn__5506.class +0 -0
  365. data/lib/clojure/core$fn__5509.class +0 -0
  366. data/lib/clojure/core$fn__5512.class +0 -0
  367. data/lib/clojure/core$fn__5515.class +0 -0
  368. data/lib/clojure/core$fn__5518.class +0 -0
  369. data/lib/clojure/core$fn__5521.class +0 -0
  370. data/lib/clojure/core$fn__5524.class +0 -0
  371. data/lib/clojure/core$fn__5527.class +0 -0
  372. data/lib/clojure/core$fn__5530.class +0 -0
  373. data/lib/clojure/core$fn__5533.class +0 -0
  374. data/lib/clojure/core$fn__5536.class +0 -0
  375. data/lib/clojure/core$fn__5544.class +0 -0
  376. data/lib/clojure/core$fn__5547.class +0 -0
  377. data/lib/clojure/core$fn__5550.class +0 -0
  378. data/lib/clojure/core$fn__5774$prop__5777.class +0 -0
  379. data/lib/clojure/core$fn__5774.class +0 -0
  380. data/lib/clojure/core$fnext__3129.class +0 -0
  381. data/lib/clojure/core$for__4475$emit_bind__4489$do_mod__4495.class +0 -0
  382. data/lib/clojure/core$for__4475$emit_bind__4489.class +0 -0
  383. data/lib/clojure/core$for__4475$err__4485.class +0 -0
  384. data/lib/clojure/core$for__4475$to_groups__4477$fn__4480.class +0 -0
  385. data/lib/clojure/core$for__4475$to_groups__4477.class +0 -0
  386. data/lib/clojure/core$for__4475.class +0 -0
  387. data/lib/clojure/core$force__3281.class +0 -0
  388. data/lib/clojure/core$format__4938.class +0 -0
  389. data/lib/clojure/core$future__5722.class +0 -0
  390. data/lib/clojure/core$future_call__5702$fn__5704.class +0 -0
  391. data/lib/clojure/core$future_call__5702$fn__5707.class +0 -0
  392. data/lib/clojure/core$future_call__5702$fn__5710.class +0 -0
  393. data/lib/clojure/core$future_call__5702$fn__5713.class +0 -0
  394. data/lib/clojure/core$future_call__5702$fn__5717.class +0 -0
  395. data/lib/clojure/core$future_call__5702.class +0 -0
  396. data/lib/clojure/core$gen_class__5679.class +0 -0
  397. data/lib/clojure/core$gen_interface__5698.class +0 -0
  398. data/lib/clojure/core$generate_class__5596$arg_types__5608.class +0 -0
  399. data/lib/clojure/core$generate_class__5596$emit_forwarding_method__5642.class +0 -0
  400. data/lib/clojure/core$generate_class__5596$emit_get_var__5636.class +0 -0
  401. data/lib/clojure/core$generate_class__5596$emit_unsupported__5639.class +0 -0
  402. data/lib/clojure/core$generate_class__5596$fn__5614.class +0 -0
  403. data/lib/clojure/core$generate_class__5596$fn__5619.class +0 -0
  404. data/lib/clojure/core$generate_class__5596$fn__5624.class +0 -0
  405. data/lib/clojure/core$generate_class__5596$fn__5629$fn__5632.class +0 -0
  406. data/lib/clojure/core$generate_class__5596$fn__5629.class +0 -0
  407. data/lib/clojure/core$generate_class__5596$fn__5651.class +0 -0
  408. data/lib/clojure/core$generate_class__5596$fn__5654.class +0 -0
  409. data/lib/clojure/core$generate_class__5596$fn__5657.class +0 -0
  410. data/lib/clojure/core$generate_class__5596$fn__5664.class +0 -0
  411. data/lib/clojure/core$generate_class__5596$iname__5599.class +0 -0
  412. data/lib/clojure/core$generate_class__5596$to_types__5605.class +0 -0
  413. data/lib/clojure/core$generate_class__5596$totype__5602.class +0 -0
  414. data/lib/clojure/core$generate_class__5596$var_name__5611.class +0 -0
  415. data/lib/clojure/core$generate_class__5596.class +0 -0
  416. data/lib/clojure/core$generate_interface__5689$fn__5692.class +0 -0
  417. data/lib/clojure/core$generate_interface__5689.class +0 -0
  418. data/lib/clojure/core$generate_proxy__5188$fn__5209$fn__5212.class +0 -0
  419. data/lib/clojure/core$generate_proxy__5188$fn__5209.class +0 -0
  420. data/lib/clojure/core$generate_proxy__5188$fn__5237.class +0 -0
  421. data/lib/clojure/core$generate_proxy__5188$fn__5240.class +0 -0
  422. data/lib/clojure/core$generate_proxy__5188$fn__5247.class +0 -0
  423. data/lib/clojure/core$generate_proxy__5188$fn__5251.class +0 -0
  424. data/lib/clojure/core$generate_proxy__5188$gen_bridge__5199.class +0 -0
  425. data/lib/clojure/core$generate_proxy__5188$gen_method__5203.class +0 -0
  426. data/lib/clojure/core$generate_proxy__5188$iname__5190.class +0 -0
  427. data/lib/clojure/core$generate_proxy__5188$iter__5221__5225$fn__5226$iter__5223__5228$fn__5229.class +0 -0
  428. data/lib/clojure/core$generate_proxy__5188$iter__5221__5225$fn__5226$iter__5223__5228.class +0 -0
  429. data/lib/clojure/core$generate_proxy__5188$iter__5221__5225$fn__5226.class +0 -0
  430. data/lib/clojure/core$generate_proxy__5188$iter__5221__5225.class +0 -0
  431. data/lib/clojure/core$generate_proxy__5188$to_types__5196.class +0 -0
  432. data/lib/clojure/core$generate_proxy__5188$totype__5193.class +0 -0
  433. data/lib/clojure/core$generate_proxy__5188.class +0 -0
  434. data/lib/clojure/core$gensym__3233.class +0 -0
  435. data/lib/clojure/core$get__3585.class +0 -0
  436. data/lib/clojure/core$get_in__5071.class +0 -0
  437. data/lib/clojure/core$get_method__3653.class +0 -0
  438. data/lib/clojure/core$get_proxy_class__5259.class +0 -0
  439. data/lib/clojure/core$get_super_and_interfaces__5256.class +0 -0
  440. data/lib/clojure/core$get_validator__3747.class +0 -0
  441. data/lib/clojure/core$group_by_sig__5170$fn__5173.class +0 -0
  442. data/lib/clojure/core$group_by_sig__5170.class +0 -0
  443. data/lib/clojure/core$hash__4710.class +0 -0
  444. data/lib/clojure/core$hash_map__3173.class +0 -0
  445. data/lib/clojure/core$hash_set__3177.class +0 -0
  446. data/lib/clojure/core$identity__3566.class +0 -0
  447. data/lib/clojure/core$if_let__3663.class +0 -0
  448. data/lib/clojure/core$if_not__3284.class +0 -0
  449. data/lib/clojure/core$ifn_QMARK___5096.class +0 -0
  450. data/lib/clojure/core$import__4028.class +0 -0
  451. data/lib/clojure/core$inc__3416.class +0 -0
  452. data/lib/clojure/core$init_proxy__5268.class +0 -0
  453. data/lib/clojure/core$instance_QMARK___3135.class +0 -0
  454. data/lib/clojure/core$int__4059.class +0 -0
  455. data/lib/clojure/core$int_array__4749.class +0 -0
  456. data/lib/clojure/core$integer_QMARK___4107.class +0 -0
  457. data/lib/clojure/core$interleave__4383.class +0 -0
  458. data/lib/clojure/core$intern__5131.class +0 -0
  459. data/lib/clojure/core$interpose__4713.class +0 -0
  460. data/lib/clojure/core$into__4037.class +0 -0
  461. data/lib/clojure/core$into_array__4033.class +0 -0
  462. data/lib/clojure/core$ints__4778.class +0 -0
  463. data/lib/clojure/core$io_BANG___3771.class +0 -0
  464. data/lib/clojure/core$isa_QMARK___4843$fn__4846.class +0 -0
  465. data/lib/clojure/core$isa_QMARK___4843.class +0 -0
  466. data/lib/clojure/core$iterate__3922$fn__3924.class +0 -0
  467. data/lib/clojure/core$iterate__3922.class +0 -0
  468. data/lib/clojure/core$iterator_seq__4932.class +0 -0
  469. data/lib/clojure/core$key__3611.class +0 -0
  470. data/lib/clojure/core$keys__3605.class +0 -0
  471. data/lib/clojure/core$keyword_QMARK___3222.class +0 -0
  472. data/lib/clojure/core$keyword__3229.class +0 -0
  473. data/lib/clojure/core$last__3154.class +0 -0
  474. data/lib/clojure/core$lazy_cat__4466$fn__4468.class +0 -0
  475. data/lib/clojure/core$lazy_cat__4466.class +0 -0
  476. data/lib/clojure/core$lazy_seq__3252.class +0 -0
  477. data/lib/clojure/core$let__3109.class +0 -0
  478. data/lib/clojure/core$let__4440.class +0 -0
  479. data/lib/clojure/core$letfn__5768$fn__5770.class +0 -0
  480. data/lib/clojure/core$letfn__5768.class +0 -0
  481. data/lib/clojure/core$libspec_QMARK___4995.class +0 -0
  482. data/lib/clojure/core$line_seq__3959$fn__3961.class +0 -0
  483. data/lib/clojure/core$line_seq__3959.class +0 -0
  484. data/lib/clojure/core$list_QMARK___5090.class +0 -0
  485. data/lib/clojure/core$list_STAR___3249.class +0 -0
  486. data/lib/clojure/core$load__5058$fn__5061.class +0 -0
  487. data/lib/clojure/core$load__5058.class +0 -0
  488. data/lib/clojure/core$load_all__5019$fn__5021$fn__5023.class +0 -0
  489. data/lib/clojure/core$load_all__5019$fn__5021$fn__5026.class +0 -0
  490. data/lib/clojure/core$load_all__5019$fn__5021.class +0 -0
  491. data/lib/clojure/core$load_all__5019.class +0 -0
  492. data/lib/clojure/core$load_lib__5031.class +0 -0
  493. data/lib/clojure/core$load_libs__5043.class +0 -0
  494. data/lib/clojure/core$load_one__5010$fn__5012.class +0 -0
  495. data/lib/clojure/core$load_one__5010.class +0 -0
  496. data/lib/clojure/core$load_reader__4297.class +0 -0
  497. data/lib/clojure/core$load_string__4300.class +0 -0
  498. data/lib/clojure/core$loaded_libs__5055.class +0 -0
  499. data/lib/clojure/core$locking__3627.class +0 -0
  500. data/lib/clojure/core$long__4065.class +0 -0
  501. data/lib/clojure/core$long_array__4756.class +0 -0
  502. data/lib/clojure/core$longs__4802.class +0 -0
  503. data/lib/clojure/core$loop__3111.class +0 -0
  504. data/lib/clojure/core$loop__4450$fn__4452.class +0 -0
  505. data/lib/clojure/core$loop__4450$fn__4456.class +0 -0
  506. data/lib/clojure/core$loop__4450.class +0 -0
  507. data/lib/clojure/core$macroexpand_1__4276.class +0 -0
  508. data/lib/clojure/core$macroexpand__4279.class +0 -0
  509. data/lib/clojure/core$make_array__4268.class +0 -0
  510. data/lib/clojure/core$make_hierarchy__4830.class +0 -0
  511. data/lib/clojure/core$map_QMARK___3141.class +0 -0
  512. data/lib/clojure/core$map__3815$fn__3817.class +0 -0
  513. data/lib/clojure/core$map__3815$fn__3822.class +0 -0
  514. data/lib/clojure/core$map__3815$fn__3827.class +0 -0
  515. data/lib/clojure/core$map__3815$fn__3838.class +0 -0
  516. data/lib/clojure/core$map__3815$step__3833$fn__3834.class +0 -0
  517. data/lib/clojure/core$map__3815$step__3833.class +0 -0
  518. data/lib/clojure/core$map__3815.class +0 -0
  519. data/lib/clojure/core$mapcat__3842.class +0 -0
  520. data/lib/clojure/core$max__3403.class +0 -0
  521. data/lib/clojure/core$max_key__4628$fn__4632.class +0 -0
  522. data/lib/clojure/core$max_key__4628.class +0 -0
  523. data/lib/clojure/core$memfn__4194.class +0 -0
  524. data/lib/clojure/core$memoize__5138$fn__5140.class +0 -0
  525. data/lib/clojure/core$memoize__5138.class +0 -0
  526. data/lib/clojure/core$merge__3938$fn__3940.class +0 -0
  527. data/lib/clojure/core$merge__3938.class +0 -0
  528. data/lib/clojure/core$merge_with__3945$merge2__3950.class +0 -0
  529. data/lib/clojure/core$merge_with__3945$merge_entry__3947.class +0 -0
  530. data/lib/clojure/core$merge_with__3945.class +0 -0
  531. data/lib/clojure/core$meta__3150.class +0 -0
  532. data/lib/clojure/core$method_sig__5156.class +0 -0
  533. data/lib/clojure/core$methods__3650.class +0 -0
  534. data/lib/clojure/core$min__3408.class +0 -0
  535. data/lib/clojure/core$min_key__4638$fn__4642.class +0 -0
  536. data/lib/clojure/core$min_key__4638.class +0 -0
  537. data/lib/clojure/core$mod__4114.class +0 -0
  538. data/lib/clojure/core$most_specific__5160$fn__5162$fn__5164.class +0 -0
  539. data/lib/clojure/core$most_specific__5160$fn__5162.class +0 -0
  540. data/lib/clojure/core$most_specific__5160.class +0 -0
  541. data/lib/clojure/core$name__3620.class +0 -0
  542. data/lib/clojure/core$namespace__3623.class +0 -0
  543. data/lib/clojure/core$neg_QMARK___3482.class +0 -0
  544. data/lib/clojure/core$newline__4153.class +0 -0
  545. data/lib/clojure/core$next__3117.class +0 -0
  546. data/lib/clojure/core$nfirst__3127.class +0 -0
  547. data/lib/clojure/core$nil_QMARK___3199.class +0 -0
  548. data/lib/clojure/core$nnext__3131.class +0 -0
  549. data/lib/clojure/core$non_private_methods__5553$fn__5556.class +0 -0
  550. data/lib/clojure/core$non_private_methods__5553.class +0 -0
  551. data/lib/clojure/core$not_EQ___3296.class +0 -0
  552. data/lib/clojure/core$not__3208.class +0 -0
  553. data/lib/clojure/core$not_empty__4833.class +0 -0
  554. data/lib/clojure/core$ns__4948$fn__4958.class +0 -0
  555. data/lib/clojure/core$ns__4948$fn__4961.class +0 -0
  556. data/lib/clojure/core$ns__4948$fn__4964.class +0 -0
  557. data/lib/clojure/core$ns__4948$process_reference__4951$fn__4954.class +0 -0
  558. data/lib/clojure/core$ns__4948$process_reference__4951.class +0 -0
  559. data/lib/clojure/core$ns__4948.class +0 -0
  560. data/lib/clojure/core$ns_aliases__4370.class +0 -0
  561. data/lib/clojure/core$ns_imports__4342.class +0 -0
  562. data/lib/clojure/core$ns_interns__4360$fn__4362.class +0 -0
  563. data/lib/clojure/core$ns_interns__4360.class +0 -0
  564. data/lib/clojure/core$ns_map__4328.class +0 -0
  565. data/lib/clojure/core$ns_name__4325.class +0 -0
  566. data/lib/clojure/core$ns_publics__4334$fn__4336.class +0 -0
  567. data/lib/clojure/core$ns_publics__4334.class +0 -0
  568. data/lib/clojure/core$ns_refers__4353$fn__4355.class +0 -0
  569. data/lib/clojure/core$ns_refers__4353.class +0 -0
  570. data/lib/clojure/core$ns_resolve__4395.class +0 -0
  571. data/lib/clojure/core$ns_unalias__4373.class +0 -0
  572. data/lib/clojure/core$ns_unmap__4331.class +0 -0
  573. data/lib/clojure/core$nth__3578.class +0 -0
  574. data/lib/clojure/core$nthnext__4405.class +0 -0
  575. data/lib/clojure/core$num__4053.class +0 -0
  576. data/lib/clojure/core$number_QMARK___4104.class +0 -0
  577. data/lib/clojure/core$odd_QMARK___3548.class +0 -0
  578. data/lib/clojure/core$or__3314.class +0 -0
  579. data/lib/clojure/core$overload_name__5579.class +0 -0
  580. data/lib/clojure/core$parents__4861.class +0 -0
  581. data/lib/clojure/core$partial__3781$fn__3783.class +0 -0
  582. data/lib/clojure/core$partial__3781$fn__3787.class +0 -0
  583. data/lib/clojure/core$partial__3781$fn__3791.class +0 -0
  584. data/lib/clojure/core$partial__3781$fn__3795.class +0 -0
  585. data/lib/clojure/core$partial__3781.class +0 -0
  586. data/lib/clojure/core$partition__3982$fn__3985.class +0 -0
  587. data/lib/clojure/core$partition__3982.class +0 -0
  588. data/lib/clojure/core$pcalls__5754$fn__5756.class +0 -0
  589. data/lib/clojure/core$pcalls__5754.class +0 -0
  590. data/lib/clojure/core$peek__3572.class +0 -0
  591. data/lib/clojure/core$pmap__5727$fn__5729$fn__5731.class +0 -0
  592. data/lib/clojure/core$pmap__5727$fn__5729.class +0 -0
  593. data/lib/clojure/core$pmap__5727$fn__5749.class +0 -0
  594. data/lib/clojure/core$pmap__5727$step__5736$fn__5738.class +0 -0
  595. data/lib/clojure/core$pmap__5727$step__5736.class +0 -0
  596. data/lib/clojure/core$pmap__5727$step__5744$fn__5745.class +0 -0
  597. data/lib/clojure/core$pmap__5727$step__5744.class +0 -0
  598. data/lib/clojure/core$pmap__5727.class +0 -0
  599. data/lib/clojure/core$pop__3575.class +0 -0
  600. data/lib/clojure/core$pos_QMARK___3476.class +0 -0
  601. data/lib/clojure/core$pr__4148.class +0 -0
  602. data/lib/clojure/core$pr_on__4145.class +0 -0
  603. data/lib/clojure/core$pr_str__4512.class +0 -0
  604. data/lib/clojure/core$prefer_method__3647.class +0 -0
  605. data/lib/clojure/core$prefers__3656.class +0 -0
  606. data/lib/clojure/core$prependss__5001.class +0 -0
  607. data/lib/clojure/core$print__4162.class +0 -0
  608. data/lib/clojure/core$print_ctor__5391.class +0 -0
  609. data/lib/clojure/core$print_doc__4568.class +0 -0
  610. data/lib/clojure/core$print_map__5473$fn__5475.class +0 -0
  611. data/lib/clojure/core$print_map__5473.class +0 -0
  612. data/lib/clojure/core$print_meta__5370.class +0 -0
  613. data/lib/clojure/core$print_namespace_doc__4587.class +0 -0
  614. data/lib/clojure/core$print_sequential__5354.class +0 -0
  615. data/lib/clojure/core$print_simple__5424.class +0 -0
  616. data/lib/clojure/core$print_special_doc__4584.class +0 -0
  617. data/lib/clojure/core$print_str__4520.class +0 -0
  618. data/lib/clojure/core$printf__4941.class +0 -0
  619. data/lib/clojure/core$println__4165.class +0 -0
  620. data/lib/clojure/core$println_str__4524.class +0 -0
  621. data/lib/clojure/core$prn__4159.class +0 -0
  622. data/lib/clojure/core$prn_str__4516.class +0 -0
  623. data/lib/clojure/core$proxy__5279$fn__5282.class +0 -0
  624. data/lib/clojure/core$proxy__5279$fn__5287$fn__5291.class +0 -0
  625. data/lib/clojure/core$proxy__5279$fn__5287.class +0 -0
  626. data/lib/clojure/core$proxy__5279.class +0 -0
  627. data/lib/clojure/core$proxy_call_with_super__5297.class +0 -0
  628. data/lib/clojure/core$proxy_mappings__5274.class +0 -0
  629. data/lib/clojure/core$proxy_name__5179$fn__5181.class +0 -0
  630. data/lib/clojure/core$proxy_name__5179.class +0 -0
  631. data/lib/clojure/core$proxy_super__5300.class +0 -0
  632. data/lib/clojure/core$pvalues__5761$fn__5763.class +0 -0
  633. data/lib/clojure/core$pvalues__5761.class +0 -0
  634. data/lib/clojure/core$quot__3491.class +0 -0
  635. data/lib/clojure/core$rand__4558.class +0 -0
  636. data/lib/clojure/core$rand_int__4562.class +0 -0
  637. data/lib/clojure/core$range__3928.class +0 -0
  638. data/lib/clojure/core$ratio_QMARK___4118.class +0 -0
  639. data/lib/clojure/core$rational_QMARK___4128.class +0 -0
  640. data/lib/clojure/core$rationalize__3497.class +0 -0
  641. data/lib/clojure/core$re_find__4554.class +0 -0
  642. data/lib/clojure/core$re_groups__4540.class +0 -0
  643. data/lib/clojure/core$re_matcher__4537.class +0 -0
  644. data/lib/clojure/core$re_matches__4551.class +0 -0
  645. data/lib/clojure/core$re_pattern__4534.class +0 -0
  646. data/lib/clojure/core$re_seq__4543$step__4545$fn__4546.class +0 -0
  647. data/lib/clojure/core$re_seq__4543$step__4545.class +0 -0
  648. data/lib/clojure/core$re_seq__4543.class +0 -0
  649. data/lib/clojure/core$read__4168.class +0 -0
  650. data/lib/clojure/core$read_line__4174.class +0 -0
  651. data/lib/clojure/core$read_string__4177.class +0 -0
  652. data/lib/clojure/core$reduce__3319$fn__3322.class +0 -0
  653. data/lib/clojure/core$reduce__3319.class +0 -0
  654. data/lib/clojure/core$ref__3721.class +0 -0
  655. data/lib/clojure/core$ref_set__3762.class +0 -0
  656. data/lib/clojure/core$refer__4345.class +0 -0
  657. data/lib/clojure/core$refer_clojure__4969.class +0 -0
  658. data/lib/clojure/core$release_pending_sends__3694.class +0 -0
  659. data/lib/clojure/core$rem__3494.class +0 -0
  660. data/lib/clojure/core$remove__3855.class +0 -0
  661. data/lib/clojure/core$remove_method__3644.class +0 -0
  662. data/lib/clojure/core$remove_ns__4315.class +0 -0
  663. data/lib/clojure/core$remove_watch__3700.class +0 -0
  664. data/lib/clojure/core$remove_watcher__3709.class +0 -0
  665. data/lib/clojure/core$repeat__3912$fn__3914.class +0 -0
  666. data/lib/clojure/core$repeat__3912.class +0 -0
  667. data/lib/clojure/core$repeatedly__4701$fn__4703.class +0 -0
  668. data/lib/clojure/core$repeatedly__4701.class +0 -0
  669. data/lib/clojure/core$replace__4661$fn__4663.class +0 -0
  670. data/lib/clojure/core$replace__4661$fn__4667.class +0 -0
  671. data/lib/clojure/core$replace__4661.class +0 -0
  672. data/lib/clojure/core$replicate__3919.class +0 -0
  673. data/lib/clojure/core$require__5049.class +0 -0
  674. data/lib/clojure/core$reset_BANG___3741.class +0 -0
  675. data/lib/clojure/core$reset_meta_BANG___3753.class +0 -0
  676. data/lib/clojure/core$resolve__4398.class +0 -0
  677. data/lib/clojure/core$rest__3119.class +0 -0
  678. data/lib/clojure/core$resultset_seq__4911$fn__4913.class +0 -0
  679. data/lib/clojure/core$resultset_seq__4911$fn__4916.class +0 -0
  680. data/lib/clojure/core$resultset_seq__4911$row_values__4919$fn__4921.class +0 -0
  681. data/lib/clojure/core$resultset_seq__4911$row_values__4919.class +0 -0
  682. data/lib/clojure/core$resultset_seq__4911$thisfn__4925$fn__4926.class +0 -0
  683. data/lib/clojure/core$resultset_seq__4911$thisfn__4925.class +0 -0
  684. data/lib/clojure/core$resultset_seq__4911.class +0 -0
  685. data/lib/clojure/core$reverse__3326.class +0 -0
  686. data/lib/clojure/core$reversible_QMARK___5114.class +0 -0
  687. data/lib/clojure/core$root_directory__5007.class +0 -0
  688. data/lib/clojure/core$root_resource__5004.class +0 -0
  689. data/lib/clojure/core$rseq__3617.class +0 -0
  690. data/lib/clojure/core$rsubseq__4693.class +0 -0
  691. data/lib/clojure/core$second__3123.class +0 -0
  692. data/lib/clojure/core$select_keys__3602.class +0 -0
  693. data/lib/clojure/core$send__3688.class +0 -0
  694. data/lib/clojure/core$send_off__3691.class +0 -0
  695. data/lib/clojure/core$seq_QMARK___3137.class +0 -0
  696. data/lib/clojure/core$seq__3133.class +0 -0
  697. data/lib/clojure/core$seque__4808$drain__4818$fn__4819.class +0 -0
  698. data/lib/clojure/core$seque__4808$drain__4818.class +0 -0
  699. data/lib/clojure/core$seque__4808$fill__4811.class +0 -0
  700. data/lib/clojure/core$seque__4808.class +0 -0
  701. data/lib/clojure/core$sequence__3802.class +0 -0
  702. data/lib/clojure/core$sequential_QMARK___5105.class +0 -0
  703. data/lib/clojure/core$set_QMARK___5093.class +0 -0
  704. data/lib/clojure/core$set__4303.class +0 -0
  705. data/lib/clojure/core$set_validator_BANG___3744.class +0 -0
  706. data/lib/clojure/core$setup_reference__3681.class +0 -0
  707. data/lib/clojure/core$short__4083.class +0 -0
  708. data/lib/clojure/core$shutdown_agents__3718.class +0 -0
  709. data/lib/clojure/core$sigs__3145.class +0 -0
  710. data/lib/clojure/core$slurp__4619.class +0 -0
  711. data/lib/clojure/core$some__3810.class +0 -0
  712. data/lib/clojure/core$sort__3971.class +0 -0
  713. data/lib/clojure/core$sort_by__3975$fn__3978.class +0 -0
  714. data/lib/clojure/core$sort_by__3975.class +0 -0
  715. data/lib/clojure/core$sorted_QMARK___5108.class +0 -0
  716. data/lib/clojure/core$sorted_map__3181.class +0 -0
  717. data/lib/clojure/core$sorted_map_by__3187.class +0 -0
  718. data/lib/clojure/core$sorted_set__3184.class +0 -0
  719. data/lib/clojure/core$special_form_anchor__4578.class +0 -0
  720. data/lib/clojure/core$special_symbol_QMARK___4613.class +0 -0
  721. data/lib/clojure/core$split_at__3906.class +0 -0
  722. data/lib/clojure/core$split_with__3909.class +0 -0
  723. data/lib/clojure/core$spread__3240.class +0 -0
  724. data/lib/clojure/core$str__3211$fn__3215.class +0 -0
  725. data/lib/clojure/core$str__3211.class +0 -0
  726. data/lib/clojure/core$stream_QMARK___3799.class +0 -0
  727. data/lib/clojure/core$string_QMARK___3139.class +0 -0
  728. data/lib/clojure/core$struct__4291.class +0 -0
  729. data/lib/clojure/core$struct_map__4288.class +0 -0
  730. data/lib/clojure/core$subs__4622.class +0 -0
  731. data/lib/clojure/core$subseq__4685.class +0 -0
  732. data/lib/clojure/core$subvec__4180.class +0 -0
  733. data/lib/clojure/core$supers__4839.class +0 -0
  734. data/lib/clojure/core$swap_BANG___3732.class +0 -0
  735. data/lib/clojure/core$symbol_QMARK___3219.class +0 -0
  736. data/lib/clojure/core$symbol__3225.class +0 -0
  737. data/lib/clojure/core$sync__3768.class +0 -0
  738. data/lib/clojure/core$syntax_symbol_anchor__4581.class +0 -0
  739. data/lib/clojure/core$take__3858$fn__3860.class +0 -0
  740. data/lib/clojure/core$take__3858.class +0 -0
  741. data/lib/clojure/core$take_nth__4376$fn__4378.class +0 -0
  742. data/lib/clojure/core$take_nth__4376.class +0 -0
  743. data/lib/clojure/core$take_while__3865$fn__3867.class +0 -0
  744. data/lib/clojure/core$take_while__3865.class +0 -0
  745. data/lib/clojure/core$test__4531.class +0 -0
  746. data/lib/clojure/core$the_class__5590.class +0 -0
  747. data/lib/clojure/core$the_ns__4321.class +0 -0
  748. data/lib/clojure/core$throw_if__4989$boring_QMARK___4991.class +0 -0
  749. data/lib/clojure/core$throw_if__4989.class +0 -0
  750. data/lib/clojure/core$time__4199.class +0 -0
  751. data/lib/clojure/core$to_array_2d__4273.class +0 -0
  752. data/lib/clojure/core$to_array__3163.class +0 -0
  753. data/lib/clojure/core$trampoline__5124$fn__5127.class +0 -0
  754. data/lib/clojure/core$trampoline__5124.class +0 -0
  755. data/lib/clojure/core$tree_seq__4593$walk__4595$fn__4596.class +0 -0
  756. data/lib/clojure/core$tree_seq__4593$walk__4595.class +0 -0
  757. data/lib/clojure/core$tree_seq__4593.class +0 -0
  758. data/lib/clojure/core$true_QMARK___3205.class +0 -0
  759. data/lib/clojure/core$type__4046.class +0 -0
  760. data/lib/clojure/core$unchecked_add__3446.class +0 -0
  761. data/lib/clojure/core$unchecked_dec__3434.class +0 -0
  762. data/lib/clojure/core$unchecked_divide__3464.class +0 -0
  763. data/lib/clojure/core$unchecked_inc__3428.class +0 -0
  764. data/lib/clojure/core$unchecked_multiply__3458.class +0 -0
  765. data/lib/clojure/core$unchecked_negate__3440.class +0 -0
  766. data/lib/clojure/core$unchecked_remainder__3470.class +0 -0
  767. data/lib/clojure/core$unchecked_subtract__3452.class +0 -0
  768. data/lib/clojure/core$underive__4891$tf__4894$fn__4896.class +0 -0
  769. data/lib/clojure/core$underive__4891$tf__4894.class +0 -0
  770. data/lib/clojure/core$underive__4891.class +0 -0
  771. data/lib/clojure/core$update_in__5080.class +0 -0
  772. data/lib/clojure/core$update_proxy__5271.class +0 -0
  773. data/lib/clojure/core$use__5052.class +0 -0
  774. data/lib/clojure/core$val__3614.class +0 -0
  775. data/lib/clojure/core$vals__3608.class +0 -0
  776. data/lib/clojure/core$var_QMARK___4616.class +0 -0
  777. data/lib/clojure/core$var_get__4386.class +0 -0
  778. data/lib/clojure/core$var_set__4389.class +0 -0
  779. data/lib/clojure/core$vary_meta__3246.class +0 -0
  780. data/lib/clojure/core$vec__3170.class +0 -0
  781. data/lib/clojure/core$vector_QMARK___3143.class +0 -0
  782. data/lib/clojure/core$vector__3166.class +0 -0
  783. data/lib/clojure/core$when__3193.class +0 -0
  784. data/lib/clojure/core$when_first__4461.class +0 -0
  785. data/lib/clojure/core$when_let__3669.class +0 -0
  786. data/lib/clojure/core$when_not__3196.class +0 -0
  787. data/lib/clojure/core$while__5135.class +0 -0
  788. data/lib/clojure/core$with_in_str__4509.class +0 -0
  789. data/lib/clojure/core$with_local_vars__4392.class +0 -0
  790. data/lib/clojure/core$with_meta__3152.class +0 -0
  791. data/lib/clojure/core$with_open__4184.class +0 -0
  792. data/lib/clojure/core$with_out_str__4505.class +0 -0
  793. data/lib/clojure/core$with_precision__4675.class +0 -0
  794. data/lib/clojure/core$xml_seq__4610.class +0 -0
  795. data/lib/clojure/core$zero_QMARK___3488.class +0 -0
  796. data/lib/clojure/core$zipmap__3955.class +0 -0
  797. data/lib/clojure/core.clj +4121 -0
  798. data/lib/clojure/core__init.class +0 -0
  799. data/lib/clojure/core_print.clj +317 -0
  800. data/lib/clojure/core_print__init.class +0 -0
  801. data/lib/clojure/core_proxy.clj +394 -0
  802. data/lib/clojure/core_proxy__init.class +0 -0
  803. data/lib/clojure/genclass.clj +683 -0
  804. data/lib/clojure/genclass__init.class +0 -0
  805. data/lib/clojure/inspector$atom_QMARK___6181.class +0 -0
  806. data/lib/clojure/inspector$collection_tag__6184.class +0 -0
  807. data/lib/clojure/inspector$fn__6187.class +0 -0
  808. data/lib/clojure/inspector$fn__6190.class +0 -0
  809. data/lib/clojure/inspector$fn__6193.class +0 -0
  810. data/lib/clojure/inspector$fn__6196.class +0 -0
  811. data/lib/clojure/inspector$fn__6199.class +0 -0
  812. data/lib/clojure/inspector$fn__6202.class +0 -0
  813. data/lib/clojure/inspector$fn__6205.class +0 -0
  814. data/lib/clojure/inspector$fn__6208.class +0 -0
  815. data/lib/clojure/inspector$fn__6211.class +0 -0
  816. data/lib/clojure/inspector$fn__6278$fn__6280.class +0 -0
  817. data/lib/clojure/inspector$fn__6278$fn__6283.class +0 -0
  818. data/lib/clojure/inspector$fn__6278.class +0 -0
  819. data/lib/clojure/inspector$fn__6287$fn__6289.class +0 -0
  820. data/lib/clojure/inspector$fn__6287$fn__6292.class +0 -0
  821. data/lib/clojure/inspector$fn__6287.class +0 -0
  822. data/lib/clojure/inspector$fn__6296$fn__6299.class +0 -0
  823. data/lib/clojure/inspector$fn__6296$fn__6303.class +0 -0
  824. data/lib/clojure/inspector$fn__6296$fn__6306.class +0 -0
  825. data/lib/clojure/inspector$fn__6296.class +0 -0
  826. data/lib/clojure/inspector$fn__6324$fn__6326.class +0 -0
  827. data/lib/clojure/inspector$fn__6324$fn__6329.class +0 -0
  828. data/lib/clojure/inspector$fn__6324$fn__6332.class +0 -0
  829. data/lib/clojure/inspector$fn__6324.class +0 -0
  830. data/lib/clojure/inspector$inspect__6337.class +0 -0
  831. data/lib/clojure/inspector$inspect_table__6274.class +0 -0
  832. data/lib/clojure/inspector$inspect_tree__6270.class +0 -0
  833. data/lib/clojure/inspector$list_model__6310$fn__6313.class +0 -0
  834. data/lib/clojure/inspector$list_model__6310$fn__6316.class +0 -0
  835. data/lib/clojure/inspector$list_model__6310$fn__6319.class +0 -0
  836. data/lib/clojure/inspector$list_model__6310.class +0 -0
  837. data/lib/clojure/inspector$old_table_model__6242$fn__6244.class +0 -0
  838. data/lib/clojure/inspector$old_table_model__6242$fn__6247.class +0 -0
  839. data/lib/clojure/inspector$old_table_model__6242$fn__6250.class +0 -0
  840. data/lib/clojure/inspector$old_table_model__6242$fn__6253.class +0 -0
  841. data/lib/clojure/inspector$old_table_model__6242$fn__6256.class +0 -0
  842. data/lib/clojure/inspector$old_table_model__6242$fn__6259.class +0 -0
  843. data/lib/clojure/inspector$old_table_model__6242$fn__6262.class +0 -0
  844. data/lib/clojure/inspector$old_table_model__6242$fn__6265.class +0 -0
  845. data/lib/clojure/inspector$old_table_model__6242.class +0 -0
  846. data/lib/clojure/inspector$tree_model__6214$fn__6216.class +0 -0
  847. data/lib/clojure/inspector$tree_model__6214$fn__6219.class +0 -0
  848. data/lib/clojure/inspector$tree_model__6214$fn__6222.class +0 -0
  849. data/lib/clojure/inspector$tree_model__6214$fn__6225.class +0 -0
  850. data/lib/clojure/inspector$tree_model__6214$fn__6228.class +0 -0
  851. data/lib/clojure/inspector$tree_model__6214$fn__6231.class +0 -0
  852. data/lib/clojure/inspector$tree_model__6214$fn__6234.class +0 -0
  853. data/lib/clojure/inspector$tree_model__6214$fn__6237.class +0 -0
  854. data/lib/clojure/inspector$tree_model__6214.class +0 -0
  855. data/lib/clojure/inspector.clj +180 -0
  856. data/lib/clojure/inspector__init.class +0 -0
  857. data/lib/clojure/lang/AFn.class +0 -0
  858. data/lib/clojure/lang/AFunction.class +0 -0
  859. data/lib/clojure/lang/AMapEntry.class +0 -0
  860. data/lib/clojure/lang/APersistentMap$1.class +0 -0
  861. data/lib/clojure/lang/APersistentMap$2$1.class +0 -0
  862. data/lib/clojure/lang/APersistentMap$2.class +0 -0
  863. data/lib/clojure/lang/APersistentMap$3$1.class +0 -0
  864. data/lib/clojure/lang/APersistentMap$3.class +0 -0
  865. data/lib/clojure/lang/APersistentMap$KeySeq.class +0 -0
  866. data/lib/clojure/lang/APersistentMap$ValSeq.class +0 -0
  867. data/lib/clojure/lang/APersistentMap.class +0 -0
  868. data/lib/clojure/lang/APersistentSet.class +0 -0
  869. data/lib/clojure/lang/APersistentVector$1.class +0 -0
  870. data/lib/clojure/lang/APersistentVector$2.class +0 -0
  871. data/lib/clojure/lang/APersistentVector$RSeq.class +0 -0
  872. data/lib/clojure/lang/APersistentVector$Seq.class +0 -0
  873. data/lib/clojure/lang/APersistentVector$Src.class +0 -0
  874. data/lib/clojure/lang/APersistentVector$SubVector.class +0 -0
  875. data/lib/clojure/lang/APersistentVector.class +0 -0
  876. data/lib/clojure/lang/ARef.class +0 -0
  877. data/lib/clojure/lang/AReference.class +0 -0
  878. data/lib/clojure/lang/ASeq$Src.class +0 -0
  879. data/lib/clojure/lang/ASeq.class +0 -0
  880. data/lib/clojure/lang/Agent$Action.class +0 -0
  881. data/lib/clojure/lang/Agent.class +0 -0
  882. data/lib/clojure/lang/ArraySeq$ArraySeq_double.class +0 -0
  883. data/lib/clojure/lang/ArraySeq$ArraySeq_float.class +0 -0
  884. data/lib/clojure/lang/ArraySeq$ArraySeq_int.class +0 -0
  885. data/lib/clojure/lang/ArraySeq$ArraySeq_long.class +0 -0
  886. data/lib/clojure/lang/ArraySeq.class +0 -0
  887. data/lib/clojure/lang/ArrayStream$ArrayStream_boolean.class +0 -0
  888. data/lib/clojure/lang/ArrayStream$ArrayStream_byte.class +0 -0
  889. data/lib/clojure/lang/ArrayStream$ArrayStream_char.class +0 -0
  890. data/lib/clojure/lang/ArrayStream$ArrayStream_double.class +0 -0
  891. data/lib/clojure/lang/ArrayStream$ArrayStream_float.class +0 -0
  892. data/lib/clojure/lang/ArrayStream$ArrayStream_int.class +0 -0
  893. data/lib/clojure/lang/ArrayStream$ArrayStream_long.class +0 -0
  894. data/lib/clojure/lang/ArrayStream$ArrayStream_short.class +0 -0
  895. data/lib/clojure/lang/ArrayStream.class +0 -0
  896. data/lib/clojure/lang/Associative.class +0 -0
  897. data/lib/clojure/lang/Atom.class +0 -0
  898. data/lib/clojure/lang/Binding.class +0 -0
  899. data/lib/clojure/lang/Box.class +0 -0
  900. data/lib/clojure/lang/Compile.class +0 -0
  901. data/lib/clojure/lang/Compiler$1.class +0 -0
  902. data/lib/clojure/lang/Compiler$AssignExpr$Parser.class +0 -0
  903. data/lib/clojure/lang/Compiler$AssignExpr.class +0 -0
  904. data/lib/clojure/lang/Compiler$AssignableExpr.class +0 -0
  905. data/lib/clojure/lang/Compiler$BindingInit.class +0 -0
  906. data/lib/clojure/lang/Compiler$BodyExpr$Parser.class +0 -0
  907. data/lib/clojure/lang/Compiler$BodyExpr.class +0 -0
  908. data/lib/clojure/lang/Compiler$BooleanExpr.class +0 -0
  909. data/lib/clojure/lang/Compiler$C.class +0 -0
  910. data/lib/clojure/lang/Compiler$CompilerException.class +0 -0
  911. data/lib/clojure/lang/Compiler$ConstantExpr$Parser.class +0 -0
  912. data/lib/clojure/lang/Compiler$ConstantExpr.class +0 -0
  913. data/lib/clojure/lang/Compiler$DefExpr$Parser.class +0 -0
  914. data/lib/clojure/lang/Compiler$DefExpr.class +0 -0
  915. data/lib/clojure/lang/Compiler$EmptyExpr.class +0 -0
  916. data/lib/clojure/lang/Compiler$Expr.class +0 -0
  917. data/lib/clojure/lang/Compiler$FieldExpr.class +0 -0
  918. data/lib/clojure/lang/Compiler$FnExpr.class +0 -0
  919. data/lib/clojure/lang/Compiler$FnLoaderThunk.class +0 -0
  920. data/lib/clojure/lang/Compiler$FnMethod.class +0 -0
  921. data/lib/clojure/lang/Compiler$HostExpr$Parser.class +0 -0
  922. data/lib/clojure/lang/Compiler$HostExpr.class +0 -0
  923. data/lib/clojure/lang/Compiler$IParser.class +0 -0
  924. data/lib/clojure/lang/Compiler$IfExpr$Parser.class +0 -0
  925. data/lib/clojure/lang/Compiler$IfExpr.class +0 -0
  926. data/lib/clojure/lang/Compiler$InstanceFieldExpr.class +0 -0
  927. data/lib/clojure/lang/Compiler$InstanceMethodExpr.class +0 -0
  928. data/lib/clojure/lang/Compiler$InvokeExpr.class +0 -0
  929. data/lib/clojure/lang/Compiler$KeywordExpr.class +0 -0
  930. data/lib/clojure/lang/Compiler$LetExpr$Parser.class +0 -0
  931. data/lib/clojure/lang/Compiler$LetExpr.class +0 -0
  932. data/lib/clojure/lang/Compiler$LetFnExpr$Parser.class +0 -0
  933. data/lib/clojure/lang/Compiler$LetFnExpr.class +0 -0
  934. data/lib/clojure/lang/Compiler$ListExpr.class +0 -0
  935. data/lib/clojure/lang/Compiler$LiteralExpr.class +0 -0
  936. data/lib/clojure/lang/Compiler$LocalBinding.class +0 -0
  937. data/lib/clojure/lang/Compiler$LocalBindingExpr.class +0 -0
  938. data/lib/clojure/lang/Compiler$MapExpr.class +0 -0
  939. data/lib/clojure/lang/Compiler$MaybePrimitiveExpr.class +0 -0
  940. data/lib/clojure/lang/Compiler$MetaExpr.class +0 -0
  941. data/lib/clojure/lang/Compiler$MethodExpr.class +0 -0
  942. data/lib/clojure/lang/Compiler$MonitorEnterExpr$Parser.class +0 -0
  943. data/lib/clojure/lang/Compiler$MonitorEnterExpr.class +0 -0
  944. data/lib/clojure/lang/Compiler$MonitorExitExpr$Parser.class +0 -0
  945. data/lib/clojure/lang/Compiler$MonitorExitExpr.class +0 -0
  946. data/lib/clojure/lang/Compiler$NewExpr$Parser.class +0 -0
  947. data/lib/clojure/lang/Compiler$NewExpr.class +0 -0
  948. data/lib/clojure/lang/Compiler$NilExpr.class +0 -0
  949. data/lib/clojure/lang/Compiler$PSTATE.class +0 -0
  950. data/lib/clojure/lang/Compiler$RecurExpr$Parser.class +0 -0
  951. data/lib/clojure/lang/Compiler$RecurExpr.class +0 -0
  952. data/lib/clojure/lang/Compiler$SetExpr.class +0 -0
  953. data/lib/clojure/lang/Compiler$SourceDebugExtensionAttribute.class +0 -0
  954. data/lib/clojure/lang/Compiler$StaticFieldExpr.class +0 -0
  955. data/lib/clojure/lang/Compiler$StaticMethodExpr.class +0 -0
  956. data/lib/clojure/lang/Compiler$StringExpr.class +0 -0
  957. data/lib/clojure/lang/Compiler$TheVarExpr$Parser.class +0 -0
  958. data/lib/clojure/lang/Compiler$TheVarExpr.class +0 -0
  959. data/lib/clojure/lang/Compiler$ThrowExpr$Parser.class +0 -0
  960. data/lib/clojure/lang/Compiler$ThrowExpr.class +0 -0
  961. data/lib/clojure/lang/Compiler$TryExpr$CatchClause.class +0 -0
  962. data/lib/clojure/lang/Compiler$TryExpr$Parser.class +0 -0
  963. data/lib/clojure/lang/Compiler$TryExpr.class +0 -0
  964. data/lib/clojure/lang/Compiler$UnresolvedVarExpr.class +0 -0
  965. data/lib/clojure/lang/Compiler$UntypedExpr.class +0 -0
  966. data/lib/clojure/lang/Compiler$VarExpr.class +0 -0
  967. data/lib/clojure/lang/Compiler$VectorExpr.class +0 -0
  968. data/lib/clojure/lang/Compiler.class +0 -0
  969. data/lib/clojure/lang/Cons.class +0 -0
  970. data/lib/clojure/lang/Counted.class +0 -0
  971. data/lib/clojure/lang/Delay.class +0 -0
  972. data/lib/clojure/lang/DynamicClassLoader.class +0 -0
  973. data/lib/clojure/lang/EnumerationSeq$State.class +0 -0
  974. data/lib/clojure/lang/EnumerationSeq.class +0 -0
  975. data/lib/clojure/lang/Fn.class +0 -0
  976. data/lib/clojure/lang/IDeref.class +0 -0
  977. data/lib/clojure/lang/IFn.class +0 -0
  978. data/lib/clojure/lang/IMapEntry.class +0 -0
  979. data/lib/clojure/lang/IMeta.class +0 -0
  980. data/lib/clojure/lang/IObj.class +0 -0
  981. data/lib/clojure/lang/IPersistentCollection.class +0 -0
  982. data/lib/clojure/lang/IPersistentList.class +0 -0
  983. data/lib/clojure/lang/IPersistentMap.class +0 -0
  984. data/lib/clojure/lang/IPersistentSet.class +0 -0
  985. data/lib/clojure/lang/IPersistentStack.class +0 -0
  986. data/lib/clojure/lang/IPersistentVector.class +0 -0
  987. data/lib/clojure/lang/IProxy.class +0 -0
  988. data/lib/clojure/lang/IReduce.class +0 -0
  989. data/lib/clojure/lang/IRef.class +0 -0
  990. data/lib/clojure/lang/IReference.class +0 -0
  991. data/lib/clojure/lang/ISeq.class +0 -0
  992. data/lib/clojure/lang/IndexedSeq.class +0 -0
  993. data/lib/clojure/lang/IteratorSeq$State.class +0 -0
  994. data/lib/clojure/lang/IteratorSeq.class +0 -0
  995. data/lib/clojure/lang/IteratorStream.class +0 -0
  996. data/lib/clojure/lang/Keyword.class +0 -0
  997. data/lib/clojure/lang/LazilyPersistentVector.class +0 -0
  998. data/lib/clojure/lang/LazySeq.class +0 -0
  999. data/lib/clojure/lang/LineNumberingPushbackReader.class +0 -0
  1000. data/lib/clojure/lang/LispReader$ArgReader.class +0 -0
  1001. data/lib/clojure/lang/LispReader$CharacterReader.class +0 -0
  1002. data/lib/clojure/lang/LispReader$CommentReader.class +0 -0
  1003. data/lib/clojure/lang/LispReader$CtorReader.class +0 -0
  1004. data/lib/clojure/lang/LispReader$DiscardReader.class +0 -0
  1005. data/lib/clojure/lang/LispReader$DispatchReader.class +0 -0
  1006. data/lib/clojure/lang/LispReader$EvalReader.class +0 -0
  1007. data/lib/clojure/lang/LispReader$FnReader.class +0 -0
  1008. data/lib/clojure/lang/LispReader$ListReader.class +0 -0
  1009. data/lib/clojure/lang/LispReader$MapReader.class +0 -0
  1010. data/lib/clojure/lang/LispReader$MetaReader.class +0 -0
  1011. data/lib/clojure/lang/LispReader$ReaderException.class +0 -0
  1012. data/lib/clojure/lang/LispReader$RegexReader.class +0 -0
  1013. data/lib/clojure/lang/LispReader$SetReader.class +0 -0
  1014. data/lib/clojure/lang/LispReader$StringReader.class +0 -0
  1015. data/lib/clojure/lang/LispReader$SyntaxQuoteReader.class +0 -0
  1016. data/lib/clojure/lang/LispReader$UnmatchedDelimiterReader.class +0 -0
  1017. data/lib/clojure/lang/LispReader$UnquoteReader.class +0 -0
  1018. data/lib/clojure/lang/LispReader$UnreadableReader.class +0 -0
  1019. data/lib/clojure/lang/LispReader$VarReader.class +0 -0
  1020. data/lib/clojure/lang/LispReader$VectorReader.class +0 -0
  1021. data/lib/clojure/lang/LispReader$WrappingReader.class +0 -0
  1022. data/lib/clojure/lang/LispReader.class +0 -0
  1023. data/lib/clojure/lang/LockingTransaction$AbortException.class +0 -0
  1024. data/lib/clojure/lang/LockingTransaction$CFn.class +0 -0
  1025. data/lib/clojure/lang/LockingTransaction$Info.class +0 -0
  1026. data/lib/clojure/lang/LockingTransaction$Notify.class +0 -0
  1027. data/lib/clojure/lang/LockingTransaction$RetryEx.class +0 -0
  1028. data/lib/clojure/lang/LockingTransaction.class +0 -0
  1029. data/lib/clojure/lang/MapEntry.class +0 -0
  1030. data/lib/clojure/lang/MultiFn.class +0 -0
  1031. data/lib/clojure/lang/Named.class +0 -0
  1032. data/lib/clojure/lang/Namespace.class +0 -0
  1033. data/lib/clojure/lang/Numbers$BigDecimalOps.class +0 -0
  1034. data/lib/clojure/lang/Numbers$BigIntegerBitOps.class +0 -0
  1035. data/lib/clojure/lang/Numbers$BigIntegerOps.class +0 -0
  1036. data/lib/clojure/lang/Numbers$BitOps.class +0 -0
  1037. data/lib/clojure/lang/Numbers$DoubleOps.class +0 -0
  1038. data/lib/clojure/lang/Numbers$FloatOps.class +0 -0
  1039. data/lib/clojure/lang/Numbers$IntegerBitOps.class +0 -0
  1040. data/lib/clojure/lang/Numbers$IntegerOps.class +0 -0
  1041. data/lib/clojure/lang/Numbers$LongBitOps.class +0 -0
  1042. data/lib/clojure/lang/Numbers$LongOps.class +0 -0
  1043. data/lib/clojure/lang/Numbers$Ops.class +0 -0
  1044. data/lib/clojure/lang/Numbers$RatioOps.class +0 -0
  1045. data/lib/clojure/lang/Numbers.class +0 -0
  1046. data/lib/clojure/lang/Obj.class +0 -0
  1047. data/lib/clojure/lang/PersistentArrayMap$Iter.class +0 -0
  1048. data/lib/clojure/lang/PersistentArrayMap$Seq.class +0 -0
  1049. data/lib/clojure/lang/PersistentArrayMap.class +0 -0
  1050. data/lib/clojure/lang/PersistentHashMap$BitmapIndexedNode$Seq.class +0 -0
  1051. data/lib/clojure/lang/PersistentHashMap$BitmapIndexedNode.class +0 -0
  1052. data/lib/clojure/lang/PersistentHashMap$EmptyNode.class +0 -0
  1053. data/lib/clojure/lang/PersistentHashMap$FullNode$Seq.class +0 -0
  1054. data/lib/clojure/lang/PersistentHashMap$FullNode.class +0 -0
  1055. data/lib/clojure/lang/PersistentHashMap$HashCollisionNode.class +0 -0
  1056. data/lib/clojure/lang/PersistentHashMap$INode.class +0 -0
  1057. data/lib/clojure/lang/PersistentHashMap$LeafNode.class +0 -0
  1058. data/lib/clojure/lang/PersistentHashMap.class +0 -0
  1059. data/lib/clojure/lang/PersistentHashSet.class +0 -0
  1060. data/lib/clojure/lang/PersistentList$1.class +0 -0
  1061. data/lib/clojure/lang/PersistentList$EmptyList$1.class +0 -0
  1062. data/lib/clojure/lang/PersistentList$EmptyList.class +0 -0
  1063. data/lib/clojure/lang/PersistentList.class +0 -0
  1064. data/lib/clojure/lang/PersistentQueue$Seq.class +0 -0
  1065. data/lib/clojure/lang/PersistentQueue.class +0 -0
  1066. data/lib/clojure/lang/PersistentStructMap$1.class +0 -0
  1067. data/lib/clojure/lang/PersistentStructMap$Def.class +0 -0
  1068. data/lib/clojure/lang/PersistentStructMap$Seq.class +0 -0
  1069. data/lib/clojure/lang/PersistentStructMap.class +0 -0
  1070. data/lib/clojure/lang/PersistentTreeMap$Black.class +0 -0
  1071. data/lib/clojure/lang/PersistentTreeMap$BlackBranch.class +0 -0
  1072. data/lib/clojure/lang/PersistentTreeMap$BlackBranchVal.class +0 -0
  1073. data/lib/clojure/lang/PersistentTreeMap$BlackVal.class +0 -0
  1074. data/lib/clojure/lang/PersistentTreeMap$KeyIterator.class +0 -0
  1075. data/lib/clojure/lang/PersistentTreeMap$Node.class +0 -0
  1076. data/lib/clojure/lang/PersistentTreeMap$NodeIterator.class +0 -0
  1077. data/lib/clojure/lang/PersistentTreeMap$Red.class +0 -0
  1078. data/lib/clojure/lang/PersistentTreeMap$RedBranch.class +0 -0
  1079. data/lib/clojure/lang/PersistentTreeMap$RedBranchVal.class +0 -0
  1080. data/lib/clojure/lang/PersistentTreeMap$RedVal.class +0 -0
  1081. data/lib/clojure/lang/PersistentTreeMap$Seq.class +0 -0
  1082. data/lib/clojure/lang/PersistentTreeMap$ValIterator.class +0 -0
  1083. data/lib/clojure/lang/PersistentTreeMap.class +0 -0
  1084. data/lib/clojure/lang/PersistentTreeSet.class +0 -0
  1085. data/lib/clojure/lang/PersistentVector.class +0 -0
  1086. data/lib/clojure/lang/ProxyHandler.class +0 -0
  1087. data/lib/clojure/lang/RT$1.class +0 -0
  1088. data/lib/clojure/lang/RT$2.class +0 -0
  1089. data/lib/clojure/lang/RT$3.class +0 -0
  1090. data/lib/clojure/lang/RT$4.class +0 -0
  1091. data/lib/clojure/lang/RT$5.class +0 -0
  1092. data/lib/clojure/lang/RT$6.class +0 -0
  1093. data/lib/clojure/lang/RT.class +0 -0
  1094. data/lib/clojure/lang/Range$Src.class +0 -0
  1095. data/lib/clojure/lang/Range.class +0 -0
  1096. data/lib/clojure/lang/Ratio.class +0 -0
  1097. data/lib/clojure/lang/Ref$TVal.class +0 -0
  1098. data/lib/clojure/lang/Ref.class +0 -0
  1099. data/lib/clojure/lang/Reflector.class +0 -0
  1100. data/lib/clojure/lang/Repl.class +0 -0
  1101. data/lib/clojure/lang/RestFn.class +0 -0
  1102. data/lib/clojure/lang/Reversible.class +0 -0
  1103. data/lib/clojure/lang/Script.class +0 -0
  1104. data/lib/clojure/lang/SeqEnumeration.class +0 -0
  1105. data/lib/clojure/lang/SeqIterator.class +0 -0
  1106. data/lib/clojure/lang/Seqable.class +0 -0
  1107. data/lib/clojure/lang/Sequential.class +0 -0
  1108. data/lib/clojure/lang/Settable.class +0 -0
  1109. data/lib/clojure/lang/Sorted.class +0 -0
  1110. data/lib/clojure/lang/Stream$1.class +0 -0
  1111. data/lib/clojure/lang/Stream$2.class +0 -0
  1112. data/lib/clojure/lang/Stream.class +0 -0
  1113. data/lib/clojure/lang/Streamable.class +0 -0
  1114. data/lib/clojure/lang/StringSeq.class +0 -0
  1115. data/lib/clojure/lang/Symbol.class +0 -0
  1116. data/lib/clojure/lang/TransactionalHashMap$1.class +0 -0
  1117. data/lib/clojure/lang/TransactionalHashMap.class +0 -0
  1118. data/lib/clojure/lang/Util.class +0 -0
  1119. data/lib/clojure/lang/Var$1.class +0 -0
  1120. data/lib/clojure/lang/Var$2.class +0 -0
  1121. data/lib/clojure/lang/Var$Frame.class +0 -0
  1122. data/lib/clojure/lang/Var.class +0 -0
  1123. data/lib/clojure/lang/XMLHandler.class +0 -0
  1124. data/lib/clojure/main$eval_opt__5839.class +0 -0
  1125. data/lib/clojure/main$help_opt__5871.class +0 -0
  1126. data/lib/clojure/main$init_dispatch__5843.class +0 -0
  1127. data/lib/clojure/main$init_opt__5836.class +0 -0
  1128. data/lib/clojure/main$initialize__5846.class +0 -0
  1129. data/lib/clojure/main$legacy_repl__5878.class +0 -0
  1130. data/lib/clojure/main$legacy_script__5883.class +0 -0
  1131. data/lib/clojure/main$load_script__5833.class +0 -0
  1132. data/lib/clojure/main$main__5888.class +0 -0
  1133. data/lib/clojure/main$main_dispatch__5874.class +0 -0
  1134. data/lib/clojure/main$null_opt__5868.class +0 -0
  1135. data/lib/clojure/main$repl__5813$fn__5816.class +0 -0
  1136. data/lib/clojure/main$repl__5813$fn__5819.class +0 -0
  1137. data/lib/clojure/main$repl__5813$fn__5822.class +0 -0
  1138. data/lib/clojure/main$repl__5813$fn__5829.class +0 -0
  1139. data/lib/clojure/main$repl__5813$read_eval_print__5825.class +0 -0
  1140. data/lib/clojure/main$repl__5813.class +0 -0
  1141. data/lib/clojure/main$repl_caught__5810.class +0 -0
  1142. data/lib/clojure/main$repl_exception__5807.class +0 -0
  1143. data/lib/clojure/main$repl_opt__5853$fn__5856.class +0 -0
  1144. data/lib/clojure/main$repl_opt__5853$fn__5859.class +0 -0
  1145. data/lib/clojure/main$repl_opt__5853.class +0 -0
  1146. data/lib/clojure/main$repl_prompt__5789.class +0 -0
  1147. data/lib/clojure/main$repl_read__5799.class +0 -0
  1148. data/lib/clojure/main$root_cause__5803.class +0 -0
  1149. data/lib/clojure/main$script_opt__5864.class +0 -0
  1150. data/lib/clojure/main$skip_if_eol__5792.class +0 -0
  1151. data/lib/clojure/main$skip_whitespace__5795.class +0 -0
  1152. data/lib/clojure/main$with_bindings__5786.class +0 -0
  1153. data/lib/clojure/main.class +0 -0
  1154. data/lib/clojure/main.clj +337 -0
  1155. data/lib/clojure/main__init.class +0 -0
  1156. data/lib/clojure/parallel.clj +248 -0
  1157. data/lib/clojure/proxy/clojure/lang/APersistentMap.class +0 -0
  1158. data/lib/clojure/proxy/java/lang/Object$ContentHandler.class +0 -0
  1159. data/lib/clojure/proxy/java/lang/Object$Future$IDeref.class +0 -0
  1160. data/lib/clojure/proxy/java/lang/Object$TableModel.class +0 -0
  1161. data/lib/clojure/proxy/java/lang/Object$TreeModel.class +0 -0
  1162. data/lib/clojure/proxy/javax/swing/table/AbstractTableModel.class +0 -0
  1163. data/lib/clojure/set$bubble_max_key__5896$fn__5898.class +0 -0
  1164. data/lib/clojure/set$bubble_max_key__5896.class +0 -0
  1165. data/lib/clojure/set$difference__5920$fn__5923.class +0 -0
  1166. data/lib/clojure/set$difference__5920.class +0 -0
  1167. data/lib/clojure/set$index__5956$fn__5958.class +0 -0
  1168. data/lib/clojure/set$index__5956.class +0 -0
  1169. data/lib/clojure/set$intersection__5909$fn__5912.class +0 -0
  1170. data/lib/clojure/set$intersection__5909$fn__5916.class +0 -0
  1171. data/lib/clojure/set$intersection__5909.class +0 -0
  1172. data/lib/clojure/set$join__5974$fn__5977$fn__5979.class +0 -0
  1173. data/lib/clojure/set$join__5974$fn__5977.class +0 -0
  1174. data/lib/clojure/set$join__5974$fn__5985$fn__5987.class +0 -0
  1175. data/lib/clojure/set$join__5974$fn__5985.class +0 -0
  1176. data/lib/clojure/set$join__5974.class +0 -0
  1177. data/lib/clojure/set$map_invert__5962$fn__5965.class +0 -0
  1178. data/lib/clojure/set$map_invert__5962.class +0 -0
  1179. data/lib/clojure/set$project__5935$fn__5937.class +0 -0
  1180. data/lib/clojure/set$project__5935.class +0 -0
  1181. data/lib/clojure/set$rename__5950$fn__5952.class +0 -0
  1182. data/lib/clojure/set$rename__5950.class +0 -0
  1183. data/lib/clojure/set$rename_keys__5941$fn__5944.class +0 -0
  1184. data/lib/clojure/set$rename_keys__5941.class +0 -0
  1185. data/lib/clojure/set$select__5928$fn__5930.class +0 -0
  1186. data/lib/clojure/set$select__5928.class +0 -0
  1187. data/lib/clojure/set$union__5902.class +0 -0
  1188. data/lib/clojure/set.clj +148 -0
  1189. data/lib/clojure/set__init.class +0 -0
  1190. data/lib/clojure/version.properties +5 -0
  1191. data/lib/clojure/xml$emit__6057.class +0 -0
  1192. data/lib/clojure/xml$emit_element__6052.class +0 -0
  1193. data/lib/clojure/xml$fn__5994$fn__6007.class +0 -0
  1194. data/lib/clojure/xml$fn__5994$fn__6010.class +0 -0
  1195. data/lib/clojure/xml$fn__5994$fn__6013.class +0 -0
  1196. data/lib/clojure/xml$fn__5994$fn__6016.class +0 -0
  1197. data/lib/clojure/xml$fn__5994$fn__6019.class +0 -0
  1198. data/lib/clojure/xml$fn__5994$fn__6022.class +0 -0
  1199. data/lib/clojure/xml$fn__5994$fn__6025.class +0 -0
  1200. data/lib/clojure/xml$fn__5994$fn__6028$attrs__6030.class +0 -0
  1201. data/lib/clojure/xml$fn__5994$fn__6028.class +0 -0
  1202. data/lib/clojure/xml$fn__5994$fn__6034.class +0 -0
  1203. data/lib/clojure/xml$fn__5994$fn__6037.class +0 -0
  1204. data/lib/clojure/xml$fn__5994$fn__6040.class +0 -0
  1205. data/lib/clojure/xml$fn__5994$push_chars__6000$fn__6002.class +0 -0
  1206. data/lib/clojure/xml$fn__5994$push_chars__6000.class +0 -0
  1207. data/lib/clojure/xml$fn__5994$push_content__5996.class +0 -0
  1208. data/lib/clojure/xml$fn__5994.class +0 -0
  1209. data/lib/clojure/xml$parse__6048.class +0 -0
  1210. data/lib/clojure/xml$startparse_sax__6045.class +0 -0
  1211. data/lib/clojure/xml.clj +115 -0
  1212. data/lib/clojure/xml__init.class +0 -0
  1213. data/lib/clojure/zip$append_child__6155.class +0 -0
  1214. data/lib/clojure/zip$branch_QMARK___6085.class +0 -0
  1215. data/lib/clojure/zip$children__6088.class +0 -0
  1216. data/lib/clojure/zip$down__6103.class +0 -0
  1217. data/lib/clojure/zip$edit__6149.class +0 -0
  1218. data/lib/clojure/zip$end_QMARK___6171.class +0 -0
  1219. data/lib/clojure/zip$insert_child__6152.class +0 -0
  1220. data/lib/clojure/zip$insert_left__6137.class +0 -0
  1221. data/lib/clojure/zip$insert_right__6141.class +0 -0
  1222. data/lib/clojure/zip$left__6127.class +0 -0
  1223. data/lib/clojure/zip$leftmost__6132.class +0 -0
  1224. data/lib/clojure/zip$lefts__6097.class +0 -0
  1225. data/lib/clojure/zip$make_node__6091.class +0 -0
  1226. data/lib/clojure/zip$next__6158.class +0 -0
  1227. data/lib/clojure/zip$node__6082.class +0 -0
  1228. data/lib/clojure/zip$path__6094.class +0 -0
  1229. data/lib/clojure/zip$prev__6165.class +0 -0
  1230. data/lib/clojure/zip$remove__6174.class +0 -0
  1231. data/lib/clojure/zip$replace__6145.class +0 -0
  1232. data/lib/clojure/zip$right__6116.class +0 -0
  1233. data/lib/clojure/zip$rightmost__6122.class +0 -0
  1234. data/lib/clojure/zip$rights__6100.class +0 -0
  1235. data/lib/clojure/zip$root__6113.class +0 -0
  1236. data/lib/clojure/zip$seq_zip__6063$fn__6065.class +0 -0
  1237. data/lib/clojure/zip$seq_zip__6063.class +0 -0
  1238. data/lib/clojure/zip$up__6108.class +0 -0
  1239. data/lib/clojure/zip$vector_zip__6069$fn__6071.class +0 -0
  1240. data/lib/clojure/zip$vector_zip__6069.class +0 -0
  1241. data/lib/clojure/zip$xml_zip__6075$fn__6077.class +0 -0
  1242. data/lib/clojure/zip$xml_zip__6075.class +0 -0
  1243. data/lib/clojure/zip$zipper__6060.class +0 -0
  1244. data/lib/clojure/zip.clj +278 -0
  1245. data/lib/clojure/zip__init.class +0 -0
  1246. data/src/clj/clojure/core.clj +4121 -0
  1247. data/src/clj/clojure/core_print.clj +317 -0
  1248. data/src/clj/clojure/core_proxy.clj +394 -0
  1249. data/src/clj/clojure/genclass.clj +683 -0
  1250. data/src/clj/clojure/inspector.clj +180 -0
  1251. data/src/clj/clojure/main.clj +337 -0
  1252. data/src/clj/clojure/parallel.clj +248 -0
  1253. data/src/clj/clojure/set.clj +148 -0
  1254. data/src/clj/clojure/version.properties +5 -0
  1255. data/src/clj/clojure/xml.clj +115 -0
  1256. data/src/clj/clojure/zip.clj +278 -0
  1257. data/src/jvm/clojure/asm/AnnotationVisitor.java +97 -0
  1258. data/src/jvm/clojure/asm/AnnotationWriter.java +357 -0
  1259. data/src/jvm/clojure/asm/Attribute.java +253 -0
  1260. data/src/jvm/clojure/asm/ByteVector.java +318 -0
  1261. data/src/jvm/clojure/asm/ClassAdapter.java +115 -0
  1262. data/src/jvm/clojure/asm/ClassReader.java +2224 -0
  1263. data/src/jvm/clojure/asm/ClassVisitor.java +196 -0
  1264. data/src/jvm/clojure/asm/ClassWriter.java +1415 -0
  1265. data/src/jvm/clojure/asm/Edge.java +75 -0
  1266. data/src/jvm/clojure/asm/FieldVisitor.java +64 -0
  1267. data/src/jvm/clojure/asm/FieldWriter.java +290 -0
  1268. data/src/jvm/clojure/asm/Frame.java +1506 -0
  1269. data/src/jvm/clojure/asm/Handler.java +70 -0
  1270. data/src/jvm/clojure/asm/Item.java +258 -0
  1271. data/src/jvm/clojure/asm/Label.java +437 -0
  1272. data/src/jvm/clojure/asm/MethodAdapter.java +186 -0
  1273. data/src/jvm/clojure/asm/MethodVisitor.java +396 -0
  1274. data/src/jvm/clojure/asm/MethodWriter.java +3029 -0
  1275. data/src/jvm/clojure/asm/Opcodes.java +341 -0
  1276. data/src/jvm/clojure/asm/Type.java +872 -0
  1277. data/src/jvm/clojure/asm/commons/AdviceAdapter.java +681 -0
  1278. data/src/jvm/clojure/asm/commons/AnalyzerAdapter.java +938 -0
  1279. data/src/jvm/clojure/asm/commons/CodeSizeEvaluator.java +234 -0
  1280. data/src/jvm/clojure/asm/commons/EmptyVisitor.java +221 -0
  1281. data/src/jvm/clojure/asm/commons/GeneratorAdapter.java +1533 -0
  1282. data/src/jvm/clojure/asm/commons/LocalVariablesSorter.java +330 -0
  1283. data/src/jvm/clojure/asm/commons/Method.java +267 -0
  1284. data/src/jvm/clojure/asm/commons/SerialVersionUIDAdder.java +508 -0
  1285. data/src/jvm/clojure/asm/commons/StaticInitMerger.java +102 -0
  1286. data/src/jvm/clojure/asm/commons/TableSwitchGenerator.java +55 -0
  1287. data/src/jvm/clojure/asm/commons/package.html +48 -0
  1288. data/src/jvm/clojure/asm/package.html +87 -0
  1289. data/src/jvm/clojure/lang/AFn.java +452 -0
  1290. data/src/jvm/clojure/lang/AFunction.java +47 -0
  1291. data/src/jvm/clojure/lang/AMapEntry.java +149 -0
  1292. data/src/jvm/clojure/lang/APersistentMap.java +382 -0
  1293. data/src/jvm/clojure/lang/APersistentSet.java +159 -0
  1294. data/src/jvm/clojure/lang/APersistentVector.java +579 -0
  1295. data/src/jvm/clojure/lang/ARef.java +107 -0
  1296. data/src/jvm/clojure/lang/AReference.java +40 -0
  1297. data/src/jvm/clojure/lang/ASeq.java +282 -0
  1298. data/src/jvm/clojure/lang/Agent.java +194 -0
  1299. data/src/jvm/clojure/lang/ArraySeq.java +316 -0
  1300. data/src/jvm/clojure/lang/ArrayStream.java +184 -0
  1301. data/src/jvm/clojure/lang/Associative.java +22 -0
  1302. data/src/jvm/clojure/lang/Atom.java +104 -0
  1303. data/src/jvm/clojure/lang/Binding.java +26 -0
  1304. data/src/jvm/clojure/lang/Box.java +22 -0
  1305. data/src/jvm/clojure/lang/Compile.java +73 -0
  1306. data/src/jvm/clojure/lang/Compiler.java +5017 -0
  1307. data/src/jvm/clojure/lang/Cons.java +53 -0
  1308. data/src/jvm/clojure/lang/Counted.java +18 -0
  1309. data/src/jvm/clojure/lang/Delay.java +38 -0
  1310. data/src/jvm/clojure/lang/DynamicClassLoader.java +71 -0
  1311. data/src/jvm/clojure/lang/EnumerationSeq.java +71 -0
  1312. data/src/jvm/clojure/lang/Fn.java +16 -0
  1313. data/src/jvm/clojure/lang/IDeref.java +17 -0
  1314. data/src/jvm/clojure/lang/IFn.java +90 -0
  1315. data/src/jvm/clojure/lang/IMapEntry.java +19 -0
  1316. data/src/jvm/clojure/lang/IMeta.java +17 -0
  1317. data/src/jvm/clojure/lang/IObj.java +18 -0
  1318. data/src/jvm/clojure/lang/IPersistentCollection.java +23 -0
  1319. data/src/jvm/clojure/lang/IPersistentList.java +16 -0
  1320. data/src/jvm/clojure/lang/IPersistentMap.java +23 -0
  1321. data/src/jvm/clojure/lang/IPersistentSet.java +19 -0
  1322. data/src/jvm/clojure/lang/IPersistentStack.java +19 -0
  1323. data/src/jvm/clojure/lang/IPersistentVector.java +22 -0
  1324. data/src/jvm/clojure/lang/IProxy.java +21 -0
  1325. data/src/jvm/clojure/lang/IReduce.java +19 -0
  1326. data/src/jvm/clojure/lang/IRef.java +27 -0
  1327. data/src/jvm/clojure/lang/IReference.java +18 -0
  1328. data/src/jvm/clojure/lang/ISeq.java +29 -0
  1329. data/src/jvm/clojure/lang/IndexedSeq.java +16 -0
  1330. data/src/jvm/clojure/lang/IteratorSeq.java +69 -0
  1331. data/src/jvm/clojure/lang/IteratorStream.java +29 -0
  1332. data/src/jvm/clojure/lang/Keyword.java +199 -0
  1333. data/src/jvm/clojure/lang/LazilyPersistentVector.java +79 -0
  1334. data/src/jvm/clojure/lang/LazySeq.java +233 -0
  1335. data/src/jvm/clojure/lang/LineNumberingPushbackReader.java +75 -0
  1336. data/src/jvm/clojure/lang/LispReader.java +1063 -0
  1337. data/src/jvm/clojure/lang/LockingTransaction.java +583 -0
  1338. data/src/jvm/clojure/lang/MapEntry.java +40 -0
  1339. data/src/jvm/clojure/lang/MultiFn.java +308 -0
  1340. data/src/jvm/clojure/lang/Named.java +19 -0
  1341. data/src/jvm/clojure/lang/Namespace.java +178 -0
  1342. data/src/jvm/clojure/lang/Numbers.java +4371 -0
  1343. data/src/jvm/clojure/lang/Obj.java +33 -0
  1344. data/src/jvm/clojure/lang/PersistentArrayMap.java +263 -0
  1345. data/src/jvm/clojure/lang/PersistentHashMap.java +746 -0
  1346. data/src/jvm/clojure/lang/PersistentHashSet.java +72 -0
  1347. data/src/jvm/clojure/lang/PersistentList.java +298 -0
  1348. data/src/jvm/clojure/lang/PersistentQueue.java +304 -0
  1349. data/src/jvm/clojure/lang/PersistentStructMap.java +225 -0
  1350. data/src/jvm/clojure/lang/PersistentTreeMap.java +998 -0
  1351. data/src/jvm/clojure/lang/PersistentTreeSet.java +94 -0
  1352. data/src/jvm/clojure/lang/PersistentVector.java +320 -0
  1353. data/src/jvm/clojure/lang/ProxyHandler.java +72 -0
  1354. data/src/jvm/clojure/lang/RT.java +1676 -0
  1355. data/src/jvm/clojure/lang/Range.java +85 -0
  1356. data/src/jvm/clojure/lang/Ratio.java +74 -0
  1357. data/src/jvm/clojure/lang/Ref.java +335 -0
  1358. data/src/jvm/clojure/lang/Reflector.java +448 -0
  1359. data/src/jvm/clojure/lang/Repl.java +22 -0
  1360. data/src/jvm/clojure/lang/RestFn.java +1335 -0
  1361. data/src/jvm/clojure/lang/Reversible.java +17 -0
  1362. data/src/jvm/clojure/lang/Script.java +22 -0
  1363. data/src/jvm/clojure/lang/SeqEnumeration.java +33 -0
  1364. data/src/jvm/clojure/lang/SeqIterator.java +41 -0
  1365. data/src/jvm/clojure/lang/Seqable.java +17 -0
  1366. data/src/jvm/clojure/lang/Sequential.java +13 -0
  1367. data/src/jvm/clojure/lang/Settable.java +18 -0
  1368. data/src/jvm/clojure/lang/Sorted.java +25 -0
  1369. data/src/jvm/clojure/lang/Stream.java +88 -0
  1370. data/src/jvm/clojure/lang/Streamable.java +17 -0
  1371. data/src/jvm/clojure/lang/StringSeq.java +50 -0
  1372. data/src/jvm/clojure/lang/Symbol.java +121 -0
  1373. data/src/jvm/clojure/lang/TransactionalHashMap.java +197 -0
  1374. data/src/jvm/clojure/lang/Util.java +74 -0
  1375. data/src/jvm/clojure/lang/Var.java +472 -0
  1376. data/src/jvm/clojure/lang/XMLHandler.java +89 -0
  1377. data/src/jvm/clojure/main.java +41 -0
  1378. metadata +1433 -0
@@ -0,0 +1,3029 @@
1
+ /***
2
+ * ASM: a very small and fast Java bytecode manipulation framework
3
+ * Copyright (c) 2000-2005 INRIA, France Telecom
4
+ * All rights reserved.
5
+ *
6
+ * Redistribution and use in source and binary forms, with or without
7
+ * modification, are permitted provided that the following conditions
8
+ * are met:
9
+ * 1. Redistributions of source code must retain the above copyright
10
+ * notice, this list of conditions and the following disclaimer.
11
+ * 2. Redistributions in binary form must reproduce the above copyright
12
+ * notice, this list of conditions and the following disclaimer in the
13
+ * documentation and/or other materials provided with the distribution.
14
+ * 3. Neither the name of the copyright holders nor the names of its
15
+ * contributors may be used to endorse or promote products derived from
16
+ * this software without specific prior written permission.
17
+ *
18
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
22
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
28
+ * THE POSSIBILITY OF SUCH DAMAGE.
29
+ */
30
+ package clojure.asm;
31
+
32
+ /**
33
+ * A {@link MethodVisitor} that generates methods in bytecode form. Each visit
34
+ * method of this class appends the bytecode corresponding to the visited
35
+ * instruction to a byte vector, in the order these methods are called.
36
+ *
37
+ * @author Eric Bruneton
38
+ * @author Eugene Kuleshov
39
+ */
40
+ class MethodWriter implements MethodVisitor{
41
+
42
+ /**
43
+ * Pseudo access flag used to denote constructors.
44
+ */
45
+ final static int ACC_CONSTRUCTOR = 262144;
46
+
47
+ /**
48
+ * Frame has exactly the same locals as the previous stack map frame and
49
+ * number of stack items is zero.
50
+ */
51
+ final static int SAME_FRAME = 0; // to 63 (0-3f)
52
+
53
+ /**
54
+ * Frame has exactly the same locals as the previous stack map frame and
55
+ * number of stack items is 1
56
+ */
57
+ final static int SAME_LOCALS_1_STACK_ITEM_FRAME = 64; // to 127 (40-7f)
58
+
59
+ /**
60
+ * Reserved for future use
61
+ */
62
+ final static int RESERVED = 128;
63
+
64
+ /**
65
+ * Frame has exactly the same locals as the previous stack map frame and
66
+ * number of stack items is 1. Offset is bigger then 63;
67
+ */
68
+ final static int SAME_LOCALS_1_STACK_ITEM_FRAME_EXTENDED = 247; // f7
69
+
70
+ /**
71
+ * Frame where current locals are the same as the locals in the previous
72
+ * frame, except that the k last locals are absent. The value of k is given
73
+ * by the formula 251-frame_type.
74
+ */
75
+ final static int CHOP_FRAME = 248; // to 250 (f8-fA)
76
+
77
+ /**
78
+ * Frame has exactly the same locals as the previous stack map frame and
79
+ * number of stack items is zero. Offset is bigger then 63;
80
+ */
81
+ final static int SAME_FRAME_EXTENDED = 251; // fb
82
+
83
+ /**
84
+ * Frame where current locals are the same as the locals in the previous
85
+ * frame, except that k additional locals are defined. The value of k is
86
+ * given by the formula frame_type-251.
87
+ */
88
+ final static int APPEND_FRAME = 252; // to 254 // fc-fe
89
+
90
+ /**
91
+ * Full frame
92
+ */
93
+ final static int FULL_FRAME = 255; // ff
94
+
95
+ /**
96
+ * Indicates that the stack map frames must be recomputed from scratch. In
97
+ * this case the maximum stack size and number of local variables is also
98
+ * recomputed from scratch.
99
+ *
100
+ * @see #compute
101
+ */
102
+ private final static int FRAMES = 0;
103
+
104
+ /**
105
+ * Indicates that the maximum stack size and number of local variables must
106
+ * be automatically computed.
107
+ *
108
+ * @see #compute
109
+ */
110
+ private final static int MAXS = 1;
111
+
112
+ /**
113
+ * Indicates that nothing must be automatically computed.
114
+ *
115
+ * @see #compute
116
+ */
117
+ private final static int NOTHING = 2;
118
+
119
+ /**
120
+ * Next method writer (see {@link ClassWriter#firstMethod firstMethod}).
121
+ */
122
+ MethodWriter next;
123
+
124
+ /**
125
+ * The class writer to which this method must be added.
126
+ */
127
+ ClassWriter cw;
128
+
129
+ /**
130
+ * Access flags of this method.
131
+ */
132
+ private int access;
133
+
134
+ /**
135
+ * The index of the constant pool item that contains the name of this
136
+ * method.
137
+ */
138
+ private int name;
139
+
140
+ /**
141
+ * The index of the constant pool item that contains the descriptor of this
142
+ * method.
143
+ */
144
+ private int desc;
145
+
146
+ /**
147
+ * The descriptor of this method.
148
+ */
149
+ private String descriptor;
150
+
151
+ /**
152
+ * The signature of this method.
153
+ */
154
+ String signature;
155
+
156
+ /**
157
+ * If not zero, indicates that the code of this method must be copied from
158
+ * the ClassReader associated to this writer in <code>cw.cr</code>. More
159
+ * precisely, this field gives the index of the first byte to copied from
160
+ * <code>cw.cr.b</code>.
161
+ */
162
+ int classReaderOffset;
163
+
164
+ /**
165
+ * If not zero, indicates that the code of this method must be copied from
166
+ * the ClassReader associated to this writer in <code>cw.cr</code>. More
167
+ * precisely, this field gives the number of bytes to copied from
168
+ * <code>cw.cr.b</code>.
169
+ */
170
+ int classReaderLength;
171
+
172
+ /**
173
+ * Number of exceptions that can be thrown by this method.
174
+ */
175
+ int exceptionCount;
176
+
177
+ /**
178
+ * The exceptions that can be thrown by this method. More precisely, this
179
+ * array contains the indexes of the constant pool items that contain the
180
+ * internal names of these exception classes.
181
+ */
182
+ int[] exceptions;
183
+
184
+ /**
185
+ * The annotation default attribute of this method. May be <tt>null</tt>.
186
+ */
187
+ private ByteVector annd;
188
+
189
+ /**
190
+ * The runtime visible annotations of this method. May be <tt>null</tt>.
191
+ */
192
+ private AnnotationWriter anns;
193
+
194
+ /**
195
+ * The runtime invisible annotations of this method. May be <tt>null</tt>.
196
+ */
197
+ private AnnotationWriter ianns;
198
+
199
+ /**
200
+ * The runtime visible parameter annotations of this method. May be
201
+ * <tt>null</tt>.
202
+ */
203
+ private AnnotationWriter[] panns;
204
+
205
+ /**
206
+ * The runtime invisible parameter annotations of this method. May be
207
+ * <tt>null</tt>.
208
+ */
209
+ private AnnotationWriter[] ipanns;
210
+
211
+ /**
212
+ * The non standard attributes of the method.
213
+ */
214
+ private Attribute attrs;
215
+
216
+ /**
217
+ * The bytecode of this method.
218
+ */
219
+ private ByteVector code = new ByteVector();
220
+
221
+ /**
222
+ * Maximum stack size of this method.
223
+ */
224
+ private int maxStack;
225
+
226
+ /**
227
+ * Maximum number of local variables for this method.
228
+ */
229
+ private int maxLocals;
230
+
231
+ /**
232
+ * Number of stack map frames in the StackMapTable attribute.
233
+ */
234
+ private int frameCount;
235
+
236
+ /**
237
+ * The StackMapTable attribute.
238
+ */
239
+ private ByteVector stackMap;
240
+
241
+ /**
242
+ * The offset of the last frame that was written in the StackMapTable
243
+ * attribute.
244
+ */
245
+ private int previousFrameOffset;
246
+
247
+ /**
248
+ * The last frame that was written in the StackMapTable attribute.
249
+ *
250
+ * @see #frame
251
+ */
252
+ private int[] previousFrame;
253
+
254
+ /**
255
+ * Index of the next element to be added in {@link #frame}.
256
+ */
257
+ private int frameIndex;
258
+
259
+ /**
260
+ * The current stack map frame. The first element contains the offset of the
261
+ * instruction to which the frame corresponds, the second element is the
262
+ * number of locals and the third one is the number of stack elements. The
263
+ * local variables start at index 3 and are followed by the operand stack
264
+ * values. In summary frame[0] = offset, frame[1] = nLocal, frame[2] =
265
+ * nStack, frame[3] = nLocal. All types are encoded as integers, with the
266
+ * same format as the one used in {@link Label}, but limited to BASE types.
267
+ */
268
+ private int[] frame;
269
+
270
+ /**
271
+ * Number of elements in the exception handler list.
272
+ */
273
+ private int handlerCount;
274
+
275
+ /**
276
+ * The first element in the exception handler list.
277
+ */
278
+ private Handler firstHandler;
279
+
280
+ /**
281
+ * The last element in the exception handler list.
282
+ */
283
+ private Handler lastHandler;
284
+
285
+ /**
286
+ * Number of entries in the LocalVariableTable attribute.
287
+ */
288
+ private int localVarCount;
289
+
290
+ /**
291
+ * The LocalVariableTable attribute.
292
+ */
293
+ private ByteVector localVar;
294
+
295
+ /**
296
+ * Number of entries in the LocalVariableTypeTable attribute.
297
+ */
298
+ private int localVarTypeCount;
299
+
300
+ /**
301
+ * The LocalVariableTypeTable attribute.
302
+ */
303
+ private ByteVector localVarType;
304
+
305
+ /**
306
+ * Number of entries in the LineNumberTable attribute.
307
+ */
308
+ private int lineNumberCount;
309
+
310
+ /**
311
+ * The LineNumberTable attribute.
312
+ */
313
+ private ByteVector lineNumber;
314
+
315
+ /**
316
+ * The non standard attributes of the method's code.
317
+ */
318
+ private Attribute cattrs;
319
+
320
+ /**
321
+ * Indicates if some jump instructions are too small and need to be resized.
322
+ */
323
+ private boolean resize;
324
+
325
+ /**
326
+ * Indicates if the instructions contain at least one JSR instruction.
327
+ */
328
+ private boolean jsr;
329
+
330
+ // ------------------------------------------------------------------------
331
+
332
+ /*
333
+ * Fields for the control flow graph analysis algorithm (used to compute the
334
+ * maximum stack size). A control flow graph contains one node per "basic
335
+ * block", and one edge per "jump" from one basic block to another. Each
336
+ * node (i.e., each basic block) is represented by the Label object that
337
+ * corresponds to the first instruction of this basic block. Each node also
338
+ * stores the list of its successors in the graph, as a linked list of Edge
339
+ * objects.
340
+ */
341
+
342
+ /**
343
+ * Indicates what must be automatically computed.
344
+ *
345
+ * @see FRAMES
346
+ * @see MAXS
347
+ * @see NOTHING
348
+ */
349
+ private int compute;
350
+
351
+ /**
352
+ * A list of labels. This list is the list of basic blocks in the method,
353
+ * i.e. a list of Label objects linked to each other by their
354
+ * {@link Label#successor} field, in the order they are visited by
355
+ * {@link visitLabel}, and starting with the first basic block.
356
+ */
357
+ private Label labels;
358
+
359
+ /**
360
+ * The previous basic block.
361
+ */
362
+ private Label previousBlock;
363
+
364
+ /**
365
+ * The current basic block.
366
+ */
367
+ private Label currentBlock;
368
+
369
+ /**
370
+ * The (relative) stack size after the last visited instruction. This size
371
+ * is relative to the beginning of the current basic block, i.e., the true
372
+ * stack size after the last visited instruction is equal to the
373
+ * {@link Label#inputStackTop beginStackSize} of the current basic block
374
+ * plus <tt>stackSize</tt>.
375
+ */
376
+ private int stackSize;
377
+
378
+ /**
379
+ * The (relative) maximum stack size after the last visited instruction.
380
+ * This size is relative to the beginning of the current basic block, i.e.,
381
+ * the true maximum stack size after the last visited instruction is equal
382
+ * to the {@link Label#inputStackTop beginStackSize} of the current basic
383
+ * block plus <tt>stackSize</tt>.
384
+ */
385
+ private int maxStackSize;
386
+
387
+ // ------------------------------------------------------------------------
388
+ // Constructor
389
+ // ------------------------------------------------------------------------
390
+
391
+ /**
392
+ * Constructs a new {@link MethodWriter}.
393
+ *
394
+ * @param cw the class writer in which the method must be added.
395
+ * @param access the method's access flags (see {@link Opcodes}).
396
+ * @param name the method's name.
397
+ * @param desc the method's descriptor (see {@link Type}).
398
+ * @param signature the method's signature. May be <tt>null</tt>.
399
+ * @param exceptions the internal names of the method's exceptions. May be
400
+ * <tt>null</tt>.
401
+ * @param computeMaxs <tt>true</tt> if the maximum stack size and number
402
+ * of local variables must be automatically computed.
403
+ * @param computeFrames <tt>true</tt> if the stack map tables must be
404
+ * recomputed from scratch.
405
+ */
406
+ MethodWriter(
407
+ final ClassWriter cw,
408
+ final int access,
409
+ final String name,
410
+ final String desc,
411
+ final String signature,
412
+ final String[] exceptions,
413
+ final boolean computeMaxs,
414
+ final boolean computeFrames){
415
+ if(cw.firstMethod == null)
416
+ {
417
+ cw.firstMethod = this;
418
+ }
419
+ else
420
+ {
421
+ cw.lastMethod.next = this;
422
+ }
423
+ cw.lastMethod = this;
424
+ this.cw = cw;
425
+ this.access = access;
426
+ this.name = cw.newUTF8(name);
427
+ this.desc = cw.newUTF8(desc);
428
+ this.descriptor = desc;
429
+ this.signature = signature;
430
+ if(exceptions != null && exceptions.length > 0)
431
+ {
432
+ exceptionCount = exceptions.length;
433
+ this.exceptions = new int[exceptionCount];
434
+ for(int i = 0; i < exceptionCount; ++i)
435
+ {
436
+ this.exceptions[i] = cw.newClass(exceptions[i]);
437
+ }
438
+ }
439
+ this.compute = computeFrames ? FRAMES : (computeMaxs ? MAXS : NOTHING);
440
+ if(computeMaxs || computeFrames)
441
+ {
442
+ if(computeFrames && name.equals("<init>"))
443
+ {
444
+ this.access |= ACC_CONSTRUCTOR;
445
+ }
446
+ // updates maxLocals
447
+ int size = getArgumentsAndReturnSizes(descriptor) >> 2;
448
+ if((access & Opcodes.ACC_STATIC) != 0)
449
+ {
450
+ --size;
451
+ }
452
+ maxLocals = size;
453
+ // creates and visits the label for the first basic block
454
+ labels = new Label();
455
+ labels.status |= Label.PUSHED;
456
+ visitLabel(labels);
457
+ }
458
+ }
459
+
460
+ // ------------------------------------------------------------------------
461
+ // Implementation of the MethodVisitor interface
462
+ // ------------------------------------------------------------------------
463
+
464
+ public AnnotationVisitor visitAnnotationDefault(){
465
+ annd = new ByteVector();
466
+ return new AnnotationWriter(cw, false, annd, null, 0);
467
+ }
468
+
469
+ public AnnotationVisitor visitAnnotation(
470
+ final String desc,
471
+ final boolean visible){
472
+ ByteVector bv = new ByteVector();
473
+ // write type, and reserve space for values count
474
+ bv.putShort(cw.newUTF8(desc)).putShort(0);
475
+ AnnotationWriter aw = new AnnotationWriter(cw, true, bv, bv, 2);
476
+ if(visible)
477
+ {
478
+ aw.next = anns;
479
+ anns = aw;
480
+ }
481
+ else
482
+ {
483
+ aw.next = ianns;
484
+ ianns = aw;
485
+ }
486
+ return aw;
487
+ }
488
+
489
+ public AnnotationVisitor visitParameterAnnotation(
490
+ final int parameter,
491
+ final String desc,
492
+ final boolean visible){
493
+ ByteVector bv = new ByteVector();
494
+ // write type, and reserve space for values count
495
+ bv.putShort(cw.newUTF8(desc)).putShort(0);
496
+ AnnotationWriter aw = new AnnotationWriter(cw, true, bv, bv, 2);
497
+ if(visible)
498
+ {
499
+ if(panns == null)
500
+ {
501
+ panns = new AnnotationWriter[Type.getArgumentTypes(descriptor).length];
502
+ }
503
+ aw.next = panns[parameter];
504
+ panns[parameter] = aw;
505
+ }
506
+ else
507
+ {
508
+ if(ipanns == null)
509
+ {
510
+ ipanns = new AnnotationWriter[Type.getArgumentTypes(descriptor).length];
511
+ }
512
+ aw.next = ipanns[parameter];
513
+ ipanns[parameter] = aw;
514
+ }
515
+ return aw;
516
+ }
517
+
518
+ public void visitAttribute(final Attribute attr){
519
+ if(attr.isCodeAttribute())
520
+ {
521
+ attr.next = cattrs;
522
+ cattrs = attr;
523
+ }
524
+ else
525
+ {
526
+ attr.next = attrs;
527
+ attrs = attr;
528
+ }
529
+ }
530
+
531
+ public void visitCode(){
532
+ }
533
+
534
+ public void visitFrame(
535
+ final int type,
536
+ final int nLocal,
537
+ final Object[] local,
538
+ final int nStack,
539
+ final Object[] stack){
540
+ if(compute == FRAMES)
541
+ {
542
+ return;
543
+ }
544
+
545
+ if(type == Opcodes.F_NEW)
546
+ {
547
+ startFrame(code.length, nLocal, nStack);
548
+ for(int i = 0; i < nLocal; ++i)
549
+ {
550
+ if(local[i] instanceof String)
551
+ {
552
+ frame[frameIndex++] = Frame.OBJECT
553
+ | cw.addType((String) local[i]);
554
+ }
555
+ else if(local[i] instanceof Integer)
556
+ {
557
+ frame[frameIndex++] = ((Integer) local[i]).intValue();
558
+ }
559
+ else
560
+ {
561
+ frame[frameIndex++] = Frame.UNINITIALIZED
562
+ | cw.addUninitializedType("",
563
+ ((Label) local[i]).position);
564
+ }
565
+ }
566
+ for(int i = 0; i < nStack; ++i)
567
+ {
568
+ if(stack[i] instanceof String)
569
+ {
570
+ frame[frameIndex++] = Frame.OBJECT
571
+ | cw.addType((String) stack[i]);
572
+ }
573
+ else if(stack[i] instanceof Integer)
574
+ {
575
+ frame[frameIndex++] = ((Integer) stack[i]).intValue();
576
+ }
577
+ else
578
+ {
579
+ frame[frameIndex++] = Frame.UNINITIALIZED
580
+ | cw.addUninitializedType("",
581
+ ((Label) stack[i]).position);
582
+ }
583
+ }
584
+ endFrame();
585
+ }
586
+ else
587
+ {
588
+ int delta;
589
+ if(stackMap == null)
590
+ {
591
+ stackMap = new ByteVector();
592
+ delta = code.length;
593
+ }
594
+ else
595
+ {
596
+ delta = code.length - previousFrameOffset - 1;
597
+ }
598
+
599
+ switch(type)
600
+ {
601
+ case Opcodes.F_FULL:
602
+ stackMap.putByte(FULL_FRAME)
603
+ .putShort(delta)
604
+ .putShort(nLocal);
605
+ for(int i = 0; i < nLocal; ++i)
606
+ {
607
+ writeFrameType(local[i]);
608
+ }
609
+ stackMap.putShort(nStack);
610
+ for(int i = 0; i < nStack; ++i)
611
+ {
612
+ writeFrameType(stack[i]);
613
+ }
614
+ break;
615
+ case Opcodes.F_APPEND:
616
+ stackMap.putByte(SAME_FRAME_EXTENDED + nLocal)
617
+ .putShort(delta);
618
+ for(int i = 0; i < nLocal; ++i)
619
+ {
620
+ writeFrameType(local[i]);
621
+ }
622
+ break;
623
+ case Opcodes.F_CHOP:
624
+ stackMap.putByte(SAME_FRAME_EXTENDED - nLocal)
625
+ .putShort(delta);
626
+ break;
627
+ case Opcodes.F_SAME:
628
+ if(delta < 64)
629
+ {
630
+ stackMap.putByte(delta);
631
+ }
632
+ else
633
+ {
634
+ stackMap.putByte(SAME_FRAME_EXTENDED).putShort(delta);
635
+ }
636
+ break;
637
+ case Opcodes.F_SAME1:
638
+ if(delta < 64)
639
+ {
640
+ stackMap.putByte(SAME_LOCALS_1_STACK_ITEM_FRAME + delta);
641
+ }
642
+ else
643
+ {
644
+ stackMap.putByte(SAME_LOCALS_1_STACK_ITEM_FRAME_EXTENDED)
645
+ .putShort(delta);
646
+ }
647
+ writeFrameType(stack[0]);
648
+ break;
649
+ }
650
+
651
+ previousFrameOffset = code.length;
652
+ ++frameCount;
653
+ }
654
+ }
655
+
656
+ public void visitInsn(final int opcode){
657
+ // adds the instruction to the bytecode of the method
658
+ code.putByte(opcode);
659
+ // update currentBlock
660
+ // Label currentBlock = this.currentBlock;
661
+ if(currentBlock != null)
662
+ {
663
+ if(compute == FRAMES)
664
+ {
665
+ currentBlock.frame.execute(opcode, 0, null, null);
666
+ }
667
+ else
668
+ {
669
+ // updates current and max stack sizes
670
+ int size = stackSize + Frame.SIZE[opcode];
671
+ if(size > maxStackSize)
672
+ {
673
+ maxStackSize = size;
674
+ }
675
+ stackSize = size;
676
+ }
677
+ // if opcode == ATHROW or xRETURN, ends current block (no successor)
678
+ if((opcode >= Opcodes.IRETURN && opcode <= Opcodes.RETURN)
679
+ || opcode == Opcodes.ATHROW)
680
+ {
681
+ noSuccessor();
682
+ }
683
+ }
684
+ }
685
+
686
+ public void visitIntInsn(final int opcode, final int operand){
687
+ // Label currentBlock = this.currentBlock;
688
+ if(currentBlock != null)
689
+ {
690
+ if(compute == FRAMES)
691
+ {
692
+ currentBlock.frame.execute(opcode, operand, null, null);
693
+ }
694
+ else if(opcode != Opcodes.NEWARRAY)
695
+ {
696
+ // updates current and max stack sizes only for NEWARRAY
697
+ // (stack size variation = 0 for BIPUSH or SIPUSH)
698
+ int size = stackSize + 1;
699
+ if(size > maxStackSize)
700
+ {
701
+ maxStackSize = size;
702
+ }
703
+ stackSize = size;
704
+ }
705
+ }
706
+ // adds the instruction to the bytecode of the method
707
+ if(opcode == Opcodes.SIPUSH)
708
+ {
709
+ code.put12(opcode, operand);
710
+ }
711
+ else
712
+ { // BIPUSH or NEWARRAY
713
+ code.put11(opcode, operand);
714
+ }
715
+ }
716
+
717
+ public void visitVarInsn(final int opcode, final int var){
718
+ // Label currentBlock = this.currentBlock;
719
+ if(currentBlock != null)
720
+ {
721
+ if(compute == FRAMES)
722
+ {
723
+ currentBlock.frame.execute(opcode, var, null, null);
724
+ }
725
+ else
726
+ {
727
+ // updates current and max stack sizes
728
+ if(opcode == Opcodes.RET)
729
+ {
730
+ // no stack change, but end of current block (no successor)
731
+ currentBlock.status |= Label.RET;
732
+ // save 'stackSize' here for future use
733
+ // (see {@link #findSubroutineSuccessors})
734
+ currentBlock.inputStackTop = stackSize;
735
+ noSuccessor();
736
+ }
737
+ else
738
+ { // xLOAD or xSTORE
739
+ int size = stackSize + Frame.SIZE[opcode];
740
+ if(size > maxStackSize)
741
+ {
742
+ maxStackSize = size;
743
+ }
744
+ stackSize = size;
745
+ }
746
+ }
747
+ }
748
+ if(compute != NOTHING)
749
+ {
750
+ // updates max locals
751
+ int n;
752
+ if(opcode == Opcodes.LLOAD || opcode == Opcodes.DLOAD
753
+ || opcode == Opcodes.LSTORE || opcode == Opcodes.DSTORE)
754
+ {
755
+ n = var + 2;
756
+ }
757
+ else
758
+ {
759
+ n = var + 1;
760
+ }
761
+ if(n > maxLocals)
762
+ {
763
+ maxLocals = n;
764
+ }
765
+ }
766
+ // adds the instruction to the bytecode of the method
767
+ if(var < 4 && opcode != Opcodes.RET)
768
+ {
769
+ int opt;
770
+ if(opcode < Opcodes.ISTORE)
771
+ {
772
+ /* ILOAD_0 */
773
+ opt = 26 + ((opcode - Opcodes.ILOAD) << 2) + var;
774
+ }
775
+ else
776
+ {
777
+ /* ISTORE_0 */
778
+ opt = 59 + ((opcode - Opcodes.ISTORE) << 2) + var;
779
+ }
780
+ code.putByte(opt);
781
+ }
782
+ else if(var >= 256)
783
+ {
784
+ code.putByte(196 /* WIDE */).put12(opcode, var);
785
+ }
786
+ else
787
+ {
788
+ code.put11(opcode, var);
789
+ }
790
+ if(opcode >= Opcodes.ISTORE && compute == FRAMES && handlerCount > 0)
791
+ {
792
+ visitLabel(new Label());
793
+ }
794
+ }
795
+
796
+ public void visitTypeInsn(final int opcode, final String desc){
797
+ Item i = cw.newClassItem(desc);
798
+ // Label currentBlock = this.currentBlock;
799
+ if(currentBlock != null)
800
+ {
801
+ if(compute == FRAMES)
802
+ {
803
+ currentBlock.frame.execute(opcode, code.length, cw, i);
804
+ }
805
+ else if(opcode == Opcodes.NEW)
806
+ {
807
+ // updates current and max stack sizes only if opcode == NEW
808
+ // (no stack change for ANEWARRAY, CHECKCAST, INSTANCEOF)
809
+ int size = stackSize + 1;
810
+ if(size > maxStackSize)
811
+ {
812
+ maxStackSize = size;
813
+ }
814
+ stackSize = size;
815
+ }
816
+ }
817
+ // adds the instruction to the bytecode of the method
818
+ code.put12(opcode, i.index);
819
+ }
820
+
821
+ public void visitFieldInsn(
822
+ final int opcode,
823
+ final String owner,
824
+ final String name,
825
+ final String desc){
826
+ Item i = cw.newFieldItem(owner, name, desc);
827
+ // Label currentBlock = this.currentBlock;
828
+ if(currentBlock != null)
829
+ {
830
+ if(compute == FRAMES)
831
+ {
832
+ currentBlock.frame.execute(opcode, 0, cw, i);
833
+ }
834
+ else
835
+ {
836
+ int size;
837
+ // computes the stack size variation
838
+ char c = desc.charAt(0);
839
+ switch(opcode)
840
+ {
841
+ case Opcodes.GETSTATIC:
842
+ size = stackSize + (c == 'D' || c == 'J' ? 2 : 1);
843
+ break;
844
+ case Opcodes.PUTSTATIC:
845
+ size = stackSize + (c == 'D' || c == 'J' ? -2 : -1);
846
+ break;
847
+ case Opcodes.GETFIELD:
848
+ size = stackSize + (c == 'D' || c == 'J' ? 1 : 0);
849
+ break;
850
+ // case Constants.PUTFIELD:
851
+ default:
852
+ size = stackSize + (c == 'D' || c == 'J' ? -3 : -2);
853
+ break;
854
+ }
855
+ // updates current and max stack sizes
856
+ if(size > maxStackSize)
857
+ {
858
+ maxStackSize = size;
859
+ }
860
+ stackSize = size;
861
+ }
862
+ }
863
+ // adds the instruction to the bytecode of the method
864
+ code.put12(opcode, i.index);
865
+ }
866
+
867
+ public void visitMethodInsn(
868
+ final int opcode,
869
+ final String owner,
870
+ final String name,
871
+ final String desc){
872
+ boolean itf = opcode == Opcodes.INVOKEINTERFACE;
873
+ Item i = cw.newMethodItem(owner, name, desc, itf);
874
+ int argSize = i.intVal;
875
+ // Label currentBlock = this.currentBlock;
876
+ if(currentBlock != null)
877
+ {
878
+ if(compute == FRAMES)
879
+ {
880
+ currentBlock.frame.execute(opcode, 0, cw, i);
881
+ }
882
+ else
883
+ {
884
+ /*
885
+ * computes the stack size variation. In order not to recompute
886
+ * several times this variation for the same Item, we use the
887
+ * intVal field of this item to store this variation, once it
888
+ * has been computed. More precisely this intVal field stores
889
+ * the sizes of the arguments and of the return value
890
+ * corresponding to desc.
891
+ */
892
+ if(argSize == 0)
893
+ {
894
+ // the above sizes have not been computed yet,
895
+ // so we compute them...
896
+ argSize = getArgumentsAndReturnSizes(desc);
897
+ // ... and we save them in order
898
+ // not to recompute them in the future
899
+ i.intVal = argSize;
900
+ }
901
+ int size;
902
+ if(opcode == Opcodes.INVOKESTATIC)
903
+ {
904
+ size = stackSize - (argSize >> 2) + (argSize & 0x03) + 1;
905
+ }
906
+ else
907
+ {
908
+ size = stackSize - (argSize >> 2) + (argSize & 0x03);
909
+ }
910
+ // updates current and max stack sizes
911
+ if(size > maxStackSize)
912
+ {
913
+ maxStackSize = size;
914
+ }
915
+ stackSize = size;
916
+ }
917
+ }
918
+ // adds the instruction to the bytecode of the method
919
+ if(itf)
920
+ {
921
+ if(argSize == 0)
922
+ {
923
+ argSize = getArgumentsAndReturnSizes(desc);
924
+ i.intVal = argSize;
925
+ }
926
+ code.put12(Opcodes.INVOKEINTERFACE, i.index).put11(argSize >> 2, 0);
927
+ }
928
+ else
929
+ {
930
+ code.put12(opcode, i.index);
931
+ }
932
+ }
933
+
934
+ public void visitJumpInsn(final int opcode, final Label label){
935
+ Label nextInsn = null;
936
+ // Label currentBlock = this.currentBlock;
937
+ if(currentBlock != null)
938
+ {
939
+ if(compute == FRAMES)
940
+ {
941
+ currentBlock.frame.execute(opcode, 0, null, null);
942
+ // 'label' is the target of a jump instruction
943
+ label.getFirst().status |= Label.TARGET;
944
+ // adds 'label' as a successor of this basic block
945
+ addSuccessor(Edge.NORMAL, label);
946
+ if(opcode != Opcodes.GOTO)
947
+ {
948
+ // creates a Label for the next basic block
949
+ nextInsn = new Label();
950
+ }
951
+ }
952
+ else
953
+ {
954
+ if(opcode == Opcodes.JSR)
955
+ {
956
+ jsr = true;
957
+ currentBlock.status |= Label.JSR;
958
+ addSuccessor(stackSize + 1, label);
959
+ // creates a Label for the next basic block
960
+ nextInsn = new Label();
961
+ /*
962
+ * note that, by construction in this method, a JSR block
963
+ * has at least two successors in the control flow graph:
964
+ * the first one leads the next instruction after the JSR,
965
+ * while the second one leads to the JSR target.
966
+ */
967
+ }
968
+ else
969
+ {
970
+ // updates current stack size (max stack size unchanged
971
+ // because stack size variation always negative in this
972
+ // case)
973
+ stackSize += Frame.SIZE[opcode];
974
+ addSuccessor(stackSize, label);
975
+ }
976
+ }
977
+ }
978
+ // adds the instruction to the bytecode of the method
979
+ if((label.status & Label.RESOLVED) != 0
980
+ && label.position - code.length < Short.MIN_VALUE)
981
+ {
982
+ /*
983
+ * case of a backward jump with an offset < -32768. In this case we
984
+ * automatically replace GOTO with GOTO_W, JSR with JSR_W and IFxxx
985
+ * <l> with IFNOTxxx <l'> GOTO_W <l>, where IFNOTxxx is the
986
+ * "opposite" opcode of IFxxx (i.e., IFNE for IFEQ) and where <l'>
987
+ * designates the instruction just after the GOTO_W.
988
+ */
989
+ if(opcode == Opcodes.GOTO)
990
+ {
991
+ code.putByte(200); // GOTO_W
992
+ }
993
+ else if(opcode == Opcodes.JSR)
994
+ {
995
+ code.putByte(201); // JSR_W
996
+ }
997
+ else
998
+ {
999
+ // if the IF instruction is transformed into IFNOT GOTO_W the
1000
+ // next instruction becomes the target of the IFNOT instruction
1001
+ if(nextInsn != null)
1002
+ {
1003
+ nextInsn.status |= Label.TARGET;
1004
+ }
1005
+ code.putByte(opcode <= 166
1006
+ ? ((opcode + 1) ^ 1) - 1
1007
+ : opcode ^ 1);
1008
+ code.putShort(8); // jump offset
1009
+ code.putByte(200); // GOTO_W
1010
+ }
1011
+ label.put(this, code, code.length - 1, true);
1012
+ }
1013
+ else
1014
+ {
1015
+ /*
1016
+ * case of a backward jump with an offset >= -32768, or of a forward
1017
+ * jump with, of course, an unknown offset. In these cases we store
1018
+ * the offset in 2 bytes (which will be increased in
1019
+ * resizeInstructions, if needed).
1020
+ */
1021
+ code.putByte(opcode);
1022
+ label.put(this, code, code.length - 1, false);
1023
+ }
1024
+ if(currentBlock != null)
1025
+ {
1026
+ if(nextInsn != null)
1027
+ {
1028
+ // if the jump instruction is not a GOTO, the next instruction
1029
+ // is also a successor of this instruction. Calling visitLabel
1030
+ // adds the label of this next instruction as a successor of the
1031
+ // current block, and starts a new basic block
1032
+ visitLabel(nextInsn);
1033
+ }
1034
+ if(opcode == Opcodes.GOTO)
1035
+ {
1036
+ noSuccessor();
1037
+ }
1038
+ }
1039
+ }
1040
+
1041
+ public void visitLabel(final Label label){
1042
+ // resolves previous forward references to label, if any
1043
+ resize |= label.resolve(this, code.length, code.data);
1044
+ // updates currentBlock
1045
+ if((label.status & Label.DEBUG) != 0)
1046
+ {
1047
+ return;
1048
+ }
1049
+ if(compute == FRAMES)
1050
+ {
1051
+ if(currentBlock != null)
1052
+ {
1053
+ if(label.position == currentBlock.position)
1054
+ {
1055
+ // successive labels, do not start a new basic block
1056
+ currentBlock.status |= (label.status & Label.TARGET);
1057
+ label.frame = currentBlock.frame;
1058
+ return;
1059
+ }
1060
+ // ends current block (with one new successor)
1061
+ addSuccessor(Edge.NORMAL, label);
1062
+ }
1063
+ // begins a new current block
1064
+ currentBlock = label;
1065
+ if(label.frame == null)
1066
+ {
1067
+ label.frame = new Frame();
1068
+ label.frame.owner = label;
1069
+ }
1070
+ // updates the basic block list
1071
+ if(previousBlock != null)
1072
+ {
1073
+ if(label.position == previousBlock.position)
1074
+ {
1075
+ previousBlock.status |= (label.status & Label.TARGET);
1076
+ label.frame = previousBlock.frame;
1077
+ currentBlock = previousBlock;
1078
+ return;
1079
+ }
1080
+ previousBlock.successor = label;
1081
+ }
1082
+ previousBlock = label;
1083
+ }
1084
+ else if(compute == MAXS)
1085
+ {
1086
+ if(currentBlock != null)
1087
+ {
1088
+ // ends current block (with one new successor)
1089
+ currentBlock.outputStackMax = maxStackSize;
1090
+ addSuccessor(stackSize, label);
1091
+ }
1092
+ // begins a new current block
1093
+ currentBlock = label;
1094
+ // resets the relative current and max stack sizes
1095
+ stackSize = 0;
1096
+ maxStackSize = 0;
1097
+ // updates the basic block list
1098
+ if(previousBlock != null)
1099
+ {
1100
+ previousBlock.successor = label;
1101
+ }
1102
+ previousBlock = label;
1103
+ }
1104
+ }
1105
+
1106
+ public void visitLdcInsn(final Object cst){
1107
+ Item i = cw.newConstItem(cst);
1108
+ // Label currentBlock = this.currentBlock;
1109
+ if(currentBlock != null)
1110
+ {
1111
+ if(compute == FRAMES)
1112
+ {
1113
+ currentBlock.frame.execute(Opcodes.LDC, 0, cw, i);
1114
+ }
1115
+ else
1116
+ {
1117
+ int size;
1118
+ // computes the stack size variation
1119
+ if(i.type == ClassWriter.LONG || i.type == ClassWriter.DOUBLE)
1120
+ {
1121
+ size = stackSize + 2;
1122
+ }
1123
+ else
1124
+ {
1125
+ size = stackSize + 1;
1126
+ }
1127
+ // updates current and max stack sizes
1128
+ if(size > maxStackSize)
1129
+ {
1130
+ maxStackSize = size;
1131
+ }
1132
+ stackSize = size;
1133
+ }
1134
+ }
1135
+ // adds the instruction to the bytecode of the method
1136
+ int index = i.index;
1137
+ if(i.type == ClassWriter.LONG || i.type == ClassWriter.DOUBLE)
1138
+ {
1139
+ code.put12(20 /* LDC2_W */, index);
1140
+ }
1141
+ else if(index >= 256)
1142
+ {
1143
+ code.put12(19 /* LDC_W */, index);
1144
+ }
1145
+ else
1146
+ {
1147
+ code.put11(Opcodes.LDC, index);
1148
+ }
1149
+ }
1150
+
1151
+ public void visitIincInsn(final int var, final int increment){
1152
+ if(currentBlock != null)
1153
+ {
1154
+ if(compute == FRAMES)
1155
+ {
1156
+ currentBlock.frame.execute(Opcodes.IINC, var, null, null);
1157
+ }
1158
+ }
1159
+ if(compute != NOTHING)
1160
+ {
1161
+ // updates max locals
1162
+ int n = var + 1;
1163
+ if(n > maxLocals)
1164
+ {
1165
+ maxLocals = n;
1166
+ }
1167
+ }
1168
+ // adds the instruction to the bytecode of the method
1169
+ if((var > 255) || (increment > 127) || (increment < -128))
1170
+ {
1171
+ code.putByte(196 /* WIDE */)
1172
+ .put12(Opcodes.IINC, var)
1173
+ .putShort(increment);
1174
+ }
1175
+ else
1176
+ {
1177
+ code.putByte(Opcodes.IINC).put11(var, increment);
1178
+ }
1179
+ }
1180
+
1181
+ public void visitTableSwitchInsn(
1182
+ final int min,
1183
+ final int max,
1184
+ final Label dflt,
1185
+ final Label labels[]){
1186
+ // adds the instruction to the bytecode of the method
1187
+ int source = code.length;
1188
+ code.putByte(Opcodes.TABLESWITCH);
1189
+ code.length += (4 - code.length % 4) % 4;
1190
+ dflt.put(this, code, source, true);
1191
+ code.putInt(min).putInt(max);
1192
+ for(int i = 0; i < labels.length; ++i)
1193
+ {
1194
+ labels[i].put(this, code, source, true);
1195
+ }
1196
+ // updates currentBlock
1197
+ visitSwitchInsn(dflt, labels);
1198
+ }
1199
+
1200
+ public void visitLookupSwitchInsn(
1201
+ final Label dflt,
1202
+ final int keys[],
1203
+ final Label labels[]){
1204
+ // adds the instruction to the bytecode of the method
1205
+ int source = code.length;
1206
+ code.putByte(Opcodes.LOOKUPSWITCH);
1207
+ code.length += (4 - code.length % 4) % 4;
1208
+ dflt.put(this, code, source, true);
1209
+ code.putInt(labels.length);
1210
+ for(int i = 0; i < labels.length; ++i)
1211
+ {
1212
+ code.putInt(keys[i]);
1213
+ labels[i].put(this, code, source, true);
1214
+ }
1215
+ // updates currentBlock
1216
+ visitSwitchInsn(dflt, labels);
1217
+ }
1218
+
1219
+ private void visitSwitchInsn(final Label dflt, final Label[] labels){
1220
+ // Label currentBlock = this.currentBlock;
1221
+ if(currentBlock != null)
1222
+ {
1223
+ if(compute == FRAMES)
1224
+ {
1225
+ currentBlock.frame.execute(Opcodes.LOOKUPSWITCH, 0, null, null);
1226
+ // adds current block successors
1227
+ addSuccessor(Edge.NORMAL, dflt);
1228
+ dflt.getFirst().status |= Label.TARGET;
1229
+ for(int i = 0; i < labels.length; ++i)
1230
+ {
1231
+ addSuccessor(Edge.NORMAL, labels[i]);
1232
+ labels[i].getFirst().status |= Label.TARGET;
1233
+ }
1234
+ }
1235
+ else
1236
+ {
1237
+ // updates current stack size (max stack size unchanged)
1238
+ --stackSize;
1239
+ // adds current block successors
1240
+ addSuccessor(stackSize, dflt);
1241
+ for(int i = 0; i < labels.length; ++i)
1242
+ {
1243
+ addSuccessor(stackSize, labels[i]);
1244
+ }
1245
+ }
1246
+ // ends current block
1247
+ noSuccessor();
1248
+ }
1249
+ }
1250
+
1251
+ public void visitMultiANewArrayInsn(final String desc, final int dims){
1252
+ Item i = cw.newClassItem(desc);
1253
+ // Label currentBlock = this.currentBlock;
1254
+ if(currentBlock != null)
1255
+ {
1256
+ if(compute == FRAMES)
1257
+ {
1258
+ currentBlock.frame.execute(Opcodes.MULTIANEWARRAY, dims, cw, i);
1259
+ }
1260
+ else
1261
+ {
1262
+ // updates current stack size (max stack size unchanged because
1263
+ // stack size variation always negative or null)
1264
+ stackSize += 1 - dims;
1265
+ }
1266
+ }
1267
+ // adds the instruction to the bytecode of the method
1268
+ code.put12(Opcodes.MULTIANEWARRAY, i.index).putByte(dims);
1269
+ }
1270
+
1271
+ public void visitTryCatchBlock(
1272
+ final Label start,
1273
+ final Label end,
1274
+ final Label handler,
1275
+ final String type){
1276
+ ++handlerCount;
1277
+ Handler h = new Handler();
1278
+ h.start = start;
1279
+ h.end = end;
1280
+ h.handler = handler;
1281
+ h.desc = type;
1282
+ h.type = type != null ? cw.newClass(type) : 0;
1283
+ if(lastHandler == null)
1284
+ {
1285
+ firstHandler = h;
1286
+ }
1287
+ else
1288
+ {
1289
+ lastHandler.next = h;
1290
+ }
1291
+ lastHandler = h;
1292
+ }
1293
+
1294
+ public void visitLocalVariable(
1295
+ final String name,
1296
+ final String desc,
1297
+ final String signature,
1298
+ final Label start,
1299
+ final Label end,
1300
+ final int index){
1301
+ if(signature != null)
1302
+ {
1303
+ if(localVarType == null)
1304
+ {
1305
+ localVarType = new ByteVector();
1306
+ }
1307
+ ++localVarTypeCount;
1308
+ localVarType.putShort(start.position)
1309
+ .putShort(end.position - start.position)
1310
+ .putShort(cw.newUTF8(name))
1311
+ .putShort(cw.newUTF8(signature))
1312
+ .putShort(index);
1313
+ }
1314
+ if(localVar == null)
1315
+ {
1316
+ localVar = new ByteVector();
1317
+ }
1318
+ ++localVarCount;
1319
+ localVar.putShort(start.position)
1320
+ .putShort(end.position - start.position)
1321
+ .putShort(cw.newUTF8(name))
1322
+ .putShort(cw.newUTF8(desc))
1323
+ .putShort(index);
1324
+ if(compute != NOTHING)
1325
+ {
1326
+ // updates max locals
1327
+ char c = desc.charAt(0);
1328
+ int n = index + (c == 'J' || c == 'D' ? 2 : 1);
1329
+ if(n > maxLocals)
1330
+ {
1331
+ maxLocals = n;
1332
+ }
1333
+ }
1334
+ }
1335
+
1336
+ public void visitLineNumber(final int line, final Label start){
1337
+ if(lineNumber == null)
1338
+ {
1339
+ lineNumber = new ByteVector();
1340
+ }
1341
+ ++lineNumberCount;
1342
+ lineNumber.putShort(start.position);
1343
+ lineNumber.putShort(line);
1344
+ }
1345
+
1346
+ public void visitMaxs(final int maxStack, final int maxLocals){
1347
+ if(compute == FRAMES)
1348
+ {
1349
+ // completes the control flow graph with exception handler blocks
1350
+ Handler handler = firstHandler;
1351
+ while(handler != null)
1352
+ {
1353
+ Label l = handler.start.getFirst();
1354
+ Label h = handler.handler.getFirst();
1355
+ Label e = handler.end.getFirst();
1356
+ // computes the kind of the edges to 'h'
1357
+ String t = handler.desc == null
1358
+ ? "java/lang/Throwable"
1359
+ : handler.desc;
1360
+ int kind = Frame.OBJECT | cw.addType(t);
1361
+ // h is an exception handler
1362
+ h.status |= Label.TARGET;
1363
+ // adds 'h' as a successor of labels between 'start' and 'end'
1364
+ while(l != e)
1365
+ {
1366
+ // creates an edge to 'h'
1367
+ Edge b = new Edge();
1368
+ b.info = kind;
1369
+ b.successor = h;
1370
+ // adds it to the successors of 'l'
1371
+ b.next = l.successors;
1372
+ l.successors = b;
1373
+ // goes to the next label
1374
+ l = l.successor;
1375
+ }
1376
+ handler = handler.next;
1377
+ }
1378
+
1379
+ // creates and visits the first (implicit) frame
1380
+ Frame f = labels.frame;
1381
+ Type[] args = Type.getArgumentTypes(descriptor);
1382
+ f.initInputFrame(cw, access, args, this.maxLocals);
1383
+ visitFrame(f);
1384
+
1385
+ /*
1386
+ * fix point algorithm: mark the first basic block as 'changed'
1387
+ * (i.e. put it in the 'changed' list) and, while there are changed
1388
+ * basic blocks, choose one, mark it as unchanged, and update its
1389
+ * successors (which can be changed in the process).
1390
+ */
1391
+ int max = 0;
1392
+ Label changed = labels;
1393
+ while(changed != null)
1394
+ {
1395
+ // removes a basic block from the list of changed basic blocks
1396
+ Label l = changed;
1397
+ changed = changed.next;
1398
+ l.next = null;
1399
+ f = l.frame;
1400
+ // a reacheable jump target must be stored in the stack map
1401
+ if((l.status & Label.TARGET) != 0)
1402
+ {
1403
+ l.status |= Label.STORE;
1404
+ }
1405
+ // all visited labels are reacheable, by definition
1406
+ l.status |= Label.REACHABLE;
1407
+ // updates the (absolute) maximum stack size
1408
+ int blockMax = f.inputStack.length + l.outputStackMax;
1409
+ if(blockMax > max)
1410
+ {
1411
+ max = blockMax;
1412
+ }
1413
+ // updates the successors of the current basic block
1414
+ Edge e = l.successors;
1415
+ while(e != null)
1416
+ {
1417
+ Label n = e.successor.getFirst();
1418
+ boolean change = f.merge(cw, n.frame, e.info);
1419
+ if(change && n.next == null)
1420
+ {
1421
+ // if n has changed and is not already in the 'changed'
1422
+ // list, adds it to this list
1423
+ n.next = changed;
1424
+ changed = n;
1425
+ }
1426
+ e = e.next;
1427
+ }
1428
+ }
1429
+ this.maxStack = max;
1430
+
1431
+ // visits all the frames that must be stored in the stack map
1432
+ Label l = labels;
1433
+ while(l != null)
1434
+ {
1435
+ f = l.frame;
1436
+ if((l.status & Label.STORE) != 0)
1437
+ {
1438
+ visitFrame(f);
1439
+ }
1440
+ if((l.status & Label.REACHABLE) == 0)
1441
+ {
1442
+ // finds start and end of dead basic block
1443
+ Label k = l.successor;
1444
+ int start = l.position;
1445
+ int end = (k == null ? code.length : k.position) - 1;
1446
+ // if non empty basic block
1447
+ if(end >= start)
1448
+ {
1449
+ // replaces instructions with NOP ... NOP ATHROW
1450
+ for(int i = start; i < end; ++i)
1451
+ {
1452
+ code.data[i] = Opcodes.NOP;
1453
+ }
1454
+ code.data[end] = (byte) Opcodes.ATHROW;
1455
+ // emits a frame for this unreachable block
1456
+ startFrame(start, 0, 1);
1457
+ frame[frameIndex++] = Frame.OBJECT
1458
+ | cw.addType("java/lang/Throwable");
1459
+ endFrame();
1460
+ }
1461
+ }
1462
+ l = l.successor;
1463
+ }
1464
+ }
1465
+ else if(compute == MAXS)
1466
+ {
1467
+ // completes the control flow graph with exception handler blocks
1468
+ Handler handler = firstHandler;
1469
+ while(handler != null)
1470
+ {
1471
+ Label l = handler.start;
1472
+ Label h = handler.handler;
1473
+ Label e = handler.end;
1474
+ // adds 'h' as a successor of labels between 'start' and 'end'
1475
+ while(l != e)
1476
+ {
1477
+ // creates an edge to 'h'
1478
+ Edge b = new Edge();
1479
+ b.info = Edge.EXCEPTION;
1480
+ b.successor = h;
1481
+ // adds it to the successors of 'l'
1482
+ if((l.status & Label.JSR) != 0)
1483
+ {
1484
+ // if l is a JSR block, adds b after the first two edges
1485
+ // to preserve the hypothesis about JSR block successors
1486
+ // order (see {@link #visitJumpInsn})
1487
+ b.next = l.successors.next.next;
1488
+ l.successors.next.next = b;
1489
+ }
1490
+ else
1491
+ {
1492
+ b.next = l.successors;
1493
+ l.successors = b;
1494
+ }
1495
+ // goes to the next label
1496
+ l = l.successor;
1497
+ }
1498
+ handler = handler.next;
1499
+ }
1500
+
1501
+ if(jsr)
1502
+ {
1503
+ // completes the control flow graph with the RET successors
1504
+ /*
1505
+ * first step: finds the subroutines. This step determines, for
1506
+ * each basic block, to which subroutine(s) it belongs, and
1507
+ * stores this set as a bit set in the {@link Label#status}
1508
+ * field. Subroutines are numbered with powers of two, from
1509
+ * 0x1000 to 0x80000000 (so there must be at most 20 subroutines
1510
+ * in a method).
1511
+ */
1512
+ // finds the basic blocks that belong to the "main" subroutine
1513
+ int id = 0x1000;
1514
+ findSubroutine(labels, id);
1515
+ // finds the basic blocks that belong to the real subroutines
1516
+ Label l = labels;
1517
+ while(l != null)
1518
+ {
1519
+ if((l.status & Label.JSR) != 0)
1520
+ {
1521
+ // the subroutine is defined by l's TARGET, not by l
1522
+ Label subroutine = l.successors.next.successor;
1523
+ // if this subroutine does not have an id yet...
1524
+ if((subroutine.status & ~0xFFF) == 0)
1525
+ {
1526
+ // ...assigns it a new id and finds its basic blocks
1527
+ id = id << 1;
1528
+ findSubroutine(subroutine, id);
1529
+ }
1530
+ }
1531
+ l = l.successor;
1532
+ }
1533
+ // second step: finds the successors of RET blocks
1534
+ findSubroutineSuccessors(0x1000, new Label[10], 0);
1535
+ }
1536
+
1537
+ /*
1538
+ * control flow analysis algorithm: while the block stack is not
1539
+ * empty, pop a block from this stack, update the max stack size,
1540
+ * compute the true (non relative) begin stack size of the
1541
+ * successors of this block, and push these successors onto the
1542
+ * stack (unless they have already been pushed onto the stack).
1543
+ * Note: by hypothesis, the {@link Label#inputStackTop} of the
1544
+ * blocks in the block stack are the true (non relative) beginning
1545
+ * stack sizes of these blocks.
1546
+ */
1547
+ int max = 0;
1548
+ Label stack = labels;
1549
+ while(stack != null)
1550
+ {
1551
+ // pops a block from the stack
1552
+ Label l = stack;
1553
+ stack = stack.next;
1554
+ // computes the true (non relative) max stack size of this block
1555
+ int start = l.inputStackTop;
1556
+ int blockMax = start + l.outputStackMax;
1557
+ // updates the global max stack size
1558
+ if(blockMax > max)
1559
+ {
1560
+ max = blockMax;
1561
+ }
1562
+ // analyses the successors of the block
1563
+ Edge b = l.successors;
1564
+ if((l.status & Label.JSR) != 0)
1565
+ {
1566
+ // ignores the first edge of JSR blocks (virtual successor)
1567
+ b = b.next;
1568
+ }
1569
+ while(b != null)
1570
+ {
1571
+ l = b.successor;
1572
+ // if this successor has not already been pushed...
1573
+ if((l.status & Label.PUSHED) == 0)
1574
+ {
1575
+ // computes its true beginning stack size...
1576
+ l.inputStackTop = b.info == Edge.EXCEPTION ? 1 : start
1577
+ + b.info;
1578
+ // ...and pushes it onto the stack
1579
+ l.status |= Label.PUSHED;
1580
+ l.next = stack;
1581
+ stack = l;
1582
+ }
1583
+ b = b.next;
1584
+ }
1585
+ }
1586
+ this.maxStack = max;
1587
+ }
1588
+ else
1589
+ {
1590
+ this.maxStack = maxStack;
1591
+ this.maxLocals = maxLocals;
1592
+ }
1593
+ }
1594
+
1595
+ public void visitEnd(){
1596
+ }
1597
+
1598
+ // ------------------------------------------------------------------------
1599
+ // Utility methods: control flow analysis algorithm
1600
+ // ------------------------------------------------------------------------
1601
+
1602
+ /**
1603
+ * Computes the size of the arguments and of the return value of a method.
1604
+ *
1605
+ * @param desc the descriptor of a method.
1606
+ * @return the size of the arguments of the method (plus one for the
1607
+ * implicit this argument), argSize, and the size of its return
1608
+ * value, retSize, packed into a single int i =
1609
+ * <tt>(argSize << 2) | retSize</tt> (argSize is therefore equal
1610
+ * to <tt>i >> 2</tt>, and retSize to <tt>i & 0x03</tt>).
1611
+ */
1612
+ static int getArgumentsAndReturnSizes(final String desc){
1613
+ int n = 1;
1614
+ int c = 1;
1615
+ while(true)
1616
+ {
1617
+ char car = desc.charAt(c++);
1618
+ if(car == ')')
1619
+ {
1620
+ car = desc.charAt(c);
1621
+ return n << 2
1622
+ | (car == 'V' ? 0 : (car == 'D' || car == 'J' ? 2 : 1));
1623
+ }
1624
+ else if(car == 'L')
1625
+ {
1626
+ while(desc.charAt(c++) != ';')
1627
+ {
1628
+ }
1629
+ n += 1;
1630
+ }
1631
+ else if(car == '[')
1632
+ {
1633
+ while((car = desc.charAt(c)) == '[')
1634
+ {
1635
+ ++c;
1636
+ }
1637
+ if(car == 'D' || car == 'J')
1638
+ {
1639
+ n -= 1;
1640
+ }
1641
+ }
1642
+ else if(car == 'D' || car == 'J')
1643
+ {
1644
+ n += 2;
1645
+ }
1646
+ else
1647
+ {
1648
+ n += 1;
1649
+ }
1650
+ }
1651
+ }
1652
+
1653
+ /**
1654
+ * Adds a successor to the {@link #currentBlock currentBlock} block.
1655
+ *
1656
+ * @param info information about the control flow edge to be added.
1657
+ * @param successor the successor block to be added to the current block.
1658
+ */
1659
+ private void addSuccessor(final int info, final Label successor){
1660
+ // creates and initializes an Edge object...
1661
+ Edge b = new Edge();
1662
+ b.info = info;
1663
+ b.successor = successor;
1664
+ // ...and adds it to the successor list of the currentBlock block
1665
+ b.next = currentBlock.successors;
1666
+ currentBlock.successors = b;
1667
+ }
1668
+
1669
+ /**
1670
+ * Ends the current basic block. This method must be used in the case where
1671
+ * the current basic block does not have any successor.
1672
+ */
1673
+ private void noSuccessor(){
1674
+ if(compute == FRAMES)
1675
+ {
1676
+ Label l = new Label();
1677
+ l.frame = new Frame();
1678
+ l.frame.owner = l;
1679
+ l.resolve(this, code.length, code.data);
1680
+ previousBlock.successor = l;
1681
+ previousBlock = l;
1682
+ }
1683
+ else
1684
+ {
1685
+ currentBlock.outputStackMax = maxStackSize;
1686
+ }
1687
+ currentBlock = null;
1688
+ }
1689
+
1690
+ /**
1691
+ * Finds the basic blocks that belong to a given subroutine, and marks these
1692
+ * blocks as belonging to this subroutine (by using {@link Label#status} as
1693
+ * a bit set (see {@link #visitMaxs}). This recursive method follows the
1694
+ * control flow graph to find all the blocks that are reachable from the
1695
+ * given block WITHOUT following any JSR target.
1696
+ *
1697
+ * @param block a block that belongs to the subroutine
1698
+ * @param id the id of this subroutine
1699
+ */
1700
+ private void findSubroutine(final Label block, final int id){
1701
+ // if 'block' is already marked as belonging to subroutine 'id', returns
1702
+ if((block.status & id) != 0)
1703
+ {
1704
+ return;
1705
+ }
1706
+ // marks 'block' as belonging to subroutine 'id'
1707
+ block.status |= id;
1708
+ // calls this method recursively on each successor, except JSR targets
1709
+ Edge e = block.successors;
1710
+ while(e != null)
1711
+ {
1712
+ // if 'block' is a JSR block, then 'block.successors.next' leads
1713
+ // to the JSR target (see {@link #visitJumpInsn}) and must therefore
1714
+ // not be followed
1715
+ if((block.status & Label.JSR) == 0 || e != block.successors.next)
1716
+ {
1717
+ findSubroutine(e.successor, id);
1718
+ }
1719
+ e = e.next;
1720
+ }
1721
+ }
1722
+
1723
+ /**
1724
+ * Finds the successors of the RET blocks of the specified subroutine, and
1725
+ * of any nested subroutine it calls.
1726
+ *
1727
+ * @param id id of the subroutine whose RET block successors must be found.
1728
+ * @param JSRs the JSR blocks that were followed to reach this subroutine.
1729
+ * @param nJSRs number of JSR blocks in the JSRs array.
1730
+ */
1731
+ private void findSubroutineSuccessors(
1732
+ final int id,
1733
+ final Label[] JSRs,
1734
+ final int nJSRs){
1735
+ // iterates over all the basic blocks...
1736
+ Label l = labels;
1737
+ while(l != null)
1738
+ {
1739
+ // for those that belong to subroutine 'id'...
1740
+ if((l.status & id) != 0)
1741
+ {
1742
+ if((l.status & Label.JSR) != 0)
1743
+ {
1744
+ // finds the subroutine to which 'l' leads by following the
1745
+ // second edge of l.successors (see {@link #visitJumpInsn})
1746
+ int nId = l.successors.next.successor.status & ~0xFFF;
1747
+ if(nId != id)
1748
+ {
1749
+ // calls this method recursively with l pushed onto the
1750
+ // JSRs stack to find the successors of the RET blocks
1751
+ // of this nested subroutine 'nId'
1752
+ JSRs[nJSRs] = l;
1753
+ findSubroutineSuccessors(nId, JSRs, nJSRs + 1);
1754
+ }
1755
+ }
1756
+ else if((l.status & Label.RET) != 0)
1757
+ {
1758
+ /*
1759
+ * finds the JSR block in the JSRs stack that corresponds to
1760
+ * this RET block, and updates the successors of this RET
1761
+ * block accordingly. This corresponding JSR is the one that
1762
+ * leads to the subroutine to which the RET block belongs.
1763
+ * But the RET block can belong to several subroutines (if a
1764
+ * nested subroutine returns to its parent subroutine
1765
+ * implicitely, without a RET). So, in fact, the JSR that
1766
+ * corresponds to this RET is the first block in the JSRs
1767
+ * stack, starting from the bottom of the stack, that leads
1768
+ * to a subroutine to which the RET block belongs.
1769
+ */
1770
+ for(int i = 0; i < nJSRs; ++i)
1771
+ {
1772
+ int JSRstatus = JSRs[i].successors.next.successor.status;
1773
+ if(((JSRstatus & ~0xFFF) & (l.status & ~0xFFF)) != 0)
1774
+ {
1775
+ Edge e = new Edge();
1776
+ e.info = l.inputStackTop;
1777
+ e.successor = JSRs[i].successors.successor;
1778
+ e.next = l.successors;
1779
+ l.successors = e;
1780
+ break;
1781
+ }
1782
+ }
1783
+ }
1784
+ }
1785
+ l = l.successor;
1786
+ }
1787
+ }
1788
+
1789
+ // ------------------------------------------------------------------------
1790
+ // Utility methods: stack map frames
1791
+ // ------------------------------------------------------------------------
1792
+
1793
+ /**
1794
+ * Visits a frame that has been computed from scratch.
1795
+ *
1796
+ * @param f the frame that must be visited.
1797
+ */
1798
+ private void visitFrame(final Frame f){
1799
+ int i, t;
1800
+ int nTop = 0;
1801
+ int nLocal = 0;
1802
+ int nStack = 0;
1803
+ int[] locals = f.inputLocals;
1804
+ int[] stacks = f.inputStack;
1805
+ // computes the number of locals (ignores TOP types that are just after
1806
+ // a LONG or a DOUBLE, and all trailing TOP types)
1807
+ for(i = 0; i < locals.length; ++i)
1808
+ {
1809
+ t = locals[i];
1810
+ if(t == Frame.TOP)
1811
+ {
1812
+ ++nTop;
1813
+ }
1814
+ else
1815
+ {
1816
+ nLocal += nTop + 1;
1817
+ nTop = 0;
1818
+ }
1819
+ if(t == Frame.LONG || t == Frame.DOUBLE)
1820
+ {
1821
+ ++i;
1822
+ }
1823
+ }
1824
+ // computes the stack size (ignores TOP types that are just after
1825
+ // a LONG or a DOUBLE)
1826
+ for(i = 0; i < stacks.length; ++i)
1827
+ {
1828
+ t = stacks[i];
1829
+ ++nStack;
1830
+ if(t == Frame.LONG || t == Frame.DOUBLE)
1831
+ {
1832
+ ++i;
1833
+ }
1834
+ }
1835
+ // visits the frame and its content
1836
+ startFrame(f.owner.position, nLocal, nStack);
1837
+ for(i = 0; nLocal > 0; ++i, --nLocal)
1838
+ {
1839
+ t = locals[i];
1840
+ frame[frameIndex++] = t;
1841
+ if(t == Frame.LONG || t == Frame.DOUBLE)
1842
+ {
1843
+ ++i;
1844
+ }
1845
+ }
1846
+ for(i = 0; i < stacks.length; ++i)
1847
+ {
1848
+ t = stacks[i];
1849
+ frame[frameIndex++] = t;
1850
+ if(t == Frame.LONG || t == Frame.DOUBLE)
1851
+ {
1852
+ ++i;
1853
+ }
1854
+ }
1855
+ endFrame();
1856
+ }
1857
+
1858
+ /**
1859
+ * Starts the visit of a stack map frame.
1860
+ *
1861
+ * @param offset the offset of the instruction to which the frame
1862
+ * corresponds.
1863
+ * @param nLocal the number of local variables in the frame.
1864
+ * @param nStack the number of stack elements in the frame.
1865
+ */
1866
+ private void startFrame(final int offset, final int nLocal, final int nStack){
1867
+ int n = 3 + nLocal + nStack;
1868
+ if(frame == null || frame.length < n)
1869
+ {
1870
+ frame = new int[n];
1871
+ }
1872
+ frame[0] = offset;
1873
+ frame[1] = nLocal;
1874
+ frame[2] = nStack;
1875
+ frameIndex = 3;
1876
+ }
1877
+
1878
+ /**
1879
+ * Checks if the visit of the current frame {@link #frame} is finished, and
1880
+ * if yes, write it in the StackMapTable attribute.
1881
+ */
1882
+ private void endFrame(){
1883
+ if(previousFrame != null)
1884
+ { // do not write the first frame
1885
+ if(stackMap == null)
1886
+ {
1887
+ stackMap = new ByteVector();
1888
+ }
1889
+ writeFrame();
1890
+ ++frameCount;
1891
+ }
1892
+ previousFrame = frame;
1893
+ frame = null;
1894
+ }
1895
+
1896
+ /**
1897
+ * Compress and writes the current frame {@link #frame} in the StackMapTable
1898
+ * attribute.
1899
+ */
1900
+ private void writeFrame(){
1901
+ int clocalsSize = frame[1];
1902
+ int cstackSize = frame[2];
1903
+ if((cw.version & 0xFFFF) < Opcodes.V1_6)
1904
+ {
1905
+ stackMap.putShort(frame[0]).putShort(clocalsSize);
1906
+ writeFrameTypes(3, 3 + clocalsSize);
1907
+ stackMap.putShort(cstackSize);
1908
+ writeFrameTypes(3 + clocalsSize, 3 + clocalsSize + cstackSize);
1909
+ return;
1910
+ }
1911
+ int localsSize = previousFrame[1];
1912
+ int type = FULL_FRAME;
1913
+ int k = 0;
1914
+ int delta;
1915
+ if(frameCount == 0)
1916
+ {
1917
+ delta = frame[0];
1918
+ }
1919
+ else
1920
+ {
1921
+ delta = frame[0] - previousFrame[0] - 1;
1922
+ }
1923
+ if(cstackSize == 0)
1924
+ {
1925
+ k = clocalsSize - localsSize;
1926
+ switch(k)
1927
+ {
1928
+ case-3:
1929
+ case-2:
1930
+ case-1:
1931
+ type = CHOP_FRAME;
1932
+ localsSize = clocalsSize;
1933
+ break;
1934
+ case 0:
1935
+ type = delta < 64 ? SAME_FRAME : SAME_FRAME_EXTENDED;
1936
+ break;
1937
+ case 1:
1938
+ case 2:
1939
+ case 3:
1940
+ type = APPEND_FRAME;
1941
+ break;
1942
+ }
1943
+ }
1944
+ else if(clocalsSize == localsSize && cstackSize == 1)
1945
+ {
1946
+ type = delta < 63
1947
+ ? SAME_LOCALS_1_STACK_ITEM_FRAME
1948
+ : SAME_LOCALS_1_STACK_ITEM_FRAME_EXTENDED;
1949
+ }
1950
+ if(type != FULL_FRAME)
1951
+ {
1952
+ // verify if locals are the same
1953
+ int l = 3;
1954
+ for(int j = 0; j < localsSize; j++)
1955
+ {
1956
+ if(frame[l] != previousFrame[l])
1957
+ {
1958
+ type = FULL_FRAME;
1959
+ break;
1960
+ }
1961
+ l++;
1962
+ }
1963
+ }
1964
+ switch(type)
1965
+ {
1966
+ case SAME_FRAME:
1967
+ stackMap.putByte(delta);
1968
+ break;
1969
+ case SAME_LOCALS_1_STACK_ITEM_FRAME:
1970
+ stackMap.putByte(SAME_LOCALS_1_STACK_ITEM_FRAME + delta);
1971
+ writeFrameTypes(3 + clocalsSize, 4 + clocalsSize);
1972
+ break;
1973
+ case SAME_LOCALS_1_STACK_ITEM_FRAME_EXTENDED:
1974
+ stackMap.putByte(SAME_LOCALS_1_STACK_ITEM_FRAME_EXTENDED)
1975
+ .putShort(delta);
1976
+ writeFrameTypes(3 + clocalsSize, 4 + clocalsSize);
1977
+ break;
1978
+ case SAME_FRAME_EXTENDED:
1979
+ stackMap.putByte(SAME_FRAME_EXTENDED).putShort(delta);
1980
+ break;
1981
+ case CHOP_FRAME:
1982
+ stackMap.putByte(SAME_FRAME_EXTENDED + k).putShort(delta);
1983
+ break;
1984
+ case APPEND_FRAME:
1985
+ stackMap.putByte(SAME_FRAME_EXTENDED + k).putShort(delta);
1986
+ writeFrameTypes(3 + localsSize, 3 + clocalsSize);
1987
+ break;
1988
+ // case FULL_FRAME:
1989
+ default:
1990
+ stackMap.putByte(FULL_FRAME)
1991
+ .putShort(delta)
1992
+ .putShort(clocalsSize);
1993
+ writeFrameTypes(3, 3 + clocalsSize);
1994
+ stackMap.putShort(cstackSize);
1995
+ writeFrameTypes(3 + clocalsSize, 3 + clocalsSize + cstackSize);
1996
+ }
1997
+ }
1998
+
1999
+ /**
2000
+ * Writes some types of the current frame {@link #frame} into the
2001
+ * StackMapTableAttribute. This method converts types from the format used
2002
+ * in {@link Label} to the format used in StackMapTable attributes. In
2003
+ * particular, it converts type table indexes to constant pool indexes.
2004
+ *
2005
+ * @param start index of the first type in {@link #frame} to write.
2006
+ * @param end index of last type in {@link #frame} to write (exclusive).
2007
+ */
2008
+ private void writeFrameTypes(final int start, final int end){
2009
+ for(int i = start; i < end; ++i)
2010
+ {
2011
+ int t = frame[i];
2012
+ int d = t & Frame.DIM;
2013
+ if(d == 0)
2014
+ {
2015
+ int v = t & Frame.BASE_VALUE;
2016
+ switch(t & Frame.BASE_KIND)
2017
+ {
2018
+ case Frame.OBJECT:
2019
+ stackMap.putByte(7)
2020
+ .putShort(cw.newClass(cw.typeTable[v].strVal1));
2021
+ break;
2022
+ case Frame.UNINITIALIZED:
2023
+ stackMap.putByte(8).putShort(cw.typeTable[v].intVal);
2024
+ break;
2025
+ default:
2026
+ stackMap.putByte(v);
2027
+ }
2028
+ }
2029
+ else
2030
+ {
2031
+ StringBuffer buf = new StringBuffer();
2032
+ d >>= 28;
2033
+ while(d-- > 0)
2034
+ {
2035
+ buf.append('[');
2036
+ }
2037
+ if((t & Frame.BASE_KIND) == Frame.OBJECT)
2038
+ {
2039
+ buf.append('L');
2040
+ buf.append(cw.typeTable[t & Frame.BASE_VALUE].strVal1);
2041
+ buf.append(';');
2042
+ }
2043
+ else
2044
+ {
2045
+ switch(t & 0xF)
2046
+ {
2047
+ case 1:
2048
+ buf.append('I');
2049
+ break;
2050
+ case 2:
2051
+ buf.append('F');
2052
+ break;
2053
+ case 3:
2054
+ buf.append('D');
2055
+ break;
2056
+ case 9:
2057
+ buf.append('Z');
2058
+ break;
2059
+ case 10:
2060
+ buf.append('B');
2061
+ break;
2062
+ case 11:
2063
+ buf.append('C');
2064
+ break;
2065
+ case 12:
2066
+ buf.append('S');
2067
+ break;
2068
+ default:
2069
+ buf.append('J');
2070
+ }
2071
+ }
2072
+ stackMap.putByte(7).putShort(cw.newClass(buf.toString()));
2073
+ }
2074
+ }
2075
+ }
2076
+
2077
+ private void writeFrameType(final Object type){
2078
+ if(type instanceof String)
2079
+ {
2080
+ stackMap.putByte(7).putShort(cw.newClass((String) type));
2081
+ }
2082
+ else if(type instanceof Integer)
2083
+ {
2084
+ stackMap.putByte(((Integer) type).intValue());
2085
+ }
2086
+ else
2087
+ {
2088
+ stackMap.putByte(8).putShort(((Label) type).position);
2089
+ }
2090
+ }
2091
+
2092
+ // ------------------------------------------------------------------------
2093
+ // Utility methods: dump bytecode array
2094
+ // ------------------------------------------------------------------------
2095
+
2096
+ /**
2097
+ * Returns the size of the bytecode of this method.
2098
+ *
2099
+ * @return the size of the bytecode of this method.
2100
+ */
2101
+ final int getSize(){
2102
+ if(classReaderOffset != 0)
2103
+ {
2104
+ return 6 + classReaderLength;
2105
+ }
2106
+ if(resize)
2107
+ {
2108
+ // replaces the temporary jump opcodes introduced by Label.resolve.
2109
+ resizeInstructions();
2110
+ }
2111
+ int size = 8;
2112
+ if(code.length > 0)
2113
+ {
2114
+ cw.newUTF8("Code");
2115
+ size += 18 + code.length + 8 * handlerCount;
2116
+ if(localVar != null)
2117
+ {
2118
+ cw.newUTF8("LocalVariableTable");
2119
+ size += 8 + localVar.length;
2120
+ }
2121
+ if(localVarType != null)
2122
+ {
2123
+ cw.newUTF8("LocalVariableTypeTable");
2124
+ size += 8 + localVarType.length;
2125
+ }
2126
+ if(lineNumber != null)
2127
+ {
2128
+ cw.newUTF8("LineNumberTable");
2129
+ size += 8 + lineNumber.length;
2130
+ }
2131
+ if(stackMap != null)
2132
+ {
2133
+ boolean zip = (cw.version & 0xFFFF) >= Opcodes.V1_6;
2134
+ cw.newUTF8(zip ? "StackMapTable" : "StackMap");
2135
+ size += 8 + stackMap.length;
2136
+ }
2137
+ if(cattrs != null)
2138
+ {
2139
+ size += cattrs.getSize(cw,
2140
+ code.data,
2141
+ code.length,
2142
+ maxStack,
2143
+ maxLocals);
2144
+ }
2145
+ }
2146
+ if(exceptionCount > 0)
2147
+ {
2148
+ cw.newUTF8("Exceptions");
2149
+ size += 8 + 2 * exceptionCount;
2150
+ }
2151
+ if((access & Opcodes.ACC_SYNTHETIC) != 0
2152
+ && (cw.version & 0xffff) < Opcodes.V1_5)
2153
+ {
2154
+ cw.newUTF8("Synthetic");
2155
+ size += 6;
2156
+ }
2157
+ if((access & Opcodes.ACC_DEPRECATED) != 0)
2158
+ {
2159
+ cw.newUTF8("Deprecated");
2160
+ size += 6;
2161
+ }
2162
+ if(signature != null)
2163
+ {
2164
+ cw.newUTF8("Signature");
2165
+ cw.newUTF8(signature);
2166
+ size += 8;
2167
+ }
2168
+ if(annd != null)
2169
+ {
2170
+ cw.newUTF8("AnnotationDefault");
2171
+ size += 6 + annd.length;
2172
+ }
2173
+ if(anns != null)
2174
+ {
2175
+ cw.newUTF8("RuntimeVisibleAnnotations");
2176
+ size += 8 + anns.getSize();
2177
+ }
2178
+ if(ianns != null)
2179
+ {
2180
+ cw.newUTF8("RuntimeInvisibleAnnotations");
2181
+ size += 8 + ianns.getSize();
2182
+ }
2183
+ if(panns != null)
2184
+ {
2185
+ cw.newUTF8("RuntimeVisibleParameterAnnotations");
2186
+ size += 7 + 2 * panns.length;
2187
+ for(int i = panns.length - 1; i >= 0; --i)
2188
+ {
2189
+ size += panns[i] == null ? 0 : panns[i].getSize();
2190
+ }
2191
+ }
2192
+ if(ipanns != null)
2193
+ {
2194
+ cw.newUTF8("RuntimeInvisibleParameterAnnotations");
2195
+ size += 7 + 2 * ipanns.length;
2196
+ for(int i = ipanns.length - 1; i >= 0; --i)
2197
+ {
2198
+ size += ipanns[i] == null ? 0 : ipanns[i].getSize();
2199
+ }
2200
+ }
2201
+ if(attrs != null)
2202
+ {
2203
+ size += attrs.getSize(cw, null, 0, -1, -1);
2204
+ }
2205
+ return size;
2206
+ }
2207
+
2208
+ /**
2209
+ * Puts the bytecode of this method in the given byte vector.
2210
+ *
2211
+ * @param out the byte vector into which the bytecode of this method must be
2212
+ * copied.
2213
+ */
2214
+ final void put(final ByteVector out){
2215
+ out.putShort(access).putShort(name).putShort(desc);
2216
+ if(classReaderOffset != 0)
2217
+ {
2218
+ out.putByteArray(cw.cr.b, classReaderOffset, classReaderLength);
2219
+ return;
2220
+ }
2221
+ int attributeCount = 0;
2222
+ if(code.length > 0)
2223
+ {
2224
+ ++attributeCount;
2225
+ }
2226
+ if(exceptionCount > 0)
2227
+ {
2228
+ ++attributeCount;
2229
+ }
2230
+ if((access & Opcodes.ACC_SYNTHETIC) != 0
2231
+ && (cw.version & 0xffff) < Opcodes.V1_5)
2232
+ {
2233
+ ++attributeCount;
2234
+ }
2235
+ if((access & Opcodes.ACC_DEPRECATED) != 0)
2236
+ {
2237
+ ++attributeCount;
2238
+ }
2239
+ if(signature != null)
2240
+ {
2241
+ ++attributeCount;
2242
+ }
2243
+ if(annd != null)
2244
+ {
2245
+ ++attributeCount;
2246
+ }
2247
+ if(anns != null)
2248
+ {
2249
+ ++attributeCount;
2250
+ }
2251
+ if(ianns != null)
2252
+ {
2253
+ ++attributeCount;
2254
+ }
2255
+ if(panns != null)
2256
+ {
2257
+ ++attributeCount;
2258
+ }
2259
+ if(ipanns != null)
2260
+ {
2261
+ ++attributeCount;
2262
+ }
2263
+ if(attrs != null)
2264
+ {
2265
+ attributeCount += attrs.getCount();
2266
+ }
2267
+ out.putShort(attributeCount);
2268
+ if(code.length > 0)
2269
+ {
2270
+ int size = 12 + code.length + 8 * handlerCount;
2271
+ if(localVar != null)
2272
+ {
2273
+ size += 8 + localVar.length;
2274
+ }
2275
+ if(localVarType != null)
2276
+ {
2277
+ size += 8 + localVarType.length;
2278
+ }
2279
+ if(lineNumber != null)
2280
+ {
2281
+ size += 8 + lineNumber.length;
2282
+ }
2283
+ if(stackMap != null)
2284
+ {
2285
+ size += 8 + stackMap.length;
2286
+ }
2287
+ if(cattrs != null)
2288
+ {
2289
+ size += cattrs.getSize(cw,
2290
+ code.data,
2291
+ code.length,
2292
+ maxStack,
2293
+ maxLocals);
2294
+ }
2295
+ out.putShort(cw.newUTF8("Code")).putInt(size);
2296
+ out.putShort(maxStack).putShort(maxLocals);
2297
+ out.putInt(code.length).putByteArray(code.data, 0, code.length);
2298
+ out.putShort(handlerCount);
2299
+ if(handlerCount > 0)
2300
+ {
2301
+ Handler h = firstHandler;
2302
+ while(h != null)
2303
+ {
2304
+ out.putShort(h.start.position)
2305
+ .putShort(h.end.position)
2306
+ .putShort(h.handler.position)
2307
+ .putShort(h.type);
2308
+ h = h.next;
2309
+ }
2310
+ }
2311
+ attributeCount = 0;
2312
+ if(localVar != null)
2313
+ {
2314
+ ++attributeCount;
2315
+ }
2316
+ if(localVarType != null)
2317
+ {
2318
+ ++attributeCount;
2319
+ }
2320
+ if(lineNumber != null)
2321
+ {
2322
+ ++attributeCount;
2323
+ }
2324
+ if(stackMap != null)
2325
+ {
2326
+ ++attributeCount;
2327
+ }
2328
+ if(cattrs != null)
2329
+ {
2330
+ attributeCount += cattrs.getCount();
2331
+ }
2332
+ out.putShort(attributeCount);
2333
+ if(localVar != null)
2334
+ {
2335
+ out.putShort(cw.newUTF8("LocalVariableTable"));
2336
+ out.putInt(localVar.length + 2).putShort(localVarCount);
2337
+ out.putByteArray(localVar.data, 0, localVar.length);
2338
+ }
2339
+ if(localVarType != null)
2340
+ {
2341
+ out.putShort(cw.newUTF8("LocalVariableTypeTable"));
2342
+ out.putInt(localVarType.length + 2).putShort(localVarTypeCount);
2343
+ out.putByteArray(localVarType.data, 0, localVarType.length);
2344
+ }
2345
+ if(lineNumber != null)
2346
+ {
2347
+ out.putShort(cw.newUTF8("LineNumberTable"));
2348
+ out.putInt(lineNumber.length + 2).putShort(lineNumberCount);
2349
+ out.putByteArray(lineNumber.data, 0, lineNumber.length);
2350
+ }
2351
+ if(stackMap != null)
2352
+ {
2353
+ boolean zip = (cw.version & 0xFFFF) >= Opcodes.V1_6;
2354
+ out.putShort(cw.newUTF8(zip ? "StackMapTable" : "StackMap"));
2355
+ out.putInt(stackMap.length + 2).putShort(frameCount);
2356
+ out.putByteArray(stackMap.data, 0, stackMap.length);
2357
+ }
2358
+ if(cattrs != null)
2359
+ {
2360
+ cattrs.put(cw, code.data, code.length, maxLocals, maxStack, out);
2361
+ }
2362
+ }
2363
+ if(exceptionCount > 0)
2364
+ {
2365
+ out.putShort(cw.newUTF8("Exceptions"))
2366
+ .putInt(2 * exceptionCount + 2);
2367
+ out.putShort(exceptionCount);
2368
+ for(int i = 0; i < exceptionCount; ++i)
2369
+ {
2370
+ out.putShort(exceptions[i]);
2371
+ }
2372
+ }
2373
+ if((access & Opcodes.ACC_SYNTHETIC) != 0
2374
+ && (cw.version & 0xffff) < Opcodes.V1_5)
2375
+ {
2376
+ out.putShort(cw.newUTF8("Synthetic")).putInt(0);
2377
+ }
2378
+ if((access & Opcodes.ACC_DEPRECATED) != 0)
2379
+ {
2380
+ out.putShort(cw.newUTF8("Deprecated")).putInt(0);
2381
+ }
2382
+ if(signature != null)
2383
+ {
2384
+ out.putShort(cw.newUTF8("Signature"))
2385
+ .putInt(2)
2386
+ .putShort(cw.newUTF8(signature));
2387
+ }
2388
+ if(annd != null)
2389
+ {
2390
+ out.putShort(cw.newUTF8("AnnotationDefault"));
2391
+ out.putInt(annd.length);
2392
+ out.putByteArray(annd.data, 0, annd.length);
2393
+ }
2394
+ if(anns != null)
2395
+ {
2396
+ out.putShort(cw.newUTF8("RuntimeVisibleAnnotations"));
2397
+ anns.put(out);
2398
+ }
2399
+ if(ianns != null)
2400
+ {
2401
+ out.putShort(cw.newUTF8("RuntimeInvisibleAnnotations"));
2402
+ ianns.put(out);
2403
+ }
2404
+ if(panns != null)
2405
+ {
2406
+ out.putShort(cw.newUTF8("RuntimeVisibleParameterAnnotations"));
2407
+ AnnotationWriter.put(panns, out);
2408
+ }
2409
+ if(ipanns != null)
2410
+ {
2411
+ out.putShort(cw.newUTF8("RuntimeInvisibleParameterAnnotations"));
2412
+ AnnotationWriter.put(ipanns, out);
2413
+ }
2414
+ if(attrs != null)
2415
+ {
2416
+ attrs.put(cw, null, 0, -1, -1, out);
2417
+ }
2418
+ }
2419
+
2420
+ // ------------------------------------------------------------------------
2421
+ // Utility methods: instruction resizing (used to handle GOTO_W and JSR_W)
2422
+ // ------------------------------------------------------------------------
2423
+
2424
+ /**
2425
+ * Resizes and replaces the temporary instructions inserted by
2426
+ * {@link Label#resolve} for wide forward jumps, while keeping jump offsets
2427
+ * and instruction addresses consistent. This may require to resize other
2428
+ * existing instructions, or even to introduce new instructions: for
2429
+ * example, increasing the size of an instruction by 2 at the middle of a
2430
+ * method can increases the offset of an IFEQ instruction from 32766 to
2431
+ * 32768, in which case IFEQ 32766 must be replaced with IFNEQ 8 GOTO_W
2432
+ * 32765. This, in turn, may require to increase the size of another jump
2433
+ * instruction, and so on... All these operations are handled automatically
2434
+ * by this method. <p> <i>This method must be called after all the method
2435
+ * that is being built has been visited</i>. In particular, the
2436
+ * {@link Label Label} objects used to construct the method are no longer
2437
+ * valid after this method has been called.
2438
+ */
2439
+ private void resizeInstructions(){
2440
+ byte[] b = code.data; // bytecode of the method
2441
+ int u, v, label; // indexes in b
2442
+ int i, j; // loop indexes
2443
+ /*
2444
+ * 1st step: As explained above, resizing an instruction may require to
2445
+ * resize another one, which may require to resize yet another one, and
2446
+ * so on. The first step of the algorithm consists in finding all the
2447
+ * instructions that need to be resized, without modifying the code.
2448
+ * This is done by the following "fix point" algorithm:
2449
+ *
2450
+ * Parse the code to find the jump instructions whose offset will need
2451
+ * more than 2 bytes to be stored (the future offset is computed from
2452
+ * the current offset and from the number of bytes that will be inserted
2453
+ * or removed between the source and target instructions). For each such
2454
+ * instruction, adds an entry in (a copy of) the indexes and sizes
2455
+ * arrays (if this has not already been done in a previous iteration!).
2456
+ *
2457
+ * If at least one entry has been added during the previous step, go
2458
+ * back to the beginning, otherwise stop.
2459
+ *
2460
+ * In fact the real algorithm is complicated by the fact that the size
2461
+ * of TABLESWITCH and LOOKUPSWITCH instructions depends on their
2462
+ * position in the bytecode (because of padding). In order to ensure the
2463
+ * convergence of the algorithm, the number of bytes to be added or
2464
+ * removed from these instructions is over estimated during the previous
2465
+ * loop, and computed exactly only after the loop is finished (this
2466
+ * requires another pass to parse the bytecode of the method).
2467
+ */
2468
+ int[] allIndexes = new int[0]; // copy of indexes
2469
+ int[] allSizes = new int[0]; // copy of sizes
2470
+ boolean[] resize; // instructions to be resized
2471
+ int newOffset; // future offset of a jump instruction
2472
+
2473
+ resize = new boolean[code.length];
2474
+
2475
+ // 3 = loop again, 2 = loop ended, 1 = last pass, 0 = done
2476
+ int state = 3;
2477
+ do
2478
+ {
2479
+ if(state == 3)
2480
+ {
2481
+ state = 2;
2482
+ }
2483
+ u = 0;
2484
+ while(u < b.length)
2485
+ {
2486
+ int opcode = b[u] & 0xFF; // opcode of current instruction
2487
+ int insert = 0; // bytes to be added after this instruction
2488
+
2489
+ switch(ClassWriter.TYPE[opcode])
2490
+ {
2491
+ case ClassWriter.NOARG_INSN:
2492
+ case ClassWriter.IMPLVAR_INSN:
2493
+ u += 1;
2494
+ break;
2495
+ case ClassWriter.LABEL_INSN:
2496
+ if(opcode > 201)
2497
+ {
2498
+ // converts temporary opcodes 202 to 217, 218 and
2499
+ // 219 to IFEQ ... JSR (inclusive), IFNULL and
2500
+ // IFNONNULL
2501
+ opcode = opcode < 218 ? opcode - 49 : opcode - 20;
2502
+ label = u + readUnsignedShort(b, u + 1);
2503
+ }
2504
+ else
2505
+ {
2506
+ label = u + readShort(b, u + 1);
2507
+ }
2508
+ newOffset = getNewOffset(allIndexes, allSizes, u, label);
2509
+ if(newOffset < Short.MIN_VALUE
2510
+ || newOffset > Short.MAX_VALUE)
2511
+ {
2512
+ if(!resize[u])
2513
+ {
2514
+ if(opcode == Opcodes.GOTO
2515
+ || opcode == Opcodes.JSR)
2516
+ {
2517
+ // two additional bytes will be required to
2518
+ // replace this GOTO or JSR instruction with
2519
+ // a GOTO_W or a JSR_W
2520
+ insert = 2;
2521
+ }
2522
+ else
2523
+ {
2524
+ // five additional bytes will be required to
2525
+ // replace this IFxxx <l> instruction with
2526
+ // IFNOTxxx <l'> GOTO_W <l>, where IFNOTxxx
2527
+ // is the "opposite" opcode of IFxxx (i.e.,
2528
+ // IFNE for IFEQ) and where <l'> designates
2529
+ // the instruction just after the GOTO_W.
2530
+ insert = 5;
2531
+ }
2532
+ resize[u] = true;
2533
+ }
2534
+ }
2535
+ u += 3;
2536
+ break;
2537
+ case ClassWriter.LABELW_INSN:
2538
+ u += 5;
2539
+ break;
2540
+ case ClassWriter.TABL_INSN:
2541
+ if(state == 1)
2542
+ {
2543
+ // true number of bytes to be added (or removed)
2544
+ // from this instruction = (future number of padding
2545
+ // bytes - current number of padding byte) -
2546
+ // previously over estimated variation =
2547
+ // = ((3 - newOffset%4) - (3 - u%4)) - u%4
2548
+ // = (-newOffset%4 + u%4) - u%4
2549
+ // = -(newOffset & 3)
2550
+ newOffset = getNewOffset(allIndexes, allSizes, 0, u);
2551
+ insert = -(newOffset & 3);
2552
+ }
2553
+ else if(!resize[u])
2554
+ {
2555
+ // over estimation of the number of bytes to be
2556
+ // added to this instruction = 3 - current number
2557
+ // of padding bytes = 3 - (3 - u%4) = u%4 = u & 3
2558
+ insert = u & 3;
2559
+ resize[u] = true;
2560
+ }
2561
+ // skips instruction
2562
+ u = u + 4 - (u & 3);
2563
+ u += 4 * (readInt(b, u + 8) - readInt(b, u + 4) + 1) + 12;
2564
+ break;
2565
+ case ClassWriter.LOOK_INSN:
2566
+ if(state == 1)
2567
+ {
2568
+ // like TABL_INSN
2569
+ newOffset = getNewOffset(allIndexes, allSizes, 0, u);
2570
+ insert = -(newOffset & 3);
2571
+ }
2572
+ else if(!resize[u])
2573
+ {
2574
+ // like TABL_INSN
2575
+ insert = u & 3;
2576
+ resize[u] = true;
2577
+ }
2578
+ // skips instruction
2579
+ u = u + 4 - (u & 3);
2580
+ u += 8 * readInt(b, u + 4) + 8;
2581
+ break;
2582
+ case ClassWriter.WIDE_INSN:
2583
+ opcode = b[u + 1] & 0xFF;
2584
+ if(opcode == Opcodes.IINC)
2585
+ {
2586
+ u += 6;
2587
+ }
2588
+ else
2589
+ {
2590
+ u += 4;
2591
+ }
2592
+ break;
2593
+ case ClassWriter.VAR_INSN:
2594
+ case ClassWriter.SBYTE_INSN:
2595
+ case ClassWriter.LDC_INSN:
2596
+ u += 2;
2597
+ break;
2598
+ case ClassWriter.SHORT_INSN:
2599
+ case ClassWriter.LDCW_INSN:
2600
+ case ClassWriter.FIELDORMETH_INSN:
2601
+ case ClassWriter.TYPE_INSN:
2602
+ case ClassWriter.IINC_INSN:
2603
+ u += 3;
2604
+ break;
2605
+ case ClassWriter.ITFMETH_INSN:
2606
+ u += 5;
2607
+ break;
2608
+ // case ClassWriter.MANA_INSN:
2609
+ default:
2610
+ u += 4;
2611
+ break;
2612
+ }
2613
+ if(insert != 0)
2614
+ {
2615
+ // adds a new (u, insert) entry in the allIndexes and
2616
+ // allSizes arrays
2617
+ int[] newIndexes = new int[allIndexes.length + 1];
2618
+ int[] newSizes = new int[allSizes.length + 1];
2619
+ System.arraycopy(allIndexes,
2620
+ 0,
2621
+ newIndexes,
2622
+ 0,
2623
+ allIndexes.length);
2624
+ System.arraycopy(allSizes, 0, newSizes, 0, allSizes.length);
2625
+ newIndexes[allIndexes.length] = u;
2626
+ newSizes[allSizes.length] = insert;
2627
+ allIndexes = newIndexes;
2628
+ allSizes = newSizes;
2629
+ if(insert > 0)
2630
+ {
2631
+ state = 3;
2632
+ }
2633
+ }
2634
+ }
2635
+ if(state < 3)
2636
+ {
2637
+ --state;
2638
+ }
2639
+ } while(state != 0);
2640
+
2641
+ // 2nd step:
2642
+ // copies the bytecode of the method into a new bytevector, updates the
2643
+ // offsets, and inserts (or removes) bytes as requested.
2644
+
2645
+ ByteVector newCode = new ByteVector(code.length);
2646
+
2647
+ u = 0;
2648
+ while(u < code.length)
2649
+ {
2650
+ int opcode = b[u] & 0xFF;
2651
+ switch(ClassWriter.TYPE[opcode])
2652
+ {
2653
+ case ClassWriter.NOARG_INSN:
2654
+ case ClassWriter.IMPLVAR_INSN:
2655
+ newCode.putByte(opcode);
2656
+ u += 1;
2657
+ break;
2658
+ case ClassWriter.LABEL_INSN:
2659
+ if(opcode > 201)
2660
+ {
2661
+ // changes temporary opcodes 202 to 217 (inclusive), 218
2662
+ // and 219 to IFEQ ... JSR (inclusive), IFNULL and
2663
+ // IFNONNULL
2664
+ opcode = opcode < 218 ? opcode - 49 : opcode - 20;
2665
+ label = u + readUnsignedShort(b, u + 1);
2666
+ }
2667
+ else
2668
+ {
2669
+ label = u + readShort(b, u + 1);
2670
+ }
2671
+ newOffset = getNewOffset(allIndexes, allSizes, u, label);
2672
+ if(resize[u])
2673
+ {
2674
+ // replaces GOTO with GOTO_W, JSR with JSR_W and IFxxx
2675
+ // <l> with IFNOTxxx <l'> GOTO_W <l>, where IFNOTxxx is
2676
+ // the "opposite" opcode of IFxxx (i.e., IFNE for IFEQ)
2677
+ // and where <l'> designates the instruction just after
2678
+ // the GOTO_W.
2679
+ if(opcode == Opcodes.GOTO)
2680
+ {
2681
+ newCode.putByte(200); // GOTO_W
2682
+ }
2683
+ else if(opcode == Opcodes.JSR)
2684
+ {
2685
+ newCode.putByte(201); // JSR_W
2686
+ }
2687
+ else
2688
+ {
2689
+ newCode.putByte(opcode <= 166
2690
+ ? ((opcode + 1) ^ 1) - 1
2691
+ : opcode ^ 1);
2692
+ newCode.putShort(8); // jump offset
2693
+ newCode.putByte(200); // GOTO_W
2694
+ // newOffset now computed from start of GOTO_W
2695
+ newOffset -= 3;
2696
+ }
2697
+ newCode.putInt(newOffset);
2698
+ }
2699
+ else
2700
+ {
2701
+ newCode.putByte(opcode);
2702
+ newCode.putShort(newOffset);
2703
+ }
2704
+ u += 3;
2705
+ break;
2706
+ case ClassWriter.LABELW_INSN:
2707
+ label = u + readInt(b, u + 1);
2708
+ newOffset = getNewOffset(allIndexes, allSizes, u, label);
2709
+ newCode.putByte(opcode);
2710
+ newCode.putInt(newOffset);
2711
+ u += 5;
2712
+ break;
2713
+ case ClassWriter.TABL_INSN:
2714
+ // skips 0 to 3 padding bytes
2715
+ v = u;
2716
+ u = u + 4 - (v & 3);
2717
+ // reads and copies instruction
2718
+ newCode.putByte(Opcodes.TABLESWITCH);
2719
+ newCode.length += (4 - newCode.length % 4) % 4;
2720
+ label = v + readInt(b, u);
2721
+ u += 4;
2722
+ newOffset = getNewOffset(allIndexes, allSizes, v, label);
2723
+ newCode.putInt(newOffset);
2724
+ j = readInt(b, u);
2725
+ u += 4;
2726
+ newCode.putInt(j);
2727
+ j = readInt(b, u) - j + 1;
2728
+ u += 4;
2729
+ newCode.putInt(readInt(b, u - 4));
2730
+ for(; j > 0; --j)
2731
+ {
2732
+ label = v + readInt(b, u);
2733
+ u += 4;
2734
+ newOffset = getNewOffset(allIndexes, allSizes, v, label);
2735
+ newCode.putInt(newOffset);
2736
+ }
2737
+ break;
2738
+ case ClassWriter.LOOK_INSN:
2739
+ // skips 0 to 3 padding bytes
2740
+ v = u;
2741
+ u = u + 4 - (v & 3);
2742
+ // reads and copies instruction
2743
+ newCode.putByte(Opcodes.LOOKUPSWITCH);
2744
+ newCode.length += (4 - newCode.length % 4) % 4;
2745
+ label = v + readInt(b, u);
2746
+ u += 4;
2747
+ newOffset = getNewOffset(allIndexes, allSizes, v, label);
2748
+ newCode.putInt(newOffset);
2749
+ j = readInt(b, u);
2750
+ u += 4;
2751
+ newCode.putInt(j);
2752
+ for(; j > 0; --j)
2753
+ {
2754
+ newCode.putInt(readInt(b, u));
2755
+ u += 4;
2756
+ label = v + readInt(b, u);
2757
+ u += 4;
2758
+ newOffset = getNewOffset(allIndexes, allSizes, v, label);
2759
+ newCode.putInt(newOffset);
2760
+ }
2761
+ break;
2762
+ case ClassWriter.WIDE_INSN:
2763
+ opcode = b[u + 1] & 0xFF;
2764
+ if(opcode == Opcodes.IINC)
2765
+ {
2766
+ newCode.putByteArray(b, u, 6);
2767
+ u += 6;
2768
+ }
2769
+ else
2770
+ {
2771
+ newCode.putByteArray(b, u, 4);
2772
+ u += 4;
2773
+ }
2774
+ break;
2775
+ case ClassWriter.VAR_INSN:
2776
+ case ClassWriter.SBYTE_INSN:
2777
+ case ClassWriter.LDC_INSN:
2778
+ newCode.putByteArray(b, u, 2);
2779
+ u += 2;
2780
+ break;
2781
+ case ClassWriter.SHORT_INSN:
2782
+ case ClassWriter.LDCW_INSN:
2783
+ case ClassWriter.FIELDORMETH_INSN:
2784
+ case ClassWriter.TYPE_INSN:
2785
+ case ClassWriter.IINC_INSN:
2786
+ newCode.putByteArray(b, u, 3);
2787
+ u += 3;
2788
+ break;
2789
+ case ClassWriter.ITFMETH_INSN:
2790
+ newCode.putByteArray(b, u, 5);
2791
+ u += 5;
2792
+ break;
2793
+ // case MANA_INSN:
2794
+ default:
2795
+ newCode.putByteArray(b, u, 4);
2796
+ u += 4;
2797
+ break;
2798
+ }
2799
+ }
2800
+
2801
+ // recomputes the stack map frames
2802
+ if(frameCount > 0)
2803
+ {
2804
+ if(compute == FRAMES)
2805
+ {
2806
+ frameCount = 0;
2807
+ stackMap = null;
2808
+ previousFrame = null;
2809
+ frame = null;
2810
+ Frame f = new Frame();
2811
+ f.owner = labels;
2812
+ Type[] args = Type.getArgumentTypes(descriptor);
2813
+ f.initInputFrame(cw, access, args, maxLocals);
2814
+ visitFrame(f);
2815
+ Label l = labels;
2816
+ while(l != null)
2817
+ {
2818
+ /*
2819
+ * here we need the original label position. getNewOffset
2820
+ * must therefore never have been called for this label.
2821
+ */
2822
+ u = l.position - 3;
2823
+ if((l.status & Label.STORE) != 0 || (u >= 0 && resize[u]))
2824
+ {
2825
+ getNewOffset(allIndexes, allSizes, l);
2826
+ // TODO update offsets in UNINITIALIZED values
2827
+ visitFrame(l.frame);
2828
+ }
2829
+ l = l.successor;
2830
+ }
2831
+ }
2832
+ else
2833
+ {
2834
+ /*
2835
+ * Resizing an existing stack map frame table is really hard.
2836
+ * Not only the table must be parsed to update the offets, but
2837
+ * new frames may be needed for jump instructions that were
2838
+ * inserted by this method. And updating the offsets or
2839
+ * inserting frames can change the format of the following
2840
+ * frames, in case of packed frames. In practice the whole table
2841
+ * must be recomputed. For this the frames are marked as
2842
+ * potentially invalid. This will cause the whole class to be
2843
+ * reread and rewritten with the COMPUTE_FRAMES option (see the
2844
+ * ClassWriter.toByteArray method). This is not very efficient
2845
+ * but is much easier and requires much less code than any other
2846
+ * method I can think of.
2847
+ */
2848
+ cw.invalidFrames = true;
2849
+ }
2850
+ }
2851
+ // updates the exception handler block labels
2852
+ Handler h = firstHandler;
2853
+ while(h != null)
2854
+ {
2855
+ getNewOffset(allIndexes, allSizes, h.start);
2856
+ getNewOffset(allIndexes, allSizes, h.end);
2857
+ getNewOffset(allIndexes, allSizes, h.handler);
2858
+ h = h.next;
2859
+ }
2860
+ // updates the instructions addresses in the
2861
+ // local var and line number tables
2862
+ for(i = 0; i < 2; ++i)
2863
+ {
2864
+ ByteVector bv = i == 0 ? localVar : localVarType;
2865
+ if(bv != null)
2866
+ {
2867
+ b = bv.data;
2868
+ u = 0;
2869
+ while(u < bv.length)
2870
+ {
2871
+ label = readUnsignedShort(b, u);
2872
+ newOffset = getNewOffset(allIndexes, allSizes, 0, label);
2873
+ writeShort(b, u, newOffset);
2874
+ label += readUnsignedShort(b, u + 2);
2875
+ newOffset = getNewOffset(allIndexes, allSizes, 0, label)
2876
+ - newOffset;
2877
+ writeShort(b, u + 2, newOffset);
2878
+ u += 10;
2879
+ }
2880
+ }
2881
+ }
2882
+ if(lineNumber != null)
2883
+ {
2884
+ b = lineNumber.data;
2885
+ u = 0;
2886
+ while(u < lineNumber.length)
2887
+ {
2888
+ writeShort(b, u, getNewOffset(allIndexes,
2889
+ allSizes,
2890
+ 0,
2891
+ readUnsignedShort(b, u)));
2892
+ u += 4;
2893
+ }
2894
+ }
2895
+ // updates the labels of the other attributes
2896
+ Attribute attr = cattrs;
2897
+ while(attr != null)
2898
+ {
2899
+ Label[] labels = attr.getLabels();
2900
+ if(labels != null)
2901
+ {
2902
+ for(i = labels.length - 1; i >= 0; --i)
2903
+ {
2904
+ getNewOffset(allIndexes, allSizes, labels[i]);
2905
+ }
2906
+ }
2907
+ attr = attr.next;
2908
+ }
2909
+
2910
+ // replaces old bytecodes with new ones
2911
+ code = newCode;
2912
+ }
2913
+
2914
+ /**
2915
+ * Reads an unsigned short value in the given byte array.
2916
+ *
2917
+ * @param b a byte array.
2918
+ * @param index the start index of the value to be read.
2919
+ * @return the read value.
2920
+ */
2921
+ static int readUnsignedShort(final byte[] b, final int index){
2922
+ return ((b[index] & 0xFF) << 8) | (b[index + 1] & 0xFF);
2923
+ }
2924
+
2925
+ /**
2926
+ * Reads a signed short value in the given byte array.
2927
+ *
2928
+ * @param b a byte array.
2929
+ * @param index the start index of the value to be read.
2930
+ * @return the read value.
2931
+ */
2932
+ static short readShort(final byte[] b, final int index){
2933
+ return (short) (((b[index] & 0xFF) << 8) | (b[index + 1] & 0xFF));
2934
+ }
2935
+
2936
+ /**
2937
+ * Reads a signed int value in the given byte array.
2938
+ *
2939
+ * @param b a byte array.
2940
+ * @param index the start index of the value to be read.
2941
+ * @return the read value.
2942
+ */
2943
+ static int readInt(final byte[] b, final int index){
2944
+ return ((b[index] & 0xFF) << 24) | ((b[index + 1] & 0xFF) << 16)
2945
+ | ((b[index + 2] & 0xFF) << 8) | (b[index + 3] & 0xFF);
2946
+ }
2947
+
2948
+ /**
2949
+ * Writes a short value in the given byte array.
2950
+ *
2951
+ * @param b a byte array.
2952
+ * @param index where the first byte of the short value must be written.
2953
+ * @param s the value to be written in the given byte array.
2954
+ */
2955
+ static void writeShort(final byte[] b, final int index, final int s){
2956
+ b[index] = (byte) (s >>> 8);
2957
+ b[index + 1] = (byte) s;
2958
+ }
2959
+
2960
+ /**
2961
+ * Computes the future value of a bytecode offset. <p> Note: it is possible
2962
+ * to have several entries for the same instruction in the <tt>indexes</tt>
2963
+ * and <tt>sizes</tt>: two entries (index=a,size=b) and (index=a,size=b')
2964
+ * are equivalent to a single entry (index=a,size=b+b').
2965
+ *
2966
+ * @param indexes current positions of the instructions to be resized. Each
2967
+ * instruction must be designated by the index of its <i>last</i>
2968
+ * byte, plus one (or, in other words, by the index of the <i>first</i>
2969
+ * byte of the <i>next</i> instruction).
2970
+ * @param sizes the number of bytes to be <i>added</i> to the above
2971
+ * instructions. More precisely, for each i < <tt>len</tt>,
2972
+ * <tt>sizes</tt>[i] bytes will be added at the end of the
2973
+ * instruction designated by <tt>indexes</tt>[i] or, if
2974
+ * <tt>sizes</tt>[i] is negative, the <i>last</i> |<tt>sizes[i]</tt>|
2975
+ * bytes of the instruction will be removed (the instruction size
2976
+ * <i>must not</i> become negative or null).
2977
+ * @param begin index of the first byte of the source instruction.
2978
+ * @param end index of the first byte of the target instruction.
2979
+ * @return the future value of the given bytecode offset.
2980
+ */
2981
+ static int getNewOffset(
2982
+ final int[] indexes,
2983
+ final int[] sizes,
2984
+ final int begin,
2985
+ final int end){
2986
+ int offset = end - begin;
2987
+ for(int i = 0; i < indexes.length; ++i)
2988
+ {
2989
+ if(begin < indexes[i] && indexes[i] <= end)
2990
+ {
2991
+ // forward jump
2992
+ offset += sizes[i];
2993
+ }
2994
+ else if(end < indexes[i] && indexes[i] <= begin)
2995
+ {
2996
+ // backward jump
2997
+ offset -= sizes[i];
2998
+ }
2999
+ }
3000
+ return offset;
3001
+ }
3002
+
3003
+ /**
3004
+ * Updates the offset of the given label.
3005
+ *
3006
+ * @param indexes current positions of the instructions to be resized. Each
3007
+ * instruction must be designated by the index of its <i>last</i>
3008
+ * byte, plus one (or, in other words, by the index of the <i>first</i>
3009
+ * byte of the <i>next</i> instruction).
3010
+ * @param sizes the number of bytes to be <i>added</i> to the above
3011
+ * instructions. More precisely, for each i < <tt>len</tt>,
3012
+ * <tt>sizes</tt>[i] bytes will be added at the end of the
3013
+ * instruction designated by <tt>indexes</tt>[i] or, if
3014
+ * <tt>sizes</tt>[i] is negative, the <i>last</i> |<tt>sizes[i]</tt>|
3015
+ * bytes of the instruction will be removed (the instruction size
3016
+ * <i>must not</i> become negative or null).
3017
+ * @param label the label whose offset must be updated.
3018
+ */
3019
+ static void getNewOffset(
3020
+ final int[] indexes,
3021
+ final int[] sizes,
3022
+ final Label label){
3023
+ if((label.status & Label.RESIZED) == 0)
3024
+ {
3025
+ label.position = getNewOffset(indexes, sizes, 0, label.position);
3026
+ label.status |= Label.RESIZED;
3027
+ }
3028
+ }
3029
+ }