clojure 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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
+ }