libv8-sgonyea 3.3.10

Sign up to get free protection for your applications and to get access to all the features.
Files changed (500) hide show
  1. data/.gitignore +8 -0
  2. data/.gitmodules +3 -0
  3. data/Gemfile +4 -0
  4. data/README.md +76 -0
  5. data/Rakefile +113 -0
  6. data/ext/libv8/extconf.rb +28 -0
  7. data/lib/libv8.rb +15 -0
  8. data/lib/libv8/Makefile +30 -0
  9. data/lib/libv8/detect_cpu.rb +27 -0
  10. data/lib/libv8/fpic-on-linux-amd64.patch +13 -0
  11. data/lib/libv8/v8/.gitignore +35 -0
  12. data/lib/libv8/v8/AUTHORS +44 -0
  13. data/lib/libv8/v8/ChangeLog +2839 -0
  14. data/lib/libv8/v8/LICENSE +52 -0
  15. data/lib/libv8/v8/LICENSE.strongtalk +29 -0
  16. data/lib/libv8/v8/LICENSE.v8 +26 -0
  17. data/lib/libv8/v8/LICENSE.valgrind +45 -0
  18. data/lib/libv8/v8/SConstruct +1478 -0
  19. data/lib/libv8/v8/build/README.txt +49 -0
  20. data/lib/libv8/v8/build/all.gyp +18 -0
  21. data/lib/libv8/v8/build/armu.gypi +32 -0
  22. data/lib/libv8/v8/build/common.gypi +144 -0
  23. data/lib/libv8/v8/build/gyp_v8 +145 -0
  24. data/lib/libv8/v8/include/v8-debug.h +395 -0
  25. data/lib/libv8/v8/include/v8-preparser.h +117 -0
  26. data/lib/libv8/v8/include/v8-profiler.h +505 -0
  27. data/lib/libv8/v8/include/v8-testing.h +104 -0
  28. data/lib/libv8/v8/include/v8.h +4124 -0
  29. data/lib/libv8/v8/include/v8stdint.h +53 -0
  30. data/lib/libv8/v8/preparser/SConscript +38 -0
  31. data/lib/libv8/v8/preparser/preparser-process.cc +379 -0
  32. data/lib/libv8/v8/src/SConscript +368 -0
  33. data/lib/libv8/v8/src/accessors.cc +767 -0
  34. data/lib/libv8/v8/src/accessors.h +123 -0
  35. data/lib/libv8/v8/src/allocation-inl.h +49 -0
  36. data/lib/libv8/v8/src/allocation.cc +122 -0
  37. data/lib/libv8/v8/src/allocation.h +143 -0
  38. data/lib/libv8/v8/src/api.cc +5845 -0
  39. data/lib/libv8/v8/src/api.h +574 -0
  40. data/lib/libv8/v8/src/apinatives.js +110 -0
  41. data/lib/libv8/v8/src/apiutils.h +73 -0
  42. data/lib/libv8/v8/src/arguments.h +118 -0
  43. data/lib/libv8/v8/src/arm/assembler-arm-inl.h +353 -0
  44. data/lib/libv8/v8/src/arm/assembler-arm.cc +2661 -0
  45. data/lib/libv8/v8/src/arm/assembler-arm.h +1375 -0
  46. data/lib/libv8/v8/src/arm/builtins-arm.cc +1658 -0
  47. data/lib/libv8/v8/src/arm/code-stubs-arm.cc +6398 -0
  48. data/lib/libv8/v8/src/arm/code-stubs-arm.h +673 -0
  49. data/lib/libv8/v8/src/arm/codegen-arm.cc +52 -0
  50. data/lib/libv8/v8/src/arm/codegen-arm.h +91 -0
  51. data/lib/libv8/v8/src/arm/constants-arm.cc +152 -0
  52. data/lib/libv8/v8/src/arm/constants-arm.h +775 -0
  53. data/lib/libv8/v8/src/arm/cpu-arm.cc +120 -0
  54. data/lib/libv8/v8/src/arm/debug-arm.cc +317 -0
  55. data/lib/libv8/v8/src/arm/deoptimizer-arm.cc +754 -0
  56. data/lib/libv8/v8/src/arm/disasm-arm.cc +1506 -0
  57. data/lib/libv8/v8/src/arm/frames-arm.cc +45 -0
  58. data/lib/libv8/v8/src/arm/frames-arm.h +168 -0
  59. data/lib/libv8/v8/src/arm/full-codegen-arm.cc +4375 -0
  60. data/lib/libv8/v8/src/arm/ic-arm.cc +1562 -0
  61. data/lib/libv8/v8/src/arm/lithium-arm.cc +2206 -0
  62. data/lib/libv8/v8/src/arm/lithium-arm.h +2348 -0
  63. data/lib/libv8/v8/src/arm/lithium-codegen-arm.cc +4526 -0
  64. data/lib/libv8/v8/src/arm/lithium-codegen-arm.h +403 -0
  65. data/lib/libv8/v8/src/arm/lithium-gap-resolver-arm.cc +305 -0
  66. data/lib/libv8/v8/src/arm/lithium-gap-resolver-arm.h +84 -0
  67. data/lib/libv8/v8/src/arm/macro-assembler-arm.cc +3163 -0
  68. data/lib/libv8/v8/src/arm/macro-assembler-arm.h +1126 -0
  69. data/lib/libv8/v8/src/arm/regexp-macro-assembler-arm.cc +1287 -0
  70. data/lib/libv8/v8/src/arm/regexp-macro-assembler-arm.h +253 -0
  71. data/lib/libv8/v8/src/arm/simulator-arm.cc +3424 -0
  72. data/lib/libv8/v8/src/arm/simulator-arm.h +431 -0
  73. data/lib/libv8/v8/src/arm/stub-cache-arm.cc +4243 -0
  74. data/lib/libv8/v8/src/array.js +1366 -0
  75. data/lib/libv8/v8/src/assembler.cc +1207 -0
  76. data/lib/libv8/v8/src/assembler.h +858 -0
  77. data/lib/libv8/v8/src/ast-inl.h +112 -0
  78. data/lib/libv8/v8/src/ast.cc +1146 -0
  79. data/lib/libv8/v8/src/ast.h +2188 -0
  80. data/lib/libv8/v8/src/atomicops.h +167 -0
  81. data/lib/libv8/v8/src/atomicops_internals_arm_gcc.h +145 -0
  82. data/lib/libv8/v8/src/atomicops_internals_mips_gcc.h +169 -0
  83. data/lib/libv8/v8/src/atomicops_internals_x86_gcc.cc +133 -0
  84. data/lib/libv8/v8/src/atomicops_internals_x86_gcc.h +287 -0
  85. data/lib/libv8/v8/src/atomicops_internals_x86_macosx.h +301 -0
  86. data/lib/libv8/v8/src/atomicops_internals_x86_msvc.h +203 -0
  87. data/lib/libv8/v8/src/bignum-dtoa.cc +655 -0
  88. data/lib/libv8/v8/src/bignum-dtoa.h +81 -0
  89. data/lib/libv8/v8/src/bignum.cc +768 -0
  90. data/lib/libv8/v8/src/bignum.h +140 -0
  91. data/lib/libv8/v8/src/bootstrapper.cc +2184 -0
  92. data/lib/libv8/v8/src/bootstrapper.h +188 -0
  93. data/lib/libv8/v8/src/builtins.cc +1707 -0
  94. data/lib/libv8/v8/src/builtins.h +371 -0
  95. data/lib/libv8/v8/src/bytecodes-irregexp.h +105 -0
  96. data/lib/libv8/v8/src/cached-powers.cc +177 -0
  97. data/lib/libv8/v8/src/cached-powers.h +65 -0
  98. data/lib/libv8/v8/src/char-predicates-inl.h +94 -0
  99. data/lib/libv8/v8/src/char-predicates.h +67 -0
  100. data/lib/libv8/v8/src/checks.cc +110 -0
  101. data/lib/libv8/v8/src/checks.h +296 -0
  102. data/lib/libv8/v8/src/circular-queue-inl.h +53 -0
  103. data/lib/libv8/v8/src/circular-queue.cc +122 -0
  104. data/lib/libv8/v8/src/circular-queue.h +103 -0
  105. data/lib/libv8/v8/src/code-stubs.cc +267 -0
  106. data/lib/libv8/v8/src/code-stubs.h +1011 -0
  107. data/lib/libv8/v8/src/code.h +70 -0
  108. data/lib/libv8/v8/src/codegen.cc +231 -0
  109. data/lib/libv8/v8/src/codegen.h +84 -0
  110. data/lib/libv8/v8/src/compilation-cache.cc +540 -0
  111. data/lib/libv8/v8/src/compilation-cache.h +287 -0
  112. data/lib/libv8/v8/src/compiler.cc +786 -0
  113. data/lib/libv8/v8/src/compiler.h +312 -0
  114. data/lib/libv8/v8/src/contexts.cc +347 -0
  115. data/lib/libv8/v8/src/contexts.h +391 -0
  116. data/lib/libv8/v8/src/conversions-inl.h +106 -0
  117. data/lib/libv8/v8/src/conversions.cc +1131 -0
  118. data/lib/libv8/v8/src/conversions.h +135 -0
  119. data/lib/libv8/v8/src/counters.cc +93 -0
  120. data/lib/libv8/v8/src/counters.h +254 -0
  121. data/lib/libv8/v8/src/cpu-profiler-inl.h +101 -0
  122. data/lib/libv8/v8/src/cpu-profiler.cc +609 -0
  123. data/lib/libv8/v8/src/cpu-profiler.h +302 -0
  124. data/lib/libv8/v8/src/cpu.h +69 -0
  125. data/lib/libv8/v8/src/d8-debug.cc +367 -0
  126. data/lib/libv8/v8/src/d8-debug.h +158 -0
  127. data/lib/libv8/v8/src/d8-posix.cc +695 -0
  128. data/lib/libv8/v8/src/d8-readline.cc +130 -0
  129. data/lib/libv8/v8/src/d8-windows.cc +42 -0
  130. data/lib/libv8/v8/src/d8.cc +803 -0
  131. data/lib/libv8/v8/src/d8.gyp +91 -0
  132. data/lib/libv8/v8/src/d8.h +235 -0
  133. data/lib/libv8/v8/src/d8.js +2798 -0
  134. data/lib/libv8/v8/src/data-flow.cc +66 -0
  135. data/lib/libv8/v8/src/data-flow.h +205 -0
  136. data/lib/libv8/v8/src/date.js +1103 -0
  137. data/lib/libv8/v8/src/dateparser-inl.h +127 -0
  138. data/lib/libv8/v8/src/dateparser.cc +178 -0
  139. data/lib/libv8/v8/src/dateparser.h +266 -0
  140. data/lib/libv8/v8/src/debug-agent.cc +447 -0
  141. data/lib/libv8/v8/src/debug-agent.h +129 -0
  142. data/lib/libv8/v8/src/debug-debugger.js +2569 -0
  143. data/lib/libv8/v8/src/debug.cc +3165 -0
  144. data/lib/libv8/v8/src/debug.h +1057 -0
  145. data/lib/libv8/v8/src/deoptimizer.cc +1256 -0
  146. data/lib/libv8/v8/src/deoptimizer.h +602 -0
  147. data/lib/libv8/v8/src/disasm.h +80 -0
  148. data/lib/libv8/v8/src/disassembler.cc +343 -0
  149. data/lib/libv8/v8/src/disassembler.h +58 -0
  150. data/lib/libv8/v8/src/diy-fp.cc +58 -0
  151. data/lib/libv8/v8/src/diy-fp.h +117 -0
  152. data/lib/libv8/v8/src/double.h +238 -0
  153. data/lib/libv8/v8/src/dtoa.cc +103 -0
  154. data/lib/libv8/v8/src/dtoa.h +85 -0
  155. data/lib/libv8/v8/src/execution.cc +849 -0
  156. data/lib/libv8/v8/src/execution.h +297 -0
  157. data/lib/libv8/v8/src/extensions/experimental/break-iterator.cc +250 -0
  158. data/lib/libv8/v8/src/extensions/experimental/break-iterator.h +89 -0
  159. data/lib/libv8/v8/src/extensions/experimental/collator.cc +218 -0
  160. data/lib/libv8/v8/src/extensions/experimental/collator.h +69 -0
  161. data/lib/libv8/v8/src/extensions/experimental/experimental.gyp +94 -0
  162. data/lib/libv8/v8/src/extensions/experimental/i18n-extension.cc +78 -0
  163. data/lib/libv8/v8/src/extensions/experimental/i18n-extension.h +54 -0
  164. data/lib/libv8/v8/src/extensions/experimental/i18n-locale.cc +112 -0
  165. data/lib/libv8/v8/src/extensions/experimental/i18n-locale.h +60 -0
  166. data/lib/libv8/v8/src/extensions/experimental/i18n-utils.cc +43 -0
  167. data/lib/libv8/v8/src/extensions/experimental/i18n-utils.h +49 -0
  168. data/lib/libv8/v8/src/extensions/experimental/i18n.js +180 -0
  169. data/lib/libv8/v8/src/extensions/experimental/language-matcher.cc +251 -0
  170. data/lib/libv8/v8/src/extensions/experimental/language-matcher.h +95 -0
  171. data/lib/libv8/v8/src/extensions/externalize-string-extension.cc +141 -0
  172. data/lib/libv8/v8/src/extensions/externalize-string-extension.h +50 -0
  173. data/lib/libv8/v8/src/extensions/gc-extension.cc +58 -0
  174. data/lib/libv8/v8/src/extensions/gc-extension.h +49 -0
  175. data/lib/libv8/v8/src/factory.cc +1222 -0
  176. data/lib/libv8/v8/src/factory.h +442 -0
  177. data/lib/libv8/v8/src/fast-dtoa.cc +736 -0
  178. data/lib/libv8/v8/src/fast-dtoa.h +83 -0
  179. data/lib/libv8/v8/src/fixed-dtoa.cc +405 -0
  180. data/lib/libv8/v8/src/fixed-dtoa.h +55 -0
  181. data/lib/libv8/v8/src/flag-definitions.h +560 -0
  182. data/lib/libv8/v8/src/flags.cc +551 -0
  183. data/lib/libv8/v8/src/flags.h +79 -0
  184. data/lib/libv8/v8/src/frames-inl.h +247 -0
  185. data/lib/libv8/v8/src/frames.cc +1243 -0
  186. data/lib/libv8/v8/src/frames.h +870 -0
  187. data/lib/libv8/v8/src/full-codegen.cc +1374 -0
  188. data/lib/libv8/v8/src/full-codegen.h +771 -0
  189. data/lib/libv8/v8/src/func-name-inferrer.cc +92 -0
  190. data/lib/libv8/v8/src/func-name-inferrer.h +111 -0
  191. data/lib/libv8/v8/src/gdb-jit.cc +1555 -0
  192. data/lib/libv8/v8/src/gdb-jit.h +143 -0
  193. data/lib/libv8/v8/src/global-handles.cc +665 -0
  194. data/lib/libv8/v8/src/global-handles.h +284 -0
  195. data/lib/libv8/v8/src/globals.h +325 -0
  196. data/lib/libv8/v8/src/handles-inl.h +177 -0
  197. data/lib/libv8/v8/src/handles.cc +987 -0
  198. data/lib/libv8/v8/src/handles.h +382 -0
  199. data/lib/libv8/v8/src/hashmap.cc +230 -0
  200. data/lib/libv8/v8/src/hashmap.h +123 -0
  201. data/lib/libv8/v8/src/heap-inl.h +704 -0
  202. data/lib/libv8/v8/src/heap-profiler.cc +1173 -0
  203. data/lib/libv8/v8/src/heap-profiler.h +397 -0
  204. data/lib/libv8/v8/src/heap.cc +5930 -0
  205. data/lib/libv8/v8/src/heap.h +2268 -0
  206. data/lib/libv8/v8/src/hydrogen-instructions.cc +1769 -0
  207. data/lib/libv8/v8/src/hydrogen-instructions.h +3971 -0
  208. data/lib/libv8/v8/src/hydrogen.cc +6239 -0
  209. data/lib/libv8/v8/src/hydrogen.h +1202 -0
  210. data/lib/libv8/v8/src/ia32/assembler-ia32-inl.h +446 -0
  211. data/lib/libv8/v8/src/ia32/assembler-ia32.cc +2487 -0
  212. data/lib/libv8/v8/src/ia32/assembler-ia32.h +1144 -0
  213. data/lib/libv8/v8/src/ia32/builtins-ia32.cc +1621 -0
  214. data/lib/libv8/v8/src/ia32/code-stubs-ia32.cc +6198 -0
  215. data/lib/libv8/v8/src/ia32/code-stubs-ia32.h +517 -0
  216. data/lib/libv8/v8/src/ia32/codegen-ia32.cc +265 -0
  217. data/lib/libv8/v8/src/ia32/codegen-ia32.h +79 -0
  218. data/lib/libv8/v8/src/ia32/cpu-ia32.cc +88 -0
  219. data/lib/libv8/v8/src/ia32/debug-ia32.cc +312 -0
  220. data/lib/libv8/v8/src/ia32/deoptimizer-ia32.cc +774 -0
  221. data/lib/libv8/v8/src/ia32/disasm-ia32.cc +1628 -0
  222. data/lib/libv8/v8/src/ia32/frames-ia32.cc +45 -0
  223. data/lib/libv8/v8/src/ia32/frames-ia32.h +142 -0
  224. data/lib/libv8/v8/src/ia32/full-codegen-ia32.cc +4338 -0
  225. data/lib/libv8/v8/src/ia32/ic-ia32.cc +1597 -0
  226. data/lib/libv8/v8/src/ia32/lithium-codegen-ia32.cc +4461 -0
  227. data/lib/libv8/v8/src/ia32/lithium-codegen-ia32.h +375 -0
  228. data/lib/libv8/v8/src/ia32/lithium-gap-resolver-ia32.cc +475 -0
  229. data/lib/libv8/v8/src/ia32/lithium-gap-resolver-ia32.h +110 -0
  230. data/lib/libv8/v8/src/ia32/lithium-ia32.cc +2261 -0
  231. data/lib/libv8/v8/src/ia32/lithium-ia32.h +2396 -0
  232. data/lib/libv8/v8/src/ia32/macro-assembler-ia32.cc +2136 -0
  233. data/lib/libv8/v8/src/ia32/macro-assembler-ia32.h +775 -0
  234. data/lib/libv8/v8/src/ia32/regexp-macro-assembler-ia32.cc +1263 -0
  235. data/lib/libv8/v8/src/ia32/regexp-macro-assembler-ia32.h +216 -0
  236. data/lib/libv8/v8/src/ia32/simulator-ia32.cc +30 -0
  237. data/lib/libv8/v8/src/ia32/simulator-ia32.h +74 -0
  238. data/lib/libv8/v8/src/ia32/stub-cache-ia32.cc +3847 -0
  239. data/lib/libv8/v8/src/ic-inl.h +130 -0
  240. data/lib/libv8/v8/src/ic.cc +2577 -0
  241. data/lib/libv8/v8/src/ic.h +736 -0
  242. data/lib/libv8/v8/src/inspector.cc +63 -0
  243. data/lib/libv8/v8/src/inspector.h +62 -0
  244. data/lib/libv8/v8/src/interpreter-irregexp.cc +659 -0
  245. data/lib/libv8/v8/src/interpreter-irregexp.h +49 -0
  246. data/lib/libv8/v8/src/isolate-inl.h +50 -0
  247. data/lib/libv8/v8/src/isolate.cc +1869 -0
  248. data/lib/libv8/v8/src/isolate.h +1382 -0
  249. data/lib/libv8/v8/src/json-parser.cc +504 -0
  250. data/lib/libv8/v8/src/json-parser.h +161 -0
  251. data/lib/libv8/v8/src/json.js +342 -0
  252. data/lib/libv8/v8/src/jsregexp.cc +5385 -0
  253. data/lib/libv8/v8/src/jsregexp.h +1492 -0
  254. data/lib/libv8/v8/src/list-inl.h +212 -0
  255. data/lib/libv8/v8/src/list.h +174 -0
  256. data/lib/libv8/v8/src/lithium-allocator-inl.h +142 -0
  257. data/lib/libv8/v8/src/lithium-allocator.cc +2123 -0
  258. data/lib/libv8/v8/src/lithium-allocator.h +630 -0
  259. data/lib/libv8/v8/src/lithium.cc +190 -0
  260. data/lib/libv8/v8/src/lithium.h +597 -0
  261. data/lib/libv8/v8/src/liveedit-debugger.js +1082 -0
  262. data/lib/libv8/v8/src/liveedit.cc +1691 -0
  263. data/lib/libv8/v8/src/liveedit.h +180 -0
  264. data/lib/libv8/v8/src/liveobjectlist-inl.h +126 -0
  265. data/lib/libv8/v8/src/liveobjectlist.cc +2589 -0
  266. data/lib/libv8/v8/src/liveobjectlist.h +322 -0
  267. data/lib/libv8/v8/src/log-inl.h +59 -0
  268. data/lib/libv8/v8/src/log-utils.cc +428 -0
  269. data/lib/libv8/v8/src/log-utils.h +231 -0
  270. data/lib/libv8/v8/src/log.cc +1993 -0
  271. data/lib/libv8/v8/src/log.h +476 -0
  272. data/lib/libv8/v8/src/macro-assembler.h +120 -0
  273. data/lib/libv8/v8/src/macros.py +178 -0
  274. data/lib/libv8/v8/src/mark-compact.cc +3143 -0
  275. data/lib/libv8/v8/src/mark-compact.h +506 -0
  276. data/lib/libv8/v8/src/math.js +264 -0
  277. data/lib/libv8/v8/src/messages.cc +179 -0
  278. data/lib/libv8/v8/src/messages.h +113 -0
  279. data/lib/libv8/v8/src/messages.js +1096 -0
  280. data/lib/libv8/v8/src/mips/assembler-mips-inl.h +312 -0
  281. data/lib/libv8/v8/src/mips/assembler-mips.cc +1960 -0
  282. data/lib/libv8/v8/src/mips/assembler-mips.h +1138 -0
  283. data/lib/libv8/v8/src/mips/builtins-mips.cc +1628 -0
  284. data/lib/libv8/v8/src/mips/code-stubs-mips.cc +6656 -0
  285. data/lib/libv8/v8/src/mips/code-stubs-mips.h +682 -0
  286. data/lib/libv8/v8/src/mips/codegen-mips.cc +52 -0
  287. data/lib/libv8/v8/src/mips/codegen-mips.h +98 -0
  288. data/lib/libv8/v8/src/mips/constants-mips.cc +352 -0
  289. data/lib/libv8/v8/src/mips/constants-mips.h +739 -0
  290. data/lib/libv8/v8/src/mips/cpu-mips.cc +96 -0
  291. data/lib/libv8/v8/src/mips/debug-mips.cc +308 -0
  292. data/lib/libv8/v8/src/mips/deoptimizer-mips.cc +91 -0
  293. data/lib/libv8/v8/src/mips/disasm-mips.cc +1050 -0
  294. data/lib/libv8/v8/src/mips/frames-mips.cc +47 -0
  295. data/lib/libv8/v8/src/mips/frames-mips.h +219 -0
  296. data/lib/libv8/v8/src/mips/full-codegen-mips.cc +4388 -0
  297. data/lib/libv8/v8/src/mips/ic-mips.cc +1580 -0
  298. data/lib/libv8/v8/src/mips/lithium-codegen-mips.h +65 -0
  299. data/lib/libv8/v8/src/mips/lithium-mips.h +307 -0
  300. data/lib/libv8/v8/src/mips/macro-assembler-mips.cc +4056 -0
  301. data/lib/libv8/v8/src/mips/macro-assembler-mips.h +1214 -0
  302. data/lib/libv8/v8/src/mips/regexp-macro-assembler-mips.cc +1251 -0
  303. data/lib/libv8/v8/src/mips/regexp-macro-assembler-mips.h +252 -0
  304. data/lib/libv8/v8/src/mips/simulator-mips.cc +2621 -0
  305. data/lib/libv8/v8/src/mips/simulator-mips.h +401 -0
  306. data/lib/libv8/v8/src/mips/stub-cache-mips.cc +4285 -0
  307. data/lib/libv8/v8/src/mirror-debugger.js +2382 -0
  308. data/lib/libv8/v8/src/mksnapshot.cc +328 -0
  309. data/lib/libv8/v8/src/natives.h +64 -0
  310. data/lib/libv8/v8/src/objects-debug.cc +738 -0
  311. data/lib/libv8/v8/src/objects-inl.h +4323 -0
  312. data/lib/libv8/v8/src/objects-printer.cc +829 -0
  313. data/lib/libv8/v8/src/objects-visiting.cc +148 -0
  314. data/lib/libv8/v8/src/objects-visiting.h +424 -0
  315. data/lib/libv8/v8/src/objects.cc +10585 -0
  316. data/lib/libv8/v8/src/objects.h +6838 -0
  317. data/lib/libv8/v8/src/parser.cc +4997 -0
  318. data/lib/libv8/v8/src/parser.h +765 -0
  319. data/lib/libv8/v8/src/platform-cygwin.cc +779 -0
  320. data/lib/libv8/v8/src/platform-freebsd.cc +826 -0
  321. data/lib/libv8/v8/src/platform-linux.cc +1149 -0
  322. data/lib/libv8/v8/src/platform-macos.cc +830 -0
  323. data/lib/libv8/v8/src/platform-nullos.cc +479 -0
  324. data/lib/libv8/v8/src/platform-openbsd.cc +640 -0
  325. data/lib/libv8/v8/src/platform-posix.cc +424 -0
  326. data/lib/libv8/v8/src/platform-solaris.cc +762 -0
  327. data/lib/libv8/v8/src/platform-tls-mac.h +62 -0
  328. data/lib/libv8/v8/src/platform-tls-win32.h +62 -0
  329. data/lib/libv8/v8/src/platform-tls.h +50 -0
  330. data/lib/libv8/v8/src/platform-win32.cc +2021 -0
  331. data/lib/libv8/v8/src/platform.h +667 -0
  332. data/lib/libv8/v8/src/preparse-data-format.h +62 -0
  333. data/lib/libv8/v8/src/preparse-data.cc +183 -0
  334. data/lib/libv8/v8/src/preparse-data.h +225 -0
  335. data/lib/libv8/v8/src/preparser-api.cc +220 -0
  336. data/lib/libv8/v8/src/preparser.cc +1450 -0
  337. data/lib/libv8/v8/src/preparser.h +493 -0
  338. data/lib/libv8/v8/src/prettyprinter.cc +1493 -0
  339. data/lib/libv8/v8/src/prettyprinter.h +223 -0
  340. data/lib/libv8/v8/src/profile-generator-inl.h +128 -0
  341. data/lib/libv8/v8/src/profile-generator.cc +3098 -0
  342. data/lib/libv8/v8/src/profile-generator.h +1126 -0
  343. data/lib/libv8/v8/src/property.cc +105 -0
  344. data/lib/libv8/v8/src/property.h +365 -0
  345. data/lib/libv8/v8/src/proxy.js +83 -0
  346. data/lib/libv8/v8/src/regexp-macro-assembler-irregexp-inl.h +78 -0
  347. data/lib/libv8/v8/src/regexp-macro-assembler-irregexp.cc +471 -0
  348. data/lib/libv8/v8/src/regexp-macro-assembler-irregexp.h +142 -0
  349. data/lib/libv8/v8/src/regexp-macro-assembler-tracer.cc +373 -0
  350. data/lib/libv8/v8/src/regexp-macro-assembler-tracer.h +104 -0
  351. data/lib/libv8/v8/src/regexp-macro-assembler.cc +267 -0
  352. data/lib/libv8/v8/src/regexp-macro-assembler.h +243 -0
  353. data/lib/libv8/v8/src/regexp-stack.cc +111 -0
  354. data/lib/libv8/v8/src/regexp-stack.h +147 -0
  355. data/lib/libv8/v8/src/regexp.js +483 -0
  356. data/lib/libv8/v8/src/rewriter.cc +360 -0
  357. data/lib/libv8/v8/src/rewriter.h +50 -0
  358. data/lib/libv8/v8/src/runtime-profiler.cc +489 -0
  359. data/lib/libv8/v8/src/runtime-profiler.h +201 -0
  360. data/lib/libv8/v8/src/runtime.cc +12227 -0
  361. data/lib/libv8/v8/src/runtime.h +652 -0
  362. data/lib/libv8/v8/src/runtime.js +649 -0
  363. data/lib/libv8/v8/src/safepoint-table.cc +256 -0
  364. data/lib/libv8/v8/src/safepoint-table.h +270 -0
  365. data/lib/libv8/v8/src/scanner-base.cc +952 -0
  366. data/lib/libv8/v8/src/scanner-base.h +670 -0
  367. data/lib/libv8/v8/src/scanner.cc +345 -0
  368. data/lib/libv8/v8/src/scanner.h +146 -0
  369. data/lib/libv8/v8/src/scopeinfo.cc +646 -0
  370. data/lib/libv8/v8/src/scopeinfo.h +254 -0
  371. data/lib/libv8/v8/src/scopes.cc +1150 -0
  372. data/lib/libv8/v8/src/scopes.h +507 -0
  373. data/lib/libv8/v8/src/serialize.cc +1574 -0
  374. data/lib/libv8/v8/src/serialize.h +589 -0
  375. data/lib/libv8/v8/src/shell.h +55 -0
  376. data/lib/libv8/v8/src/simulator.h +43 -0
  377. data/lib/libv8/v8/src/small-pointer-list.h +163 -0
  378. data/lib/libv8/v8/src/smart-pointer.h +109 -0
  379. data/lib/libv8/v8/src/snapshot-common.cc +83 -0
  380. data/lib/libv8/v8/src/snapshot-empty.cc +54 -0
  381. data/lib/libv8/v8/src/snapshot.h +91 -0
  382. data/lib/libv8/v8/src/spaces-inl.h +529 -0
  383. data/lib/libv8/v8/src/spaces.cc +3145 -0
  384. data/lib/libv8/v8/src/spaces.h +2369 -0
  385. data/lib/libv8/v8/src/splay-tree-inl.h +310 -0
  386. data/lib/libv8/v8/src/splay-tree.h +205 -0
  387. data/lib/libv8/v8/src/string-search.cc +41 -0
  388. data/lib/libv8/v8/src/string-search.h +568 -0
  389. data/lib/libv8/v8/src/string-stream.cc +592 -0
  390. data/lib/libv8/v8/src/string-stream.h +191 -0
  391. data/lib/libv8/v8/src/string.js +994 -0
  392. data/lib/libv8/v8/src/strtod.cc +440 -0
  393. data/lib/libv8/v8/src/strtod.h +40 -0
  394. data/lib/libv8/v8/src/stub-cache.cc +1965 -0
  395. data/lib/libv8/v8/src/stub-cache.h +924 -0
  396. data/lib/libv8/v8/src/third_party/valgrind/valgrind.h +3925 -0
  397. data/lib/libv8/v8/src/token.cc +63 -0
  398. data/lib/libv8/v8/src/token.h +288 -0
  399. data/lib/libv8/v8/src/type-info.cc +507 -0
  400. data/lib/libv8/v8/src/type-info.h +272 -0
  401. data/lib/libv8/v8/src/unbound-queue-inl.h +95 -0
  402. data/lib/libv8/v8/src/unbound-queue.h +69 -0
  403. data/lib/libv8/v8/src/unicode-inl.h +238 -0
  404. data/lib/libv8/v8/src/unicode.cc +1624 -0
  405. data/lib/libv8/v8/src/unicode.h +280 -0
  406. data/lib/libv8/v8/src/uri.js +408 -0
  407. data/lib/libv8/v8/src/utils-inl.h +48 -0
  408. data/lib/libv8/v8/src/utils.cc +371 -0
  409. data/lib/libv8/v8/src/utils.h +800 -0
  410. data/lib/libv8/v8/src/v8-counters.cc +62 -0
  411. data/lib/libv8/v8/src/v8-counters.h +314 -0
  412. data/lib/libv8/v8/src/v8.cc +213 -0
  413. data/lib/libv8/v8/src/v8.h +131 -0
  414. data/lib/libv8/v8/src/v8checks.h +64 -0
  415. data/lib/libv8/v8/src/v8dll-main.cc +44 -0
  416. data/lib/libv8/v8/src/v8globals.h +512 -0
  417. data/lib/libv8/v8/src/v8memory.h +82 -0
  418. data/lib/libv8/v8/src/v8natives.js +1310 -0
  419. data/lib/libv8/v8/src/v8preparserdll-main.cc +39 -0
  420. data/lib/libv8/v8/src/v8threads.cc +464 -0
  421. data/lib/libv8/v8/src/v8threads.h +165 -0
  422. data/lib/libv8/v8/src/v8utils.h +319 -0
  423. data/lib/libv8/v8/src/variables.cc +114 -0
  424. data/lib/libv8/v8/src/variables.h +167 -0
  425. data/lib/libv8/v8/src/version.cc +116 -0
  426. data/lib/libv8/v8/src/version.h +68 -0
  427. data/lib/libv8/v8/src/vm-state-inl.h +138 -0
  428. data/lib/libv8/v8/src/vm-state.h +71 -0
  429. data/lib/libv8/v8/src/win32-headers.h +96 -0
  430. data/lib/libv8/v8/src/x64/assembler-x64-inl.h +462 -0
  431. data/lib/libv8/v8/src/x64/assembler-x64.cc +3027 -0
  432. data/lib/libv8/v8/src/x64/assembler-x64.h +1633 -0
  433. data/lib/libv8/v8/src/x64/builtins-x64.cc +1520 -0
  434. data/lib/libv8/v8/src/x64/code-stubs-x64.cc +5132 -0
  435. data/lib/libv8/v8/src/x64/code-stubs-x64.h +514 -0
  436. data/lib/libv8/v8/src/x64/codegen-x64.cc +146 -0
  437. data/lib/libv8/v8/src/x64/codegen-x64.h +76 -0
  438. data/lib/libv8/v8/src/x64/cpu-x64.cc +88 -0
  439. data/lib/libv8/v8/src/x64/debug-x64.cc +319 -0
  440. data/lib/libv8/v8/src/x64/deoptimizer-x64.cc +815 -0
  441. data/lib/libv8/v8/src/x64/disasm-x64.cc +1832 -0
  442. data/lib/libv8/v8/src/x64/frames-x64.cc +45 -0
  443. data/lib/libv8/v8/src/x64/frames-x64.h +130 -0
  444. data/lib/libv8/v8/src/x64/full-codegen-x64.cc +4318 -0
  445. data/lib/libv8/v8/src/x64/ic-x64.cc +1608 -0
  446. data/lib/libv8/v8/src/x64/lithium-codegen-x64.cc +4267 -0
  447. data/lib/libv8/v8/src/x64/lithium-codegen-x64.h +367 -0
  448. data/lib/libv8/v8/src/x64/lithium-gap-resolver-x64.cc +320 -0
  449. data/lib/libv8/v8/src/x64/lithium-gap-resolver-x64.h +74 -0
  450. data/lib/libv8/v8/src/x64/lithium-x64.cc +2202 -0
  451. data/lib/libv8/v8/src/x64/lithium-x64.h +2333 -0
  452. data/lib/libv8/v8/src/x64/macro-assembler-x64.cc +3745 -0
  453. data/lib/libv8/v8/src/x64/macro-assembler-x64.h +1290 -0
  454. data/lib/libv8/v8/src/x64/regexp-macro-assembler-x64.cc +1398 -0
  455. data/lib/libv8/v8/src/x64/regexp-macro-assembler-x64.h +282 -0
  456. data/lib/libv8/v8/src/x64/simulator-x64.cc +27 -0
  457. data/lib/libv8/v8/src/x64/simulator-x64.h +72 -0
  458. data/lib/libv8/v8/src/x64/stub-cache-x64.cc +3610 -0
  459. data/lib/libv8/v8/src/zone-inl.h +140 -0
  460. data/lib/libv8/v8/src/zone.cc +196 -0
  461. data/lib/libv8/v8/src/zone.h +240 -0
  462. data/lib/libv8/v8/tools/codemap.js +265 -0
  463. data/lib/libv8/v8/tools/consarray.js +93 -0
  464. data/lib/libv8/v8/tools/csvparser.js +78 -0
  465. data/lib/libv8/v8/tools/disasm.py +92 -0
  466. data/lib/libv8/v8/tools/freebsd-tick-processor +10 -0
  467. data/lib/libv8/v8/tools/gc-nvp-trace-processor.py +342 -0
  468. data/lib/libv8/v8/tools/gcmole/README +62 -0
  469. data/lib/libv8/v8/tools/gcmole/gccause.lua +60 -0
  470. data/lib/libv8/v8/tools/gcmole/gcmole.cc +1261 -0
  471. data/lib/libv8/v8/tools/gcmole/gcmole.lua +378 -0
  472. data/lib/libv8/v8/tools/generate-ten-powers.scm +286 -0
  473. data/lib/libv8/v8/tools/grokdump.py +841 -0
  474. data/lib/libv8/v8/tools/gyp/v8.gyp +995 -0
  475. data/lib/libv8/v8/tools/js2c.py +364 -0
  476. data/lib/libv8/v8/tools/jsmin.py +280 -0
  477. data/lib/libv8/v8/tools/linux-tick-processor +35 -0
  478. data/lib/libv8/v8/tools/ll_prof.py +942 -0
  479. data/lib/libv8/v8/tools/logreader.js +185 -0
  480. data/lib/libv8/v8/tools/mac-nm +18 -0
  481. data/lib/libv8/v8/tools/mac-tick-processor +6 -0
  482. data/lib/libv8/v8/tools/oom_dump/README +31 -0
  483. data/lib/libv8/v8/tools/oom_dump/SConstruct +42 -0
  484. data/lib/libv8/v8/tools/oom_dump/oom_dump.cc +288 -0
  485. data/lib/libv8/v8/tools/presubmit.py +305 -0
  486. data/lib/libv8/v8/tools/process-heap-prof.py +120 -0
  487. data/lib/libv8/v8/tools/profile.js +751 -0
  488. data/lib/libv8/v8/tools/profile_view.js +219 -0
  489. data/lib/libv8/v8/tools/run-valgrind.py +77 -0
  490. data/lib/libv8/v8/tools/splaytree.js +316 -0
  491. data/lib/libv8/v8/tools/stats-viewer.py +468 -0
  492. data/lib/libv8/v8/tools/test.py +1510 -0
  493. data/lib/libv8/v8/tools/tickprocessor-driver.js +59 -0
  494. data/lib/libv8/v8/tools/tickprocessor.js +877 -0
  495. data/lib/libv8/v8/tools/utils.py +96 -0
  496. data/lib/libv8/v8/tools/visual_studio/README.txt +12 -0
  497. data/lib/libv8/v8/tools/windows-tick-processor.bat +30 -0
  498. data/lib/libv8/version.rb +5 -0
  499. data/libv8.gemspec +36 -0
  500. metadata +578 -0
