libv8-sgonyea 3.3.10
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +8 -0
- data/.gitmodules +3 -0
- data/Gemfile +4 -0
- data/README.md +76 -0
- data/Rakefile +113 -0
- data/ext/libv8/extconf.rb +28 -0
- data/lib/libv8.rb +15 -0
- data/lib/libv8/Makefile +30 -0
- data/lib/libv8/detect_cpu.rb +27 -0
- data/lib/libv8/fpic-on-linux-amd64.patch +13 -0
- data/lib/libv8/v8/.gitignore +35 -0
- data/lib/libv8/v8/AUTHORS +44 -0
- data/lib/libv8/v8/ChangeLog +2839 -0
- data/lib/libv8/v8/LICENSE +52 -0
- data/lib/libv8/v8/LICENSE.strongtalk +29 -0
- data/lib/libv8/v8/LICENSE.v8 +26 -0
- data/lib/libv8/v8/LICENSE.valgrind +45 -0
- data/lib/libv8/v8/SConstruct +1478 -0
- data/lib/libv8/v8/build/README.txt +49 -0
- data/lib/libv8/v8/build/all.gyp +18 -0
- data/lib/libv8/v8/build/armu.gypi +32 -0
- data/lib/libv8/v8/build/common.gypi +144 -0
- data/lib/libv8/v8/build/gyp_v8 +145 -0
- data/lib/libv8/v8/include/v8-debug.h +395 -0
- data/lib/libv8/v8/include/v8-preparser.h +117 -0
- data/lib/libv8/v8/include/v8-profiler.h +505 -0
- data/lib/libv8/v8/include/v8-testing.h +104 -0
- data/lib/libv8/v8/include/v8.h +4124 -0
- data/lib/libv8/v8/include/v8stdint.h +53 -0
- data/lib/libv8/v8/preparser/SConscript +38 -0
- data/lib/libv8/v8/preparser/preparser-process.cc +379 -0
- data/lib/libv8/v8/src/SConscript +368 -0
- data/lib/libv8/v8/src/accessors.cc +767 -0
- data/lib/libv8/v8/src/accessors.h +123 -0
- data/lib/libv8/v8/src/allocation-inl.h +49 -0
- data/lib/libv8/v8/src/allocation.cc +122 -0
- data/lib/libv8/v8/src/allocation.h +143 -0
- data/lib/libv8/v8/src/api.cc +5845 -0
- data/lib/libv8/v8/src/api.h +574 -0
- data/lib/libv8/v8/src/apinatives.js +110 -0
- data/lib/libv8/v8/src/apiutils.h +73 -0
- data/lib/libv8/v8/src/arguments.h +118 -0
- data/lib/libv8/v8/src/arm/assembler-arm-inl.h +353 -0
- data/lib/libv8/v8/src/arm/assembler-arm.cc +2661 -0
- data/lib/libv8/v8/src/arm/assembler-arm.h +1375 -0
- data/lib/libv8/v8/src/arm/builtins-arm.cc +1658 -0
- data/lib/libv8/v8/src/arm/code-stubs-arm.cc +6398 -0
- data/lib/libv8/v8/src/arm/code-stubs-arm.h +673 -0
- data/lib/libv8/v8/src/arm/codegen-arm.cc +52 -0
- data/lib/libv8/v8/src/arm/codegen-arm.h +91 -0
- data/lib/libv8/v8/src/arm/constants-arm.cc +152 -0
- data/lib/libv8/v8/src/arm/constants-arm.h +775 -0
- data/lib/libv8/v8/src/arm/cpu-arm.cc +120 -0
- data/lib/libv8/v8/src/arm/debug-arm.cc +317 -0
- data/lib/libv8/v8/src/arm/deoptimizer-arm.cc +754 -0
- data/lib/libv8/v8/src/arm/disasm-arm.cc +1506 -0
- data/lib/libv8/v8/src/arm/frames-arm.cc +45 -0
- data/lib/libv8/v8/src/arm/frames-arm.h +168 -0
- data/lib/libv8/v8/src/arm/full-codegen-arm.cc +4375 -0
- data/lib/libv8/v8/src/arm/ic-arm.cc +1562 -0
- data/lib/libv8/v8/src/arm/lithium-arm.cc +2206 -0
- data/lib/libv8/v8/src/arm/lithium-arm.h +2348 -0
- data/lib/libv8/v8/src/arm/lithium-codegen-arm.cc +4526 -0
- data/lib/libv8/v8/src/arm/lithium-codegen-arm.h +403 -0
- data/lib/libv8/v8/src/arm/lithium-gap-resolver-arm.cc +305 -0
- data/lib/libv8/v8/src/arm/lithium-gap-resolver-arm.h +84 -0
- data/lib/libv8/v8/src/arm/macro-assembler-arm.cc +3163 -0
- data/lib/libv8/v8/src/arm/macro-assembler-arm.h +1126 -0
- data/lib/libv8/v8/src/arm/regexp-macro-assembler-arm.cc +1287 -0
- data/lib/libv8/v8/src/arm/regexp-macro-assembler-arm.h +253 -0
- data/lib/libv8/v8/src/arm/simulator-arm.cc +3424 -0
- data/lib/libv8/v8/src/arm/simulator-arm.h +431 -0
- data/lib/libv8/v8/src/arm/stub-cache-arm.cc +4243 -0
- data/lib/libv8/v8/src/array.js +1366 -0
- data/lib/libv8/v8/src/assembler.cc +1207 -0
- data/lib/libv8/v8/src/assembler.h +858 -0
- data/lib/libv8/v8/src/ast-inl.h +112 -0
- data/lib/libv8/v8/src/ast.cc +1146 -0
- data/lib/libv8/v8/src/ast.h +2188 -0
- data/lib/libv8/v8/src/atomicops.h +167 -0
- data/lib/libv8/v8/src/atomicops_internals_arm_gcc.h +145 -0
- data/lib/libv8/v8/src/atomicops_internals_mips_gcc.h +169 -0
- data/lib/libv8/v8/src/atomicops_internals_x86_gcc.cc +133 -0
- data/lib/libv8/v8/src/atomicops_internals_x86_gcc.h +287 -0
- data/lib/libv8/v8/src/atomicops_internals_x86_macosx.h +301 -0
- data/lib/libv8/v8/src/atomicops_internals_x86_msvc.h +203 -0
- data/lib/libv8/v8/src/bignum-dtoa.cc +655 -0
- data/lib/libv8/v8/src/bignum-dtoa.h +81 -0
- data/lib/libv8/v8/src/bignum.cc +768 -0
- data/lib/libv8/v8/src/bignum.h +140 -0
- data/lib/libv8/v8/src/bootstrapper.cc +2184 -0
- data/lib/libv8/v8/src/bootstrapper.h +188 -0
- data/lib/libv8/v8/src/builtins.cc +1707 -0
- data/lib/libv8/v8/src/builtins.h +371 -0
- data/lib/libv8/v8/src/bytecodes-irregexp.h +105 -0
- data/lib/libv8/v8/src/cached-powers.cc +177 -0
- data/lib/libv8/v8/src/cached-powers.h +65 -0
- data/lib/libv8/v8/src/char-predicates-inl.h +94 -0
- data/lib/libv8/v8/src/char-predicates.h +67 -0
- data/lib/libv8/v8/src/checks.cc +110 -0
- data/lib/libv8/v8/src/checks.h +296 -0
- data/lib/libv8/v8/src/circular-queue-inl.h +53 -0
- data/lib/libv8/v8/src/circular-queue.cc +122 -0
- data/lib/libv8/v8/src/circular-queue.h +103 -0
- data/lib/libv8/v8/src/code-stubs.cc +267 -0
- data/lib/libv8/v8/src/code-stubs.h +1011 -0
- data/lib/libv8/v8/src/code.h +70 -0
- data/lib/libv8/v8/src/codegen.cc +231 -0
- data/lib/libv8/v8/src/codegen.h +84 -0
- data/lib/libv8/v8/src/compilation-cache.cc +540 -0
- data/lib/libv8/v8/src/compilation-cache.h +287 -0
- data/lib/libv8/v8/src/compiler.cc +786 -0
- data/lib/libv8/v8/src/compiler.h +312 -0
- data/lib/libv8/v8/src/contexts.cc +347 -0
- data/lib/libv8/v8/src/contexts.h +391 -0
- data/lib/libv8/v8/src/conversions-inl.h +106 -0
- data/lib/libv8/v8/src/conversions.cc +1131 -0
- data/lib/libv8/v8/src/conversions.h +135 -0
- data/lib/libv8/v8/src/counters.cc +93 -0
- data/lib/libv8/v8/src/counters.h +254 -0
- data/lib/libv8/v8/src/cpu-profiler-inl.h +101 -0
- data/lib/libv8/v8/src/cpu-profiler.cc +609 -0
- data/lib/libv8/v8/src/cpu-profiler.h +302 -0
- data/lib/libv8/v8/src/cpu.h +69 -0
- data/lib/libv8/v8/src/d8-debug.cc +367 -0
- data/lib/libv8/v8/src/d8-debug.h +158 -0
- data/lib/libv8/v8/src/d8-posix.cc +695 -0
- data/lib/libv8/v8/src/d8-readline.cc +130 -0
- data/lib/libv8/v8/src/d8-windows.cc +42 -0
- data/lib/libv8/v8/src/d8.cc +803 -0
- data/lib/libv8/v8/src/d8.gyp +91 -0
- data/lib/libv8/v8/src/d8.h +235 -0
- data/lib/libv8/v8/src/d8.js +2798 -0
- data/lib/libv8/v8/src/data-flow.cc +66 -0
- data/lib/libv8/v8/src/data-flow.h +205 -0
- data/lib/libv8/v8/src/date.js +1103 -0
- data/lib/libv8/v8/src/dateparser-inl.h +127 -0
- data/lib/libv8/v8/src/dateparser.cc +178 -0
- data/lib/libv8/v8/src/dateparser.h +266 -0
- data/lib/libv8/v8/src/debug-agent.cc +447 -0
- data/lib/libv8/v8/src/debug-agent.h +129 -0
- data/lib/libv8/v8/src/debug-debugger.js +2569 -0
- data/lib/libv8/v8/src/debug.cc +3165 -0
- data/lib/libv8/v8/src/debug.h +1057 -0
- data/lib/libv8/v8/src/deoptimizer.cc +1256 -0
- data/lib/libv8/v8/src/deoptimizer.h +602 -0
- data/lib/libv8/v8/src/disasm.h +80 -0
- data/lib/libv8/v8/src/disassembler.cc +343 -0
- data/lib/libv8/v8/src/disassembler.h +58 -0
- data/lib/libv8/v8/src/diy-fp.cc +58 -0
- data/lib/libv8/v8/src/diy-fp.h +117 -0
- data/lib/libv8/v8/src/double.h +238 -0
- data/lib/libv8/v8/src/dtoa.cc +103 -0
- data/lib/libv8/v8/src/dtoa.h +85 -0
- data/lib/libv8/v8/src/execution.cc +849 -0
- data/lib/libv8/v8/src/execution.h +297 -0
- data/lib/libv8/v8/src/extensions/experimental/break-iterator.cc +250 -0
- data/lib/libv8/v8/src/extensions/experimental/break-iterator.h +89 -0
- data/lib/libv8/v8/src/extensions/experimental/collator.cc +218 -0
- data/lib/libv8/v8/src/extensions/experimental/collator.h +69 -0
- data/lib/libv8/v8/src/extensions/experimental/experimental.gyp +94 -0
- data/lib/libv8/v8/src/extensions/experimental/i18n-extension.cc +78 -0
- data/lib/libv8/v8/src/extensions/experimental/i18n-extension.h +54 -0
- data/lib/libv8/v8/src/extensions/experimental/i18n-locale.cc +112 -0
- data/lib/libv8/v8/src/extensions/experimental/i18n-locale.h +60 -0
- data/lib/libv8/v8/src/extensions/experimental/i18n-utils.cc +43 -0
- data/lib/libv8/v8/src/extensions/experimental/i18n-utils.h +49 -0
- data/lib/libv8/v8/src/extensions/experimental/i18n.js +180 -0
- data/lib/libv8/v8/src/extensions/experimental/language-matcher.cc +251 -0
- data/lib/libv8/v8/src/extensions/experimental/language-matcher.h +95 -0
- data/lib/libv8/v8/src/extensions/externalize-string-extension.cc +141 -0
- data/lib/libv8/v8/src/extensions/externalize-string-extension.h +50 -0
- data/lib/libv8/v8/src/extensions/gc-extension.cc +58 -0
- data/lib/libv8/v8/src/extensions/gc-extension.h +49 -0
- data/lib/libv8/v8/src/factory.cc +1222 -0
- data/lib/libv8/v8/src/factory.h +442 -0
- data/lib/libv8/v8/src/fast-dtoa.cc +736 -0
- data/lib/libv8/v8/src/fast-dtoa.h +83 -0
- data/lib/libv8/v8/src/fixed-dtoa.cc +405 -0
- data/lib/libv8/v8/src/fixed-dtoa.h +55 -0
- data/lib/libv8/v8/src/flag-definitions.h +560 -0
- data/lib/libv8/v8/src/flags.cc +551 -0
- data/lib/libv8/v8/src/flags.h +79 -0
- data/lib/libv8/v8/src/frames-inl.h +247 -0
- data/lib/libv8/v8/src/frames.cc +1243 -0
- data/lib/libv8/v8/src/frames.h +870 -0
- data/lib/libv8/v8/src/full-codegen.cc +1374 -0
- data/lib/libv8/v8/src/full-codegen.h +771 -0
- data/lib/libv8/v8/src/func-name-inferrer.cc +92 -0
- data/lib/libv8/v8/src/func-name-inferrer.h +111 -0
- data/lib/libv8/v8/src/gdb-jit.cc +1555 -0
- data/lib/libv8/v8/src/gdb-jit.h +143 -0
- data/lib/libv8/v8/src/global-handles.cc +665 -0
- data/lib/libv8/v8/src/global-handles.h +284 -0
- data/lib/libv8/v8/src/globals.h +325 -0
- data/lib/libv8/v8/src/handles-inl.h +177 -0
- data/lib/libv8/v8/src/handles.cc +987 -0
- data/lib/libv8/v8/src/handles.h +382 -0
- data/lib/libv8/v8/src/hashmap.cc +230 -0
- data/lib/libv8/v8/src/hashmap.h +123 -0
- data/lib/libv8/v8/src/heap-inl.h +704 -0
- data/lib/libv8/v8/src/heap-profiler.cc +1173 -0
- data/lib/libv8/v8/src/heap-profiler.h +397 -0
- data/lib/libv8/v8/src/heap.cc +5930 -0
- data/lib/libv8/v8/src/heap.h +2268 -0
- data/lib/libv8/v8/src/hydrogen-instructions.cc +1769 -0
- data/lib/libv8/v8/src/hydrogen-instructions.h +3971 -0
- data/lib/libv8/v8/src/hydrogen.cc +6239 -0
- data/lib/libv8/v8/src/hydrogen.h +1202 -0
- data/lib/libv8/v8/src/ia32/assembler-ia32-inl.h +446 -0
- data/lib/libv8/v8/src/ia32/assembler-ia32.cc +2487 -0
- data/lib/libv8/v8/src/ia32/assembler-ia32.h +1144 -0
- data/lib/libv8/v8/src/ia32/builtins-ia32.cc +1621 -0
- data/lib/libv8/v8/src/ia32/code-stubs-ia32.cc +6198 -0
- data/lib/libv8/v8/src/ia32/code-stubs-ia32.h +517 -0
- data/lib/libv8/v8/src/ia32/codegen-ia32.cc +265 -0
- data/lib/libv8/v8/src/ia32/codegen-ia32.h +79 -0
- data/lib/libv8/v8/src/ia32/cpu-ia32.cc +88 -0
- data/lib/libv8/v8/src/ia32/debug-ia32.cc +312 -0
- data/lib/libv8/v8/src/ia32/deoptimizer-ia32.cc +774 -0
- data/lib/libv8/v8/src/ia32/disasm-ia32.cc +1628 -0
- data/lib/libv8/v8/src/ia32/frames-ia32.cc +45 -0
- data/lib/libv8/v8/src/ia32/frames-ia32.h +142 -0
- data/lib/libv8/v8/src/ia32/full-codegen-ia32.cc +4338 -0
- data/lib/libv8/v8/src/ia32/ic-ia32.cc +1597 -0
- data/lib/libv8/v8/src/ia32/lithium-codegen-ia32.cc +4461 -0
- data/lib/libv8/v8/src/ia32/lithium-codegen-ia32.h +375 -0
- data/lib/libv8/v8/src/ia32/lithium-gap-resolver-ia32.cc +475 -0
- data/lib/libv8/v8/src/ia32/lithium-gap-resolver-ia32.h +110 -0
- data/lib/libv8/v8/src/ia32/lithium-ia32.cc +2261 -0
- data/lib/libv8/v8/src/ia32/lithium-ia32.h +2396 -0
- data/lib/libv8/v8/src/ia32/macro-assembler-ia32.cc +2136 -0
- data/lib/libv8/v8/src/ia32/macro-assembler-ia32.h +775 -0
- data/lib/libv8/v8/src/ia32/regexp-macro-assembler-ia32.cc +1263 -0
- data/lib/libv8/v8/src/ia32/regexp-macro-assembler-ia32.h +216 -0
- data/lib/libv8/v8/src/ia32/simulator-ia32.cc +30 -0
- data/lib/libv8/v8/src/ia32/simulator-ia32.h +74 -0
- data/lib/libv8/v8/src/ia32/stub-cache-ia32.cc +3847 -0
- data/lib/libv8/v8/src/ic-inl.h +130 -0
- data/lib/libv8/v8/src/ic.cc +2577 -0
- data/lib/libv8/v8/src/ic.h +736 -0
- data/lib/libv8/v8/src/inspector.cc +63 -0
- data/lib/libv8/v8/src/inspector.h +62 -0
- data/lib/libv8/v8/src/interpreter-irregexp.cc +659 -0
- data/lib/libv8/v8/src/interpreter-irregexp.h +49 -0
- data/lib/libv8/v8/src/isolate-inl.h +50 -0
- data/lib/libv8/v8/src/isolate.cc +1869 -0
- data/lib/libv8/v8/src/isolate.h +1382 -0
- data/lib/libv8/v8/src/json-parser.cc +504 -0
- data/lib/libv8/v8/src/json-parser.h +161 -0
- data/lib/libv8/v8/src/json.js +342 -0
- data/lib/libv8/v8/src/jsregexp.cc +5385 -0
- data/lib/libv8/v8/src/jsregexp.h +1492 -0
- data/lib/libv8/v8/src/list-inl.h +212 -0
- data/lib/libv8/v8/src/list.h +174 -0
- data/lib/libv8/v8/src/lithium-allocator-inl.h +142 -0
- data/lib/libv8/v8/src/lithium-allocator.cc +2123 -0
- data/lib/libv8/v8/src/lithium-allocator.h +630 -0
- data/lib/libv8/v8/src/lithium.cc +190 -0
- data/lib/libv8/v8/src/lithium.h +597 -0
- data/lib/libv8/v8/src/liveedit-debugger.js +1082 -0
- data/lib/libv8/v8/src/liveedit.cc +1691 -0
- data/lib/libv8/v8/src/liveedit.h +180 -0
- data/lib/libv8/v8/src/liveobjectlist-inl.h +126 -0
- data/lib/libv8/v8/src/liveobjectlist.cc +2589 -0
- data/lib/libv8/v8/src/liveobjectlist.h +322 -0
- data/lib/libv8/v8/src/log-inl.h +59 -0
- data/lib/libv8/v8/src/log-utils.cc +428 -0
- data/lib/libv8/v8/src/log-utils.h +231 -0
- data/lib/libv8/v8/src/log.cc +1993 -0
- data/lib/libv8/v8/src/log.h +476 -0
- data/lib/libv8/v8/src/macro-assembler.h +120 -0
- data/lib/libv8/v8/src/macros.py +178 -0
- data/lib/libv8/v8/src/mark-compact.cc +3143 -0
- data/lib/libv8/v8/src/mark-compact.h +506 -0
- data/lib/libv8/v8/src/math.js +264 -0
- data/lib/libv8/v8/src/messages.cc +179 -0
- data/lib/libv8/v8/src/messages.h +113 -0
- data/lib/libv8/v8/src/messages.js +1096 -0
- data/lib/libv8/v8/src/mips/assembler-mips-inl.h +312 -0
- data/lib/libv8/v8/src/mips/assembler-mips.cc +1960 -0
- data/lib/libv8/v8/src/mips/assembler-mips.h +1138 -0
- data/lib/libv8/v8/src/mips/builtins-mips.cc +1628 -0
- data/lib/libv8/v8/src/mips/code-stubs-mips.cc +6656 -0
- data/lib/libv8/v8/src/mips/code-stubs-mips.h +682 -0
- data/lib/libv8/v8/src/mips/codegen-mips.cc +52 -0
- data/lib/libv8/v8/src/mips/codegen-mips.h +98 -0
- data/lib/libv8/v8/src/mips/constants-mips.cc +352 -0
- data/lib/libv8/v8/src/mips/constants-mips.h +739 -0
- data/lib/libv8/v8/src/mips/cpu-mips.cc +96 -0
- data/lib/libv8/v8/src/mips/debug-mips.cc +308 -0
- data/lib/libv8/v8/src/mips/deoptimizer-mips.cc +91 -0
- data/lib/libv8/v8/src/mips/disasm-mips.cc +1050 -0
- data/lib/libv8/v8/src/mips/frames-mips.cc +47 -0
- data/lib/libv8/v8/src/mips/frames-mips.h +219 -0
- data/lib/libv8/v8/src/mips/full-codegen-mips.cc +4388 -0
- data/lib/libv8/v8/src/mips/ic-mips.cc +1580 -0
- data/lib/libv8/v8/src/mips/lithium-codegen-mips.h +65 -0
- data/lib/libv8/v8/src/mips/lithium-mips.h +307 -0
- data/lib/libv8/v8/src/mips/macro-assembler-mips.cc +4056 -0
- data/lib/libv8/v8/src/mips/macro-assembler-mips.h +1214 -0
- data/lib/libv8/v8/src/mips/regexp-macro-assembler-mips.cc +1251 -0
- data/lib/libv8/v8/src/mips/regexp-macro-assembler-mips.h +252 -0
- data/lib/libv8/v8/src/mips/simulator-mips.cc +2621 -0
- data/lib/libv8/v8/src/mips/simulator-mips.h +401 -0
- data/lib/libv8/v8/src/mips/stub-cache-mips.cc +4285 -0
- data/lib/libv8/v8/src/mirror-debugger.js +2382 -0
- data/lib/libv8/v8/src/mksnapshot.cc +328 -0
- data/lib/libv8/v8/src/natives.h +64 -0
- data/lib/libv8/v8/src/objects-debug.cc +738 -0
- data/lib/libv8/v8/src/objects-inl.h +4323 -0
- data/lib/libv8/v8/src/objects-printer.cc +829 -0
- data/lib/libv8/v8/src/objects-visiting.cc +148 -0
- data/lib/libv8/v8/src/objects-visiting.h +424 -0
- data/lib/libv8/v8/src/objects.cc +10585 -0
- data/lib/libv8/v8/src/objects.h +6838 -0
- data/lib/libv8/v8/src/parser.cc +4997 -0
- data/lib/libv8/v8/src/parser.h +765 -0
- data/lib/libv8/v8/src/platform-cygwin.cc +779 -0
- data/lib/libv8/v8/src/platform-freebsd.cc +826 -0
- data/lib/libv8/v8/src/platform-linux.cc +1149 -0
- data/lib/libv8/v8/src/platform-macos.cc +830 -0
- data/lib/libv8/v8/src/platform-nullos.cc +479 -0
- data/lib/libv8/v8/src/platform-openbsd.cc +640 -0
- data/lib/libv8/v8/src/platform-posix.cc +424 -0
- data/lib/libv8/v8/src/platform-solaris.cc +762 -0
- data/lib/libv8/v8/src/platform-tls-mac.h +62 -0
- data/lib/libv8/v8/src/platform-tls-win32.h +62 -0
- data/lib/libv8/v8/src/platform-tls.h +50 -0
- data/lib/libv8/v8/src/platform-win32.cc +2021 -0
- data/lib/libv8/v8/src/platform.h +667 -0
- data/lib/libv8/v8/src/preparse-data-format.h +62 -0
- data/lib/libv8/v8/src/preparse-data.cc +183 -0
- data/lib/libv8/v8/src/preparse-data.h +225 -0
- data/lib/libv8/v8/src/preparser-api.cc +220 -0
- data/lib/libv8/v8/src/preparser.cc +1450 -0
- data/lib/libv8/v8/src/preparser.h +493 -0
- data/lib/libv8/v8/src/prettyprinter.cc +1493 -0
- data/lib/libv8/v8/src/prettyprinter.h +223 -0
- data/lib/libv8/v8/src/profile-generator-inl.h +128 -0
- data/lib/libv8/v8/src/profile-generator.cc +3098 -0
- data/lib/libv8/v8/src/profile-generator.h +1126 -0
- data/lib/libv8/v8/src/property.cc +105 -0
- data/lib/libv8/v8/src/property.h +365 -0
- data/lib/libv8/v8/src/proxy.js +83 -0
- data/lib/libv8/v8/src/regexp-macro-assembler-irregexp-inl.h +78 -0
- data/lib/libv8/v8/src/regexp-macro-assembler-irregexp.cc +471 -0
- data/lib/libv8/v8/src/regexp-macro-assembler-irregexp.h +142 -0
- data/lib/libv8/v8/src/regexp-macro-assembler-tracer.cc +373 -0
- data/lib/libv8/v8/src/regexp-macro-assembler-tracer.h +104 -0
- data/lib/libv8/v8/src/regexp-macro-assembler.cc +267 -0
- data/lib/libv8/v8/src/regexp-macro-assembler.h +243 -0
- data/lib/libv8/v8/src/regexp-stack.cc +111 -0
- data/lib/libv8/v8/src/regexp-stack.h +147 -0
- data/lib/libv8/v8/src/regexp.js +483 -0
- data/lib/libv8/v8/src/rewriter.cc +360 -0
- data/lib/libv8/v8/src/rewriter.h +50 -0
- data/lib/libv8/v8/src/runtime-profiler.cc +489 -0
- data/lib/libv8/v8/src/runtime-profiler.h +201 -0
- data/lib/libv8/v8/src/runtime.cc +12227 -0
- data/lib/libv8/v8/src/runtime.h +652 -0
- data/lib/libv8/v8/src/runtime.js +649 -0
- data/lib/libv8/v8/src/safepoint-table.cc +256 -0
- data/lib/libv8/v8/src/safepoint-table.h +270 -0
- data/lib/libv8/v8/src/scanner-base.cc +952 -0
- data/lib/libv8/v8/src/scanner-base.h +670 -0
- data/lib/libv8/v8/src/scanner.cc +345 -0
- data/lib/libv8/v8/src/scanner.h +146 -0
- data/lib/libv8/v8/src/scopeinfo.cc +646 -0
- data/lib/libv8/v8/src/scopeinfo.h +254 -0
- data/lib/libv8/v8/src/scopes.cc +1150 -0
- data/lib/libv8/v8/src/scopes.h +507 -0
- data/lib/libv8/v8/src/serialize.cc +1574 -0
- data/lib/libv8/v8/src/serialize.h +589 -0
- data/lib/libv8/v8/src/shell.h +55 -0
- data/lib/libv8/v8/src/simulator.h +43 -0
- data/lib/libv8/v8/src/small-pointer-list.h +163 -0
- data/lib/libv8/v8/src/smart-pointer.h +109 -0
- data/lib/libv8/v8/src/snapshot-common.cc +83 -0
- data/lib/libv8/v8/src/snapshot-empty.cc +54 -0
- data/lib/libv8/v8/src/snapshot.h +91 -0
- data/lib/libv8/v8/src/spaces-inl.h +529 -0
- data/lib/libv8/v8/src/spaces.cc +3145 -0
- data/lib/libv8/v8/src/spaces.h +2369 -0
- data/lib/libv8/v8/src/splay-tree-inl.h +310 -0
- data/lib/libv8/v8/src/splay-tree.h +205 -0
- data/lib/libv8/v8/src/string-search.cc +41 -0
- data/lib/libv8/v8/src/string-search.h +568 -0
- data/lib/libv8/v8/src/string-stream.cc +592 -0
- data/lib/libv8/v8/src/string-stream.h +191 -0
- data/lib/libv8/v8/src/string.js +994 -0
- data/lib/libv8/v8/src/strtod.cc +440 -0
- data/lib/libv8/v8/src/strtod.h +40 -0
- data/lib/libv8/v8/src/stub-cache.cc +1965 -0
- data/lib/libv8/v8/src/stub-cache.h +924 -0
- data/lib/libv8/v8/src/third_party/valgrind/valgrind.h +3925 -0
- data/lib/libv8/v8/src/token.cc +63 -0
- data/lib/libv8/v8/src/token.h +288 -0
- data/lib/libv8/v8/src/type-info.cc +507 -0
- data/lib/libv8/v8/src/type-info.h +272 -0
- data/lib/libv8/v8/src/unbound-queue-inl.h +95 -0
- data/lib/libv8/v8/src/unbound-queue.h +69 -0
- data/lib/libv8/v8/src/unicode-inl.h +238 -0
- data/lib/libv8/v8/src/unicode.cc +1624 -0
- data/lib/libv8/v8/src/unicode.h +280 -0
- data/lib/libv8/v8/src/uri.js +408 -0
- data/lib/libv8/v8/src/utils-inl.h +48 -0
- data/lib/libv8/v8/src/utils.cc +371 -0
- data/lib/libv8/v8/src/utils.h +800 -0
- data/lib/libv8/v8/src/v8-counters.cc +62 -0
- data/lib/libv8/v8/src/v8-counters.h +314 -0
- data/lib/libv8/v8/src/v8.cc +213 -0
- data/lib/libv8/v8/src/v8.h +131 -0
- data/lib/libv8/v8/src/v8checks.h +64 -0
- data/lib/libv8/v8/src/v8dll-main.cc +44 -0
- data/lib/libv8/v8/src/v8globals.h +512 -0
- data/lib/libv8/v8/src/v8memory.h +82 -0
- data/lib/libv8/v8/src/v8natives.js +1310 -0
- data/lib/libv8/v8/src/v8preparserdll-main.cc +39 -0
- data/lib/libv8/v8/src/v8threads.cc +464 -0
- data/lib/libv8/v8/src/v8threads.h +165 -0
- data/lib/libv8/v8/src/v8utils.h +319 -0
- data/lib/libv8/v8/src/variables.cc +114 -0
- data/lib/libv8/v8/src/variables.h +167 -0
- data/lib/libv8/v8/src/version.cc +116 -0
- data/lib/libv8/v8/src/version.h +68 -0
- data/lib/libv8/v8/src/vm-state-inl.h +138 -0
- data/lib/libv8/v8/src/vm-state.h +71 -0
- data/lib/libv8/v8/src/win32-headers.h +96 -0
- data/lib/libv8/v8/src/x64/assembler-x64-inl.h +462 -0
- data/lib/libv8/v8/src/x64/assembler-x64.cc +3027 -0
- data/lib/libv8/v8/src/x64/assembler-x64.h +1633 -0
- data/lib/libv8/v8/src/x64/builtins-x64.cc +1520 -0
- data/lib/libv8/v8/src/x64/code-stubs-x64.cc +5132 -0
- data/lib/libv8/v8/src/x64/code-stubs-x64.h +514 -0
- data/lib/libv8/v8/src/x64/codegen-x64.cc +146 -0
- data/lib/libv8/v8/src/x64/codegen-x64.h +76 -0
- data/lib/libv8/v8/src/x64/cpu-x64.cc +88 -0
- data/lib/libv8/v8/src/x64/debug-x64.cc +319 -0
- data/lib/libv8/v8/src/x64/deoptimizer-x64.cc +815 -0
- data/lib/libv8/v8/src/x64/disasm-x64.cc +1832 -0
- data/lib/libv8/v8/src/x64/frames-x64.cc +45 -0
- data/lib/libv8/v8/src/x64/frames-x64.h +130 -0
- data/lib/libv8/v8/src/x64/full-codegen-x64.cc +4318 -0
- data/lib/libv8/v8/src/x64/ic-x64.cc +1608 -0
- data/lib/libv8/v8/src/x64/lithium-codegen-x64.cc +4267 -0
- data/lib/libv8/v8/src/x64/lithium-codegen-x64.h +367 -0
- data/lib/libv8/v8/src/x64/lithium-gap-resolver-x64.cc +320 -0
- data/lib/libv8/v8/src/x64/lithium-gap-resolver-x64.h +74 -0
- data/lib/libv8/v8/src/x64/lithium-x64.cc +2202 -0
- data/lib/libv8/v8/src/x64/lithium-x64.h +2333 -0
- data/lib/libv8/v8/src/x64/macro-assembler-x64.cc +3745 -0
- data/lib/libv8/v8/src/x64/macro-assembler-x64.h +1290 -0
- data/lib/libv8/v8/src/x64/regexp-macro-assembler-x64.cc +1398 -0
- data/lib/libv8/v8/src/x64/regexp-macro-assembler-x64.h +282 -0
- data/lib/libv8/v8/src/x64/simulator-x64.cc +27 -0
- data/lib/libv8/v8/src/x64/simulator-x64.h +72 -0
- data/lib/libv8/v8/src/x64/stub-cache-x64.cc +3610 -0
- data/lib/libv8/v8/src/zone-inl.h +140 -0
- data/lib/libv8/v8/src/zone.cc +196 -0
- data/lib/libv8/v8/src/zone.h +240 -0
- data/lib/libv8/v8/tools/codemap.js +265 -0
- data/lib/libv8/v8/tools/consarray.js +93 -0
- data/lib/libv8/v8/tools/csvparser.js +78 -0
- data/lib/libv8/v8/tools/disasm.py +92 -0
- data/lib/libv8/v8/tools/freebsd-tick-processor +10 -0
- data/lib/libv8/v8/tools/gc-nvp-trace-processor.py +342 -0
- data/lib/libv8/v8/tools/gcmole/README +62 -0
- data/lib/libv8/v8/tools/gcmole/gccause.lua +60 -0
- data/lib/libv8/v8/tools/gcmole/gcmole.cc +1261 -0
- data/lib/libv8/v8/tools/gcmole/gcmole.lua +378 -0
- data/lib/libv8/v8/tools/generate-ten-powers.scm +286 -0
- data/lib/libv8/v8/tools/grokdump.py +841 -0
- data/lib/libv8/v8/tools/gyp/v8.gyp +995 -0
- data/lib/libv8/v8/tools/js2c.py +364 -0
- data/lib/libv8/v8/tools/jsmin.py +280 -0
- data/lib/libv8/v8/tools/linux-tick-processor +35 -0
- data/lib/libv8/v8/tools/ll_prof.py +942 -0
- data/lib/libv8/v8/tools/logreader.js +185 -0
- data/lib/libv8/v8/tools/mac-nm +18 -0
- data/lib/libv8/v8/tools/mac-tick-processor +6 -0
- data/lib/libv8/v8/tools/oom_dump/README +31 -0
- data/lib/libv8/v8/tools/oom_dump/SConstruct +42 -0
- data/lib/libv8/v8/tools/oom_dump/oom_dump.cc +288 -0
- data/lib/libv8/v8/tools/presubmit.py +305 -0
- data/lib/libv8/v8/tools/process-heap-prof.py +120 -0
- data/lib/libv8/v8/tools/profile.js +751 -0
- data/lib/libv8/v8/tools/profile_view.js +219 -0
- data/lib/libv8/v8/tools/run-valgrind.py +77 -0
- data/lib/libv8/v8/tools/splaytree.js +316 -0
- data/lib/libv8/v8/tools/stats-viewer.py +468 -0
- data/lib/libv8/v8/tools/test.py +1510 -0
- data/lib/libv8/v8/tools/tickprocessor-driver.js +59 -0
- data/lib/libv8/v8/tools/tickprocessor.js +877 -0
- data/lib/libv8/v8/tools/utils.py +96 -0
- data/lib/libv8/v8/tools/visual_studio/README.txt +12 -0
- data/lib/libv8/v8/tools/windows-tick-processor.bat +30 -0
- data/lib/libv8/version.rb +5 -0
- data/libv8.gemspec +36 -0
- 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
|