@@ -0,0 +1,81 @@
1
+ // Copyright 2010 the V8 project authors. All rights reserved.
2
+ // Redistribution and use in source and binary forms, with or without
3
+ // modification, are permitted provided that the following conditions are
4
+ // met:
5
+ //
6
+ // * Redistributions of source code must retain the above copyright
7
+ // notice, this list of conditions and the following disclaimer.
8
+ // * Redistributions in binary form must reproduce the above
9
+ // copyright notice, this list of conditions and the following
10
+ // disclaimer in the documentation and/or other materials provided
11
+ // with the distribution.
12
+ // * Neither the name of Google Inc. nor the names of its
13
+ // contributors may be used to endorse or promote products derived
14
+ // from this software without specific prior written permission.
15
+ //
16
+ // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17
+ // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18
+ // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19
+ // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20
+ // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21
+ // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22
+ // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23
+ // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24
+ // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25
+ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26
+ // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
+
28
+ #ifndef V8_BIGNUM_DTOA_H_
29
+ #define V8_BIGNUM_DTOA_H_
30
+
31
+ namespace v8 {
32
+ namespace internal {
33
+
34
+ enum BignumDtoaMode {
35
+ // Return the shortest correct representation.
36
+ // For example the output of 0.299999999999999988897 is (the less accurate but
37
+ // correct) 0.3.
38
+ BIGNUM_DTOA_SHORTEST,
39
+ // Return a fixed number of digits after the decimal point.
40
+ // For instance fixed(0.1, 4) becomes 0.1000
41
+ // If the input number is big, the output will be big.
42
+ BIGNUM_DTOA_FIXED,
43
+ // Return a fixed number of digits, no matter what the exponent is.
44
+ BIGNUM_DTOA_PRECISION
45
+ };
46
+
47
+ // Converts the given double 'v' to ascii.
48
+ // The result should be interpreted as buffer * 10^(point-length).
49
+ // The buffer will be null-terminated.
50
+ //
51
+ // The input v must be > 0 and different from NaN, and Infinity.
52
+ //
53
+ // The output depends on the given mode:
54
+ // - SHORTEST: produce the least amount of digits for which the internal
55
+ // identity requirement is still satisfied. If the digits are printed
56
+ // (together with the correct exponent) then reading this number will give
57
+ // 'v' again. The buffer will choose the representation that is closest to
58
+ // 'v'. If there are two at the same distance, than the number is round up.
59
+ // In this mode the 'requested_digits' parameter is ignored.
60
+ // - FIXED: produces digits necessary to print a given number with
61
+ // 'requested_digits' digits after the decimal point. The produced digits
62
+ // might be too short in which case the caller has to fill the gaps with '0's.
63
+ // Example: toFixed(0.001, 5) is allowed to return buffer="1", point=-2.
64
+ // Halfway cases are rounded up. The call toFixed(0.15, 2) thus returns
65
+ // buffer="2", point=0.
66
+ // Note: the length of the returned buffer has no meaning wrt the significance
67
+ // of its digits. That is, just because it contains '0's does not mean that
68
+ // any other digit would not satisfy the internal identity requirement.
69
+ // - PRECISION: produces 'requested_digits' where the first digit is not '0'.
70
+ // Even though the length of produced digits usually equals
71
+ // 'requested_digits', the function is allowed to return fewer digits, in
72
+ // which case the caller has to fill the missing digits with '0's.
73
+ // Halfway cases are again rounded up.
74
+ // 'BignumDtoa' expects the given buffer to be big enough to hold all digits
75
+ // and a terminating null-character.
76
+ void BignumDtoa(double v, BignumDtoaMode mode, int requested_digits,
77
+ Vector<char> buffer, int* length, int* point);
78
+
79
+ } } // namespace v8::internal
80
+
81
+ #endif // V8_BIGNUM_DTOA_H_
@@ -0,0 +1,768 @@
1
+ // Copyright 2010 the V8 project authors. All rights reserved.
2
+ // Redistribution and use in source and binary forms, with or without
3
+ // modification, are permitted provided that the following conditions are
4
+ // met:
5
+ //
6
+ // * Redistributions of source code must retain the above copyright
7
+ // notice, this list of conditions and the following disclaimer.
8
+ // * Redistributions in binary form must reproduce the above
9
+ // copyright notice, this list of conditions and the following
10
+ // disclaimer in the documentation and/or other materials provided
11
+ // with the distribution.
12
+ // * Neither the name of Google Inc. nor the names of its
13
+ // contributors may be used to endorse or promote products derived
14
+ // from this software without specific prior written permission.
15
+ //
16
+ // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17
+ // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18
+ // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19
+ // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20
+ // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21
+ // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22
+ // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23
+ // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24
+ // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25
+ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26
+ // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
+
28
+ #include "v8.h"
29
+
30
+ #include "bignum.h"
31
+ #include "utils.h"
32
+
33
+ namespace v8 {
34
+ namespace internal {
35
+
36
+ Bignum::Bignum()
37
+ : bigits_(bigits_buffer_, kBigitCapacity), used_digits_(0), exponent_(0) {
38
+ for (int i = 0; i < kBigitCapacity; ++i) {
39
+ bigits_[i] = 0;
40
+ }
41
+ }
42
+
43
+
44
+ template<typename S>
45
+ static int BitSize(S value) {
46
+ return 8 * sizeof(value);
47
+ }
48
+
49
+ // Guaranteed to lie in one Bigit.
50
+ void Bignum::AssignUInt16(uint16_t value) {
51
+ ASSERT(kBigitSize >= BitSize(value));
52
+ Zero();
53
+ if (value == 0) return;
54
+
55
+ EnsureCapacity(1);
56
+ bigits_[0] = value;
57
+ used_digits_ = 1;
58
+ }
59
+
60
+
61
+ void Bignum::AssignUInt64(uint64_t value) {
62
+ const int kUInt64Size = 64;
63
+
64
+ Zero();
65
+ if (value == 0) return;
66
+
67
+ int needed_bigits = kUInt64Size / kBigitSize + 1;
68
+ EnsureCapacity(needed_bigits);
69
+ for (int i = 0; i < needed_bigits; ++i) {
70
+ bigits_[i] = static_cast<Chunk>(value & kBigitMask);
71
+ value = value >> kBigitSize;
72
+ }
73
+ used_digits_ = needed_bigits;
74
+ Clamp();
75
+ }
76
+
77
+
78
+ void Bignum::AssignBignum(const Bignum& other) {
79
+ exponent_ = other.exponent_;
80
+ for (int i = 0; i < other.used_digits_; ++i) {
81
+ bigits_[i] = other.bigits_[i];
82
+ }
83
+ // Clear the excess digits (if there were any).
84
+ for (int i = other.used_digits_; i < used_digits_; ++i) {
85
+ bigits_[i] = 0;
86
+ }
87
+ used_digits_ = other.used_digits_;
88
+ }
89
+
90
+
91
+ static uint64_t ReadUInt64(Vector<const char> buffer,
92
+ int from,
93
+ int digits_to_read) {
94
+ uint64_t result = 0;
95
+ for (int i = from; i < from + digits_to_read; ++i) {
96
+ int digit = buffer[i] - '0';
97
+ ASSERT(0 <= digit && digit <= 9);
98
+ result = result * 10 + digit;
99
+ }
100
+ return result;
101
+ }
102
+
103
+
104
+ void Bignum::AssignDecimalString(Vector<const char> value) {
105
+ // 2^64 = 18446744073709551616 > 10^19
106
+ const int kMaxUint64DecimalDigits = 19;
107
+ Zero();
108
+ int length = value.length();
109
+ int pos = 0;
110
+ // Let's just say that each digit needs 4 bits.
111
+ while (length >= kMaxUint64DecimalDigits) {
112
+ uint64_t digits = ReadUInt64(value, pos, kMaxUint64DecimalDigits);
113
+ pos += kMaxUint64DecimalDigits;
114
+ length -= kMaxUint64DecimalDigits;
115
+ MultiplyByPowerOfTen(kMaxUint64DecimalDigits);
116
+ AddUInt64(digits);
117
+ }
118
+ uint64_t digits = ReadUInt64(value, pos, length);
119
+ MultiplyByPowerOfTen(length);
120
+ AddUInt64(digits);
121
+ Clamp();
122
+ }
123
+
124
+
125
+ static int HexCharValue(char c) {
126
+ if ('0' <= c && c <= '9') return c - '0';
127
+ if ('a' <= c && c <= 'f') return 10 + c - 'a';
128
+ if ('A' <= c && c <= 'F') return 10 + c - 'A';
129
+ UNREACHABLE();
130
+ return 0; // To make compiler happy.
131
+ }
132
+
133
+
134
+ void Bignum::AssignHexString(Vector<const char> value) {
135
+ Zero();
136
+ int length = value.length();
137
+
138
+ int needed_bigits = length * 4 / kBigitSize + 1;
139
+ EnsureCapacity(needed_bigits);
140
+ int string_index = length - 1;
141
+ for (int i = 0; i < needed_bigits - 1; ++i) {
142
+ // These bigits are guaranteed to be "full".
143
+ Chunk current_bigit = 0;
144
+ for (int j = 0; j < kBigitSize / 4; j++) {
145
+ current_bigit += HexCharValue(value[string_index--]) << (j * 4);
146
+ }
147
+ bigits_[i] = current_bigit;
148
+ }
149
+ used_digits_ = needed_bigits - 1;
150
+
151
+ Chunk most_significant_bigit = 0; // Could be = 0;
152
+ for (int j = 0; j <= string_index; ++j) {
153
+ most_significant_bigit <<= 4;
154
+ most_significant_bigit += HexCharValue(value[j]);
155
+ }
156
+ if (most_significant_bigit != 0) {
157
+ bigits_[used_digits_] = most_significant_bigit;
158
+ used_digits_++;
159
+ }
160
+ Clamp();
161
+ }
162
+
163
+
164
+ void Bignum::AddUInt64(uint64_t operand) {
165
+ if (operand == 0) return;
166
+ Bignum other;
167
+ other.AssignUInt64(operand);
168
+ AddBignum(other);
169
+ }
170
+
171
+
172
+ void Bignum::AddBignum(const Bignum& other) {
173
+ ASSERT(IsClamped());
174
+ ASSERT(other.IsClamped());
175
+
176
+ // If this has a greater exponent than other append zero-bigits to this.
177
+ // After this call exponent_ <= other.exponent_.
178
+ Align(other);
179
+
180
+ // There are two possibilities:
181
+ // aaaaaaaaaaa 0000 (where the 0s represent a's exponent)
182
+ // bbbbb 00000000
183
+ // ----------------
184
+ // ccccccccccc 0000
185
+ // or
186
+ // aaaaaaaaaa 0000
187
+ // bbbbbbbbb 0000000
188
+ // -----------------
189
+ // cccccccccccc 0000
190
+ // In both cases we might need a carry bigit.
191
+
192
+ EnsureCapacity(1 + Max(BigitLength(), other.BigitLength()) - exponent_);
193
+ Chunk carry = 0;
194
+ int bigit_pos = other.exponent_ - exponent_;
195
+ ASSERT(bigit_pos >= 0);
196
+ for (int i = 0; i < other.used_digits_; ++i) {
197
+ Chunk sum = bigits_[bigit_pos] + other.bigits_[i] + carry;
198
+ bigits_[bigit_pos] = sum & kBigitMask;
199
+ carry = sum >> kBigitSize;
200
+ bigit_pos++;
201
+ }
202
+
203
+ while (carry != 0) {
204
+ Chunk sum = bigits_[bigit_pos] + carry;
205
+ bigits_[bigit_pos] = sum & kBigitMask;
206
+ carry = sum >> kBigitSize;
207
+ bigit_pos++;
208
+ }
209
+ used_digits_ = Max(bigit_pos, used_digits_);
210
+ ASSERT(IsClamped());
211
+ }
212
+
213
+
214
+ void Bignum::SubtractBignum(const Bignum& other) {
215
+ ASSERT(IsClamped());
216
+ ASSERT(other.IsClamped());
217
+ // We require this to be bigger than other.
218
+ ASSERT(LessEqual(other, *this));
219
+
220
+ Align(other);
221
+
222
+ int offset = other.exponent_ - exponent_;
223
+ Chunk borrow = 0;
224
+ int i;
225
+ for (i = 0; i < other.used_digits_; ++i) {
226
+ ASSERT((borrow == 0) || (borrow == 1));
227
+ Chunk difference = bigits_[i + offset] - other.bigits_[i] - borrow;
228
+ bigits_[i + offset] = difference & kBigitMask;
229
+ borrow = difference >> (kChunkSize - 1);
230
+ }
231
+ while (borrow != 0) {
232
+ Chunk difference = bigits_[i + offset] - borrow;
233
+ bigits_[i + offset] = difference & kBigitMask;
234
+ borrow = difference >> (kChunkSize - 1);
235
+ ++i;
236
+ }
237
+ Clamp();
238
+ }
239
+
240
+
241
+ void Bignum::ShiftLeft(int shift_amount) {
242
+ if (used_digits_ == 0) return;
243
+ exponent_ += shift_amount / kBigitSize;
244
+ int local_shift = shift_amount % kBigitSize;
245
+ EnsureCapacity(used_digits_ + 1);
246
+ BigitsShiftLeft(local_shift);
247
+ }
248
+
249
+
250
+ void Bignum::MultiplyByUInt32(uint32_t factor) {
251
+ if (factor == 1) return;
252
+ if (factor == 0) {
253
+ Zero();
254
+ return;
255
+ }
256
+ if (used_digits_ == 0) return;
257
+
258
+ // The product of a bigit with the factor is of size kBigitSize + 32.
259
+ // Assert that this number + 1 (for the carry) fits into double chunk.
260
+ ASSERT(kDoubleChunkSize >= kBigitSize + 32 + 1);
261
+ DoubleChunk carry = 0;
262
+ for (int i = 0; i < used_digits_; ++i) {
263
+ DoubleChunk product = static_cast<DoubleChunk>(factor) * bigits_[i] + carry;
264
+ bigits_[i] = static_cast<Chunk>(product & kBigitMask);
265
+ carry = (product >> kBigitSize);
266
+ }
267
+ while (carry != 0) {
268
+ EnsureCapacity(used_digits_ + 1);
269
+ bigits_[used_digits_] = static_cast<Chunk>(carry & kBigitMask);
270
+ used_digits_++;
271
+ carry >>= kBigitSize;
272
+ }
273
+ }
274
+
275
+
276
+ void Bignum::MultiplyByUInt64(uint64_t factor) {
277
+ if (factor == 1) return;
278
+ if (factor == 0) {
279
+ Zero();
280
+ return;
281
+ }
282
+ ASSERT(kBigitSize < 32);
283
+ uint64_t carry = 0;
284
+ uint64_t low = factor & 0xFFFFFFFF;
285
+ uint64_t high = factor >> 32;
286
+ for (int i = 0; i < used_digits_; ++i) {
287
+ uint64_t product_low = low * bigits_[i];
288
+ uint64_t product_high = high * bigits_[i];
289
+ uint64_t tmp = (carry & kBigitMask) + product_low;
290
+ bigits_[i] = static_cast<Chunk>(tmp & kBigitMask);
291
+ carry = (carry >> kBigitSize) + (tmp >> kBigitSize) +
292
+ (product_high << (32 - kBigitSize));
293
+ }
294
+ while (carry != 0) {
295
+ EnsureCapacity(used_digits_ + 1);
296
+ bigits_[used_digits_] = static_cast<Chunk>(carry & kBigitMask);
297
+ used_digits_++;
298
+ carry >>= kBigitSize;
299
+ }
300
+ }
301
+
302
+
303
+ void Bignum::MultiplyByPowerOfTen(int exponent) {
304
+ const uint64_t kFive27 = V8_2PART_UINT64_C(0x6765c793, fa10079d);
305
+ const uint16_t kFive1 = 5;
306
+ const uint16_t kFive2 = kFive1 * 5;
307
+ const uint16_t kFive3 = kFive2 * 5;
308
+ const uint16_t kFive4 = kFive3 * 5;
309
+ const uint16_t kFive5 = kFive4 * 5;
310
+ const uint16_t kFive6 = kFive5 * 5;
311
+ const uint32_t kFive7 = kFive6 * 5;
312
+ const uint32_t kFive8 = kFive7 * 5;
313
+ const uint32_t kFive9 = kFive8 * 5;
314
+ const uint32_t kFive10 = kFive9 * 5;
315
+ const uint32_t kFive11 = kFive10 * 5;
316
+ const uint32_t kFive12 = kFive11 * 5;
317
+ const uint32_t kFive13 = kFive12 * 5;
318
+ const uint32_t kFive1_to_12[] =
319
+ { kFive1, kFive2, kFive3, kFive4, kFive5, kFive6,
320
+ kFive7, kFive8, kFive9, kFive10, kFive11, kFive12 };
321
+
322
+ ASSERT(exponent >= 0);
323
+ if (exponent == 0) return;
324
+ if (used_digits_ == 0) return;
325
+
326
+ // We shift by exponent at the end just before returning.
327
+ int remaining_exponent = exponent;
328
+ while (remaining_exponent >= 27) {
329
+ MultiplyByUInt64(kFive27);
330
+ remaining_exponent -= 27;
331
+ }
332
+ while (remaining_exponent >= 13) {
333
+ MultiplyByUInt32(kFive13);
334
+ remaining_exponent -= 13;
335
+ }
336
+ if (remaining_exponent > 0) {
337
+ MultiplyByUInt32(kFive1_to_12[remaining_exponent - 1]);
338
+ }
339
+ ShiftLeft(exponent);
340
+ }
341
+
342
+
343
+ void Bignum::Square() {
344
+ ASSERT(IsClamped());
345
+ int product_length = 2 * used_digits_;
346
+ EnsureCapacity(product_length);
347
+
348
+ // Comba multiplication: compute each column separately.
349
+ // Example: r = a2a1a0 * b2b1b0.
350
+ // r = 1 * a0b0 +
351
+ // 10 * (a1b0 + a0b1) +
352
+ // 100 * (a2b0 + a1b1 + a0b2) +
353
+ // 1000 * (a2b1 + a1b2) +
354
+ // 10000 * a2b2
355
+ //
356
+ // In the worst case we have to accumulate nb-digits products of digit*digit.
357
+ //
358
+ // Assert that the additional number of bits in a DoubleChunk are enough to
359
+ // sum up used_digits of Bigit*Bigit.
360
+ if ((1 << (2 * (kChunkSize - kBigitSize))) <= used_digits_) {
361
+ UNIMPLEMENTED();
362
+ }
363
+ DoubleChunk accumulator = 0;
364
+ // First shift the digits so we don't overwrite them.
365
+ int copy_offset = used_digits_;
366
+ for (int i = 0; i < used_digits_; ++i) {
367
+ bigits_[copy_offset + i] = bigits_[i];
368
+ }
369
+ // We have two loops to avoid some 'if's in the loop.
370
+ for (int i = 0; i < used_digits_; ++i) {
371
+ // Process temporary digit i with power i.
372
+ // The sum of the two indices must be equal to i.
373
+ int bigit_index1 = i;
374
+ int bigit_index2 = 0;
375
+ // Sum all of the sub-products.
376
+ while (bigit_index1 >= 0) {
377
+ Chunk chunk1 = bigits_[copy_offset + bigit_index1];
378
+ Chunk chunk2 = bigits_[copy_offset + bigit_index2];
379
+ accumulator += static_cast<DoubleChunk>(chunk1) * chunk2;
380
+ bigit_index1--;
381
+ bigit_index2++;
382
+ }
383
+ bigits_[i] = static_cast<Chunk>(accumulator) & kBigitMask;
384
+ accumulator >>= kBigitSize;
385
+ }
386
+ for (int i = used_digits_; i < product_length; ++i) {
387
+ int bigit_index1 = used_digits_ - 1;
388
+ int bigit_index2 = i - bigit_index1;
389
+ // Invariant: sum of both indices is again equal to i.
390
+ // Inner loop runs 0 times on last iteration, emptying accumulator.
391
+ while (bigit_index2 < used_digits_) {
392
+ Chunk chunk1 = bigits_[copy_offset + bigit_index1];
393
+ Chunk chunk2 = bigits_[copy_offset + bigit_index2];
394
+ accumulator += static_cast<DoubleChunk>(chunk1) * chunk2;
395
+ bigit_index1--;
396
+ bigit_index2++;
397
+ }
398
+ // The overwritten bigits_[i] will never be read in further loop iterations,
399
+ // because bigit_index1 and bigit_index2 are always greater
400
+ // than i - used_digits_.
401
+ bigits_[i] = static_cast<Chunk>(accumulator) & kBigitMask;
402
+ accumulator >>= kBigitSize;
403
+ }
404
+ // Since the result was guaranteed to lie inside the number the
405
+ // accumulator must be 0 now.
406
+ ASSERT(accumulator == 0);
407
+
408
+ // Don't forget to update the used_digits and the exponent.
409
+ used_digits_ = product_length;
410
+ exponent_ *= 2;
411
+ Clamp();
412
+ }
413
+
414
+
415
+ void Bignum::AssignPowerUInt16(uint16_t base, int power_exponent) {
416
+ ASSERT(base != 0);
417
+ ASSERT(power_exponent >= 0);
418
+ if (power_exponent == 0) {
419
+ AssignUInt16(1);
420
+ return;
421
+ }
422
+ Zero();
423
+ int shifts = 0;
424
+ // We expect base to be in range 2-32, and most often to be 10.
425
+ // It does not make much sense to implement different algorithms for counting
426
+ // the bits.
427
+ while ((base & 1) == 0) {
428
+ base >>= 1;
429
+ shifts++;
430
+ }
431
+ int bit_size = 0;
432
+ int tmp_base = base;
433
+ while (tmp_base != 0) {
434
+ tmp_base >>= 1;
435
+ bit_size++;
436
+ }
437
+ int final_size = bit_size * power_exponent;
438
+ // 1 extra bigit for the shifting, and one for rounded final_size.
439
+ EnsureCapacity(final_size / kBigitSize + 2);
440
+
441
+ // Left to Right exponentiation.
442
+ int mask = 1;
443
+ while (power_exponent >= mask) mask <<= 1;
444
+
445
+ // The mask is now pointing to the bit above the most significant 1-bit of
446
+ // power_exponent.
447
+ // Get rid of first 1-bit;
448
+ mask >>= 2;
449
+ uint64_t this_value = base;
450
+
451
+ bool delayed_multipliciation = false;
452
+ const uint64_t max_32bits = 0xFFFFFFFF;
453
+ while (mask != 0 && this_value <= max_32bits) {
454
+ this_value = this_value * this_value;
455
+ // Verify that there is enough space in this_value to perform the
456
+ // multiplication. The first bit_size bits must be 0.
457
+ if ((power_exponent & mask) != 0) {
458
+ uint64_t base_bits_mask =
459
+ ~((static_cast<uint64_t>(1) << (64 - bit_size)) - 1);
460
+ bool high_bits_zero = (this_value & base_bits_mask) == 0;
461
+ if (high_bits_zero) {
462
+ this_value *= base;
463
+ } else {
464
+ delayed_multipliciation = true;
465
+ }
466
+ }
467
+ mask >>= 1;
468
+ }
469
+ AssignUInt64(this_value);
470
+ if (delayed_multipliciation) {
471
+ MultiplyByUInt32(base);
472
+ }
473
+
474
+ // Now do the same thing as a bignum.
475
+ while (mask != 0) {
476
+ Square();
477
+ if ((power_exponent & mask) != 0) {
478
+ MultiplyByUInt32(base);
479
+ }
480
+ mask >>= 1;
481
+ }
482
+
483
+ // And finally add the saved shifts.
484
+ ShiftLeft(shifts * power_exponent);
485
+ }
486
+
487
+
488
+ // Precondition: this/other < 16bit.
489
+ uint16_t Bignum::DivideModuloIntBignum(const Bignum& other) {
490
+ ASSERT(IsClamped());
491
+ ASSERT(other.IsClamped());
492
+ ASSERT(other.used_digits_ > 0);
493
+
494
+ // Easy case: if we have less digits than the divisor than the result is 0.
495
+ // Note: this handles the case where this == 0, too.
496
+ if (BigitLength() < other.BigitLength()) {
497
+ return 0;
498
+ }
499
+
500
+ Align(other);
501
+
502
+ uint16_t result = 0;
503
+
504
+ // Start by removing multiples of 'other' until both numbers have the same
505
+ // number of digits.
506
+ while (BigitLength() > other.BigitLength()) {
507
+ // This naive approach is extremely inefficient if the this divided other
508
+ // might be big. This function is implemented for doubleToString where
509
+ // the result should be small (less than 10).
510
+ ASSERT(other.bigits_[other.used_digits_ - 1] >= ((1 << kBigitSize) / 16));
511
+ // Remove the multiples of the first digit.
512
+ // Example this = 23 and other equals 9. -> Remove 2 multiples.
513
+ result += bigits_[used_digits_ - 1];
514
+ SubtractTimes(other, bigits_[used_digits_ - 1]);
515
+ }
516
+
517
+ ASSERT(BigitLength() == other.BigitLength());
518
+
519
+ // Both bignums are at the same length now.
520
+ // Since other has more than 0 digits we know that the access to
521
+ // bigits_[used_digits_ - 1] is safe.
522
+ Chunk this_bigit = bigits_[used_digits_ - 1];
523
+ Chunk other_bigit = other.bigits_[other.used_digits_ - 1];
524
+
525
+ if (other.used_digits_ == 1) {
526
+ // Shortcut for easy (and common) case.
527
+ int quotient = this_bigit / other_bigit;
528
+ bigits_[used_digits_ - 1] = this_bigit - other_bigit * quotient;
529
+ result += quotient;
530
+ Clamp();
531
+ return result;
532
+ }
533
+
534
+ int division_estimate = this_bigit / (other_bigit + 1);
535
+ result += division_estimate;
536
+ SubtractTimes(other, division_estimate);
537
+
538
+ if (other_bigit * (division_estimate + 1) > this_bigit) {
539
+ // No need to even try to subtract. Even if other's remaining digits were 0
540
+ // another subtraction would be too much.
541
+ return result;
542
+ }
543
+
544
+ while (LessEqual(other, *this)) {
545
+ SubtractBignum(other);
546
+ result++;
547
+ }
548
+ return result;
549
+ }
550
+
551
+
552
+ template<typename S>
553
+ static int SizeInHexChars(S number) {
554
+ ASSERT(number > 0);
555
+ int result = 0;
556
+ while (number != 0) {
557
+ number >>= 4;
558
+ result++;
559
+ }
560
+ return result;
561
+ }
562
+
563
+
564
+ static char HexCharOfValue(int value) {
565
+ ASSERT(0 <= value && value <= 16);
566
+ if (value < 10) return value + '0';
567
+ return value - 10 + 'A';
568
+ }
569
+
570
+
571
+ bool Bignum::ToHexString(char* buffer, int buffer_size) const {
572
+ ASSERT(IsClamped());
573
+ // Each bigit must be printable as separate hex-character.
574
+ ASSERT(kBigitSize % 4 == 0);
575
+ const int kHexCharsPerBigit = kBigitSize / 4;
576
+
577
+ if (used_digits_ == 0) {
578
+ if (buffer_size < 2) return false;
579
+ buffer[0] = '0';
580
+ buffer[1] = '\0';
581
+ return true;
582
+ }
583
+ // We add 1 for the terminating '\0' character.
584
+ int needed_chars = (BigitLength() - 1) * kHexCharsPerBigit +
585
+ SizeInHexChars(bigits_[used_digits_ - 1]) + 1;
586
+ if (needed_chars > buffer_size) return false;
587
+ int string_index = needed_chars - 1;
588
+ buffer[string_index--] = '\0';
589
+ for (int i = 0; i < exponent_; ++i) {
590
+ for (int j = 0; j < kHexCharsPerBigit; ++j) {
591
+ buffer[string_index--] = '0';
592
+ }
593
+ }
594
+ for (int i = 0; i < used_digits_ - 1; ++i) {
595
+ Chunk current_bigit = bigits_[i];
596
+ for (int j = 0; j < kHexCharsPerBigit; ++j) {
597
+ buffer[string_index--] = HexCharOfValue(current_bigit & 0xF);
598
+ current_bigit >>= 4;
599
+ }
600
+ }
601
+ // And finally the last bigit.
602
+ Chunk most_significant_bigit = bigits_[used_digits_ - 1];
603
+ while (most_significant_bigit != 0) {
604
+ buffer[string_index--] = HexCharOfValue(most_significant_bigit & 0xF);
605
+ most_significant_bigit >>= 4;
606
+ }
607
+ return true;
608
+ }
609
+
610
+
611
+ Bignum::Chunk Bignum::BigitAt(int index) const {
612
+ if (index >= BigitLength()) return 0;
613
+ if (index < exponent_) return 0;
614
+ return bigits_[index - exponent_];
615
+ }
616
+
617
+
618
+ int Bignum::Compare(const Bignum& a, const Bignum& b) {
619
+ ASSERT(a.IsClamped());
620
+ ASSERT(b.IsClamped());
621
+ int bigit_length_a = a.BigitLength();
622
+ int bigit_length_b = b.BigitLength();
623
+ if (bigit_length_a < bigit_length_b) return -1;
624
+ if (bigit_length_a > bigit_length_b) return +1;
625
+ for (int i = bigit_length_a - 1; i >= Min(a.exponent_, b.exponent_); --i) {
626
+ Chunk bigit_a = a.BigitAt(i);
627
+ Chunk bigit_b = b.BigitAt(i);
628
+ if (bigit_a < bigit_b) return -1;
629
+ if (bigit_a > bigit_b) return +1;
630
+ // Otherwise they are equal up to this digit. Try the next digit.
631
+ }
632
+ return 0;
633
+ }
634
+
635
+
636
+ int Bignum::PlusCompare(const Bignum& a, const Bignum& b, const Bignum& c) {
637
+ ASSERT(a.IsClamped());
638
+ ASSERT(b.IsClamped());
639
+ ASSERT(c.IsClamped());
640
+ if (a.BigitLength() < b.BigitLength()) {
641
+ return PlusCompare(b, a, c);
642
+ }
643
+ if (a.BigitLength() + 1 < c.BigitLength()) return -1;
644
+ if (a.BigitLength() > c.BigitLength()) return +1;
645
+ // The exponent encodes 0-bigits. So if there are more 0-digits in 'a' than
646
+ // 'b' has digits, then the bigit-length of 'a'+'b' must be equal to the one
647
+ // of 'a'.
648
+ if (a.exponent_ >= b.BigitLength() && a.BigitLength() < c.BigitLength()) {
649
+ return -1;
650
+ }
651
+
652
+ Chunk borrow = 0;
653
+ // Starting at min_exponent all digits are == 0. So no need to compare them.
654
+ int min_exponent = Min(Min(a.exponent_, b.exponent_), c.exponent_);
655
+ for (int i = c.BigitLength() - 1; i >= min_exponent; --i) {
656
+ Chunk chunk_a = a.BigitAt(i);
657
+ Chunk chunk_b = b.BigitAt(i);
658
+ Chunk chunk_c = c.BigitAt(i);
659
+ Chunk sum = chunk_a + chunk_b;
660
+ if (sum > chunk_c + borrow) {
661
+ return +1;
662
+ } else {
663
+ borrow = chunk_c + borrow - sum;
664
+ if (borrow > 1) return -1;
665
+ borrow <<= kBigitSize;
666
+ }
667
+ }
668
+ if (borrow == 0) return 0;
669
+ return -1;
670
+ }
671
+
672
+
673
+ void Bignum::Clamp() {
674
+ while (used_digits_ > 0 && bigits_[used_digits_ - 1] == 0) {
675
+ used_digits_--;
676
+ }
677
+ if (used_digits_ == 0) {
678
+ // Zero.
679
+ exponent_ = 0;
680
+ }
681
+ }
682
+
683
+
684
+ bool Bignum::IsClamped() const {
685
+ return used_digits_ == 0 || bigits_[used_digits_ - 1] != 0;
686
+ }
687
+
688
+
689
+ void Bignum::Zero() {
690
+ for (int i = 0; i < used_digits_; ++i) {
691
+ bigits_[i] = 0;
692
+ }
693
+ used_digits_ = 0;
694
+ exponent_ = 0;
695
+ }
696
+
697
+
698
+ void Bignum::Align(const Bignum& other) {
699
+ if (exponent_ > other.exponent_) {
700
+ // If "X" represents a "hidden" digit (by the exponent) then we are in the
701
+ // following case (a == this, b == other):
702
+ // a: aaaaaaXXXX or a: aaaaaXXX
703
+ // b: bbbbbbX b: bbbbbbbbXX
704
+ // We replace some of the hidden digits (X) of a with 0 digits.
705
+ // a: aaaaaa000X or a: aaaaa0XX
706
+ int zero_digits = exponent_ - other.exponent_;
707
+ EnsureCapacity(used_digits_ + zero_digits);
708
+ for (int i = used_digits_ - 1; i >= 0; --i) {
709
+ bigits_[i + zero_digits] = bigits_[i];
710
+ }
711
+ for (int i = 0; i < zero_digits; ++i) {
712
+ bigits_[i] = 0;
713
+ }
714
+ used_digits_ += zero_digits;
715
+ exponent_ -= zero_digits;
716
+ ASSERT(used_digits_ >= 0);
717
+ ASSERT(exponent_ >= 0);
718
+ }
719
+ }
720
+
721
+
722
+ void Bignum::BigitsShiftLeft(int shift_amount) {
723
+ ASSERT(shift_amount < kBigitSize);
724
+ ASSERT(shift_amount >= 0);
725
+ Chunk carry = 0;
726
+ for (int i = 0; i < used_digits_; ++i) {
727
+ Chunk new_carry = bigits_[i] >> (kBigitSize - shift_amount);
728
+ bigits_[i] = ((bigits_[i] << shift_amount) + carry) & kBigitMask;
729
+ carry = new_carry;
730
+ }
731
+ if (carry != 0) {
732
+ bigits_[used_digits_] = carry;
733
+ used_digits_++;
734
+ }
735
+ }
736
+
737
+
738
+ void Bignum::SubtractTimes(const Bignum& other, int factor) {
739
+ ASSERT(exponent_ <= other.exponent_);
740
+ if (factor < 3) {
741
+ for (int i = 0; i < factor; ++i) {
742
+ SubtractBignum(other);
743
+ }
744
+ return;
745
+ }
746
+ Chunk borrow = 0;
747
+ int exponent_diff = other.exponent_ - exponent_;
748
+ for (int i = 0; i < other.used_digits_; ++i) {
749
+ DoubleChunk product = static_cast<DoubleChunk>(factor) * other.bigits_[i];
750
+ DoubleChunk remove = borrow + product;
751
+ Chunk difference =
752
+ bigits_[i + exponent_diff] - static_cast<Chunk>(remove & kBigitMask);
753
+ bigits_[i + exponent_diff] = difference & kBigitMask;
754
+ borrow = static_cast<Chunk>((difference >> (kChunkSize - 1)) +
755
+ (remove >> kBigitSize));
756
+ }
757
+ for (int i = other.used_digits_ + exponent_diff; i < used_digits_; ++i) {
758
+ if (borrow == 0) return;
759
+ Chunk difference = bigits_[i] - borrow;
760
+ bigits_[i] = difference & kBigitMask;
761
+ borrow = difference >> (kChunkSize - 1);
762
+ ++i;
763
+ }
764
+ Clamp();
765
+ }
766
+
767
+
768
+ } } // namespace v8::internal