libv8 3.11.8.17 → 3.16.14.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +1 -2
- data/Gemfile +1 -1
- data/Rakefile +6 -7
- data/lib/libv8/version.rb +1 -1
- data/vendor/v8/.gitignore +24 -3
- data/vendor/v8/AUTHORS +7 -0
- data/vendor/v8/ChangeLog +839 -0
- data/vendor/v8/DEPS +1 -1
- data/vendor/v8/Makefile.android +92 -0
- data/vendor/v8/OWNERS +11 -0
- data/vendor/v8/PRESUBMIT.py +71 -0
- data/vendor/v8/SConstruct +34 -39
- data/vendor/v8/build/android.gypi +56 -37
- data/vendor/v8/build/common.gypi +112 -30
- data/vendor/v8/build/gyp_v8 +1 -1
- data/vendor/v8/build/standalone.gypi +15 -11
- data/vendor/v8/include/v8-debug.h +9 -1
- data/vendor/v8/include/v8-preparser.h +4 -3
- data/vendor/v8/include/v8-profiler.h +25 -25
- data/vendor/v8/include/v8-testing.h +4 -3
- data/vendor/v8/include/v8.h +994 -540
- data/vendor/v8/preparser/preparser-process.cc +3 -3
- data/vendor/v8/samples/lineprocessor.cc +20 -27
- data/vendor/v8/samples/process.cc +18 -14
- data/vendor/v8/samples/shell.cc +16 -15
- data/vendor/v8/src/SConscript +15 -14
- data/vendor/v8/src/accessors.cc +169 -77
- data/vendor/v8/src/accessors.h +4 -0
- data/vendor/v8/src/allocation-inl.h +2 -2
- data/vendor/v8/src/allocation.h +7 -7
- data/vendor/v8/src/api.cc +810 -497
- data/vendor/v8/src/api.h +85 -60
- data/vendor/v8/src/arm/assembler-arm-inl.h +179 -22
- data/vendor/v8/src/arm/assembler-arm.cc +633 -264
- data/vendor/v8/src/arm/assembler-arm.h +264 -197
- data/vendor/v8/src/arm/builtins-arm.cc +117 -27
- data/vendor/v8/src/arm/code-stubs-arm.cc +1241 -700
- data/vendor/v8/src/arm/code-stubs-arm.h +35 -138
- data/vendor/v8/src/arm/codegen-arm.cc +285 -16
- data/vendor/v8/src/arm/codegen-arm.h +22 -0
- data/vendor/v8/src/arm/constants-arm.cc +5 -3
- data/vendor/v8/src/arm/constants-arm.h +24 -11
- data/vendor/v8/src/arm/debug-arm.cc +3 -3
- data/vendor/v8/src/arm/deoptimizer-arm.cc +382 -92
- data/vendor/v8/src/arm/disasm-arm.cc +61 -12
- data/vendor/v8/src/arm/frames-arm.h +0 -14
- data/vendor/v8/src/arm/full-codegen-arm.cc +332 -304
- data/vendor/v8/src/arm/ic-arm.cc +180 -259
- data/vendor/v8/src/arm/lithium-arm.cc +364 -316
- data/vendor/v8/src/arm/lithium-arm.h +512 -275
- data/vendor/v8/src/arm/lithium-codegen-arm.cc +1768 -809
- data/vendor/v8/src/arm/lithium-codegen-arm.h +97 -35
- data/vendor/v8/src/arm/lithium-gap-resolver-arm.cc +12 -5
- data/vendor/v8/src/arm/macro-assembler-arm.cc +439 -228
- data/vendor/v8/src/arm/macro-assembler-arm.h +116 -70
- data/vendor/v8/src/arm/regexp-macro-assembler-arm.cc +54 -44
- data/vendor/v8/src/arm/regexp-macro-assembler-arm.h +3 -10
- data/vendor/v8/src/arm/simulator-arm.cc +272 -238
- data/vendor/v8/src/arm/simulator-arm.h +38 -8
- data/vendor/v8/src/arm/stub-cache-arm.cc +522 -895
- data/vendor/v8/src/array.js +101 -70
- data/vendor/v8/src/assembler.cc +270 -19
- data/vendor/v8/src/assembler.h +110 -15
- data/vendor/v8/src/ast.cc +79 -69
- data/vendor/v8/src/ast.h +255 -301
- data/vendor/v8/src/atomicops.h +7 -1
- data/vendor/v8/src/atomicops_internals_tsan.h +335 -0
- data/vendor/v8/src/bootstrapper.cc +481 -418
- data/vendor/v8/src/bootstrapper.h +4 -4
- data/vendor/v8/src/builtins.cc +498 -311
- data/vendor/v8/src/builtins.h +75 -47
- data/vendor/v8/src/checks.cc +2 -1
- data/vendor/v8/src/checks.h +8 -0
- data/vendor/v8/src/code-stubs-hydrogen.cc +253 -0
- data/vendor/v8/src/code-stubs.cc +249 -84
- data/vendor/v8/src/code-stubs.h +501 -169
- data/vendor/v8/src/codegen.cc +36 -18
- data/vendor/v8/src/codegen.h +25 -3
- data/vendor/v8/src/collection.js +54 -17
- data/vendor/v8/src/compilation-cache.cc +24 -16
- data/vendor/v8/src/compilation-cache.h +15 -6
- data/vendor/v8/src/compiler.cc +497 -195
- data/vendor/v8/src/compiler.h +246 -38
- data/vendor/v8/src/contexts.cc +64 -24
- data/vendor/v8/src/contexts.h +60 -29
- data/vendor/v8/src/conversions-inl.h +24 -14
- data/vendor/v8/src/conversions.h +7 -4
- data/vendor/v8/src/counters.cc +21 -12
- data/vendor/v8/src/counters.h +44 -16
- data/vendor/v8/src/cpu-profiler.h +1 -1
- data/vendor/v8/src/d8-debug.cc +2 -2
- data/vendor/v8/src/d8-readline.cc +13 -2
- data/vendor/v8/src/d8.cc +681 -273
- data/vendor/v8/src/d8.gyp +4 -4
- data/vendor/v8/src/d8.h +38 -18
- data/vendor/v8/src/d8.js +0 -617
- data/vendor/v8/src/data-flow.h +55 -0
- data/vendor/v8/src/date.js +1 -42
- data/vendor/v8/src/dateparser-inl.h +5 -1
- data/vendor/v8/src/debug-agent.cc +10 -15
- data/vendor/v8/src/debug-debugger.js +147 -149
- data/vendor/v8/src/debug.cc +323 -164
- data/vendor/v8/src/debug.h +26 -14
- data/vendor/v8/src/deoptimizer.cc +765 -290
- data/vendor/v8/src/deoptimizer.h +130 -28
- data/vendor/v8/src/disassembler.cc +10 -4
- data/vendor/v8/src/elements-kind.cc +7 -2
- data/vendor/v8/src/elements-kind.h +19 -0
- data/vendor/v8/src/elements.cc +607 -285
- data/vendor/v8/src/elements.h +36 -13
- data/vendor/v8/src/execution.cc +52 -31
- data/vendor/v8/src/execution.h +4 -4
- data/vendor/v8/src/extensions/externalize-string-extension.cc +5 -4
- data/vendor/v8/src/extensions/gc-extension.cc +5 -1
- data/vendor/v8/src/extensions/statistics-extension.cc +153 -0
- data/vendor/v8/src/{inspector.h → extensions/statistics-extension.h} +12 -23
- data/vendor/v8/src/factory.cc +101 -134
- data/vendor/v8/src/factory.h +36 -31
- data/vendor/v8/src/flag-definitions.h +102 -25
- data/vendor/v8/src/flags.cc +9 -5
- data/vendor/v8/src/frames-inl.h +10 -0
- data/vendor/v8/src/frames.cc +116 -26
- data/vendor/v8/src/frames.h +96 -12
- data/vendor/v8/src/full-codegen.cc +219 -74
- data/vendor/v8/src/full-codegen.h +63 -21
- data/vendor/v8/src/func-name-inferrer.cc +8 -7
- data/vendor/v8/src/func-name-inferrer.h +5 -3
- data/vendor/v8/src/gdb-jit.cc +71 -57
- data/vendor/v8/src/global-handles.cc +230 -101
- data/vendor/v8/src/global-handles.h +26 -27
- data/vendor/v8/src/globals.h +17 -19
- data/vendor/v8/src/handles-inl.h +59 -12
- data/vendor/v8/src/handles.cc +180 -200
- data/vendor/v8/src/handles.h +80 -11
- data/vendor/v8/src/hashmap.h +60 -40
- data/vendor/v8/src/heap-inl.h +107 -45
- data/vendor/v8/src/heap-profiler.cc +38 -19
- data/vendor/v8/src/heap-profiler.h +24 -14
- data/vendor/v8/src/heap.cc +1123 -738
- data/vendor/v8/src/heap.h +385 -146
- data/vendor/v8/src/hydrogen-instructions.cc +700 -217
- data/vendor/v8/src/hydrogen-instructions.h +1158 -472
- data/vendor/v8/src/hydrogen.cc +3319 -1662
- data/vendor/v8/src/hydrogen.h +411 -170
- data/vendor/v8/src/ia32/assembler-ia32-inl.h +46 -16
- data/vendor/v8/src/ia32/assembler-ia32.cc +131 -61
- data/vendor/v8/src/ia32/assembler-ia32.h +115 -57
- data/vendor/v8/src/ia32/builtins-ia32.cc +99 -5
- data/vendor/v8/src/ia32/code-stubs-ia32.cc +787 -495
- data/vendor/v8/src/ia32/code-stubs-ia32.h +10 -100
- data/vendor/v8/src/ia32/codegen-ia32.cc +227 -23
- data/vendor/v8/src/ia32/codegen-ia32.h +14 -0
- data/vendor/v8/src/ia32/deoptimizer-ia32.cc +428 -87
- data/vendor/v8/src/ia32/disasm-ia32.cc +28 -1
- data/vendor/v8/src/ia32/frames-ia32.h +6 -16
- data/vendor/v8/src/ia32/full-codegen-ia32.cc +280 -272
- data/vendor/v8/src/ia32/ic-ia32.cc +150 -250
- data/vendor/v8/src/ia32/lithium-codegen-ia32.cc +1600 -517
- data/vendor/v8/src/ia32/lithium-codegen-ia32.h +90 -24
- data/vendor/v8/src/ia32/lithium-gap-resolver-ia32.cc +10 -6
- data/vendor/v8/src/ia32/lithium-gap-resolver-ia32.h +2 -2
- data/vendor/v8/src/ia32/lithium-ia32.cc +405 -302
- data/vendor/v8/src/ia32/lithium-ia32.h +526 -271
- data/vendor/v8/src/ia32/macro-assembler-ia32.cc +378 -119
- data/vendor/v8/src/ia32/macro-assembler-ia32.h +62 -28
- data/vendor/v8/src/ia32/regexp-macro-assembler-ia32.cc +43 -30
- data/vendor/v8/src/ia32/regexp-macro-assembler-ia32.h +2 -10
- data/vendor/v8/src/ia32/stub-cache-ia32.cc +492 -678
- data/vendor/v8/src/ic-inl.h +9 -4
- data/vendor/v8/src/ic.cc +836 -923
- data/vendor/v8/src/ic.h +228 -247
- data/vendor/v8/src/incremental-marking-inl.h +26 -30
- data/vendor/v8/src/incremental-marking.cc +276 -248
- data/vendor/v8/src/incremental-marking.h +29 -37
- data/vendor/v8/src/interface.cc +34 -25
- data/vendor/v8/src/interface.h +69 -25
- data/vendor/v8/src/interpreter-irregexp.cc +2 -2
- data/vendor/v8/src/isolate.cc +382 -76
- data/vendor/v8/src/isolate.h +109 -56
- data/vendor/v8/src/json-parser.h +217 -104
- data/vendor/v8/src/json-stringifier.h +745 -0
- data/vendor/v8/src/json.js +10 -132
- data/vendor/v8/src/jsregexp-inl.h +106 -0
- data/vendor/v8/src/jsregexp.cc +517 -285
- data/vendor/v8/src/jsregexp.h +145 -117
- data/vendor/v8/src/list-inl.h +35 -22
- data/vendor/v8/src/list.h +46 -19
- data/vendor/v8/src/lithium-allocator-inl.h +22 -2
- data/vendor/v8/src/lithium-allocator.cc +85 -70
- data/vendor/v8/src/lithium-allocator.h +21 -39
- data/vendor/v8/src/lithium.cc +259 -5
- data/vendor/v8/src/lithium.h +131 -32
- data/vendor/v8/src/liveedit-debugger.js +52 -3
- data/vendor/v8/src/liveedit.cc +393 -113
- data/vendor/v8/src/liveedit.h +7 -3
- data/vendor/v8/src/log-utils.cc +4 -2
- data/vendor/v8/src/log.cc +170 -140
- data/vendor/v8/src/log.h +62 -11
- data/vendor/v8/src/macro-assembler.h +17 -0
- data/vendor/v8/src/macros.py +2 -0
- data/vendor/v8/src/mark-compact-inl.h +3 -23
- data/vendor/v8/src/mark-compact.cc +801 -830
- data/vendor/v8/src/mark-compact.h +154 -47
- data/vendor/v8/src/marking-thread.cc +85 -0
- data/vendor/v8/src/{inspector.cc → marking-thread.h} +32 -24
- data/vendor/v8/src/math.js +12 -18
- data/vendor/v8/src/messages.cc +18 -8
- data/vendor/v8/src/messages.js +314 -261
- data/vendor/v8/src/mips/assembler-mips-inl.h +58 -6
- data/vendor/v8/src/mips/assembler-mips.cc +92 -75
- data/vendor/v8/src/mips/assembler-mips.h +54 -60
- data/vendor/v8/src/mips/builtins-mips.cc +116 -17
- data/vendor/v8/src/mips/code-stubs-mips.cc +919 -556
- data/vendor/v8/src/mips/code-stubs-mips.h +22 -131
- data/vendor/v8/src/mips/codegen-mips.cc +281 -6
- data/vendor/v8/src/mips/codegen-mips.h +22 -0
- data/vendor/v8/src/mips/constants-mips.cc +2 -0
- data/vendor/v8/src/mips/constants-mips.h +12 -2
- data/vendor/v8/src/mips/deoptimizer-mips.cc +286 -50
- data/vendor/v8/src/mips/disasm-mips.cc +13 -0
- data/vendor/v8/src/mips/full-codegen-mips.cc +297 -284
- data/vendor/v8/src/mips/ic-mips.cc +182 -263
- data/vendor/v8/src/mips/lithium-codegen-mips.cc +1208 -556
- data/vendor/v8/src/mips/lithium-codegen-mips.h +72 -19
- data/vendor/v8/src/mips/lithium-gap-resolver-mips.cc +9 -2
- data/vendor/v8/src/mips/lithium-mips.cc +290 -302
- data/vendor/v8/src/mips/lithium-mips.h +463 -266
- data/vendor/v8/src/mips/macro-assembler-mips.cc +208 -115
- data/vendor/v8/src/mips/macro-assembler-mips.h +67 -24
- data/vendor/v8/src/mips/regexp-macro-assembler-mips.cc +40 -25
- data/vendor/v8/src/mips/regexp-macro-assembler-mips.h +3 -9
- data/vendor/v8/src/mips/simulator-mips.cc +112 -40
- data/vendor/v8/src/mips/simulator-mips.h +5 -0
- data/vendor/v8/src/mips/stub-cache-mips.cc +502 -884
- data/vendor/v8/src/mirror-debugger.js +157 -30
- data/vendor/v8/src/mksnapshot.cc +88 -14
- data/vendor/v8/src/object-observe.js +235 -0
- data/vendor/v8/src/objects-debug.cc +178 -176
- data/vendor/v8/src/objects-inl.h +1333 -486
- data/vendor/v8/src/objects-printer.cc +125 -43
- data/vendor/v8/src/objects-visiting-inl.h +578 -6
- data/vendor/v8/src/objects-visiting.cc +2 -2
- data/vendor/v8/src/objects-visiting.h +172 -79
- data/vendor/v8/src/objects.cc +3533 -2885
- data/vendor/v8/src/objects.h +1352 -1131
- data/vendor/v8/src/optimizing-compiler-thread.cc +152 -0
- data/vendor/v8/src/optimizing-compiler-thread.h +111 -0
- data/vendor/v8/src/parser.cc +390 -500
- data/vendor/v8/src/parser.h +45 -33
- data/vendor/v8/src/platform-cygwin.cc +10 -21
- data/vendor/v8/src/platform-freebsd.cc +36 -41
- data/vendor/v8/src/platform-linux.cc +160 -124
- data/vendor/v8/src/platform-macos.cc +30 -27
- data/vendor/v8/src/platform-nullos.cc +17 -1
- data/vendor/v8/src/platform-openbsd.cc +19 -50
- data/vendor/v8/src/platform-posix.cc +14 -0
- data/vendor/v8/src/platform-solaris.cc +20 -53
- data/vendor/v8/src/platform-win32.cc +49 -26
- data/vendor/v8/src/platform.h +40 -1
- data/vendor/v8/src/preparser.cc +8 -5
- data/vendor/v8/src/preparser.h +2 -2
- data/vendor/v8/src/prettyprinter.cc +16 -0
- data/vendor/v8/src/prettyprinter.h +2 -0
- data/vendor/v8/src/profile-generator-inl.h +1 -0
- data/vendor/v8/src/profile-generator.cc +209 -147
- data/vendor/v8/src/profile-generator.h +15 -12
- data/vendor/v8/src/property-details.h +46 -31
- data/vendor/v8/src/property.cc +27 -46
- data/vendor/v8/src/property.h +163 -83
- data/vendor/v8/src/proxy.js +7 -2
- data/vendor/v8/src/regexp-macro-assembler-irregexp.cc +4 -13
- data/vendor/v8/src/regexp-macro-assembler-irregexp.h +1 -2
- data/vendor/v8/src/regexp-macro-assembler-tracer.cc +1 -11
- data/vendor/v8/src/regexp-macro-assembler-tracer.h +0 -1
- data/vendor/v8/src/regexp-macro-assembler.cc +31 -14
- data/vendor/v8/src/regexp-macro-assembler.h +14 -11
- data/vendor/v8/src/regexp-stack.cc +1 -0
- data/vendor/v8/src/regexp.js +9 -8
- data/vendor/v8/src/rewriter.cc +18 -7
- data/vendor/v8/src/runtime-profiler.cc +52 -43
- data/vendor/v8/src/runtime-profiler.h +0 -25
- data/vendor/v8/src/runtime.cc +2006 -2023
- data/vendor/v8/src/runtime.h +56 -49
- data/vendor/v8/src/safepoint-table.cc +12 -18
- data/vendor/v8/src/safepoint-table.h +11 -8
- data/vendor/v8/src/scanner.cc +1 -0
- data/vendor/v8/src/scanner.h +4 -10
- data/vendor/v8/src/scopeinfo.cc +35 -9
- data/vendor/v8/src/scopeinfo.h +64 -3
- data/vendor/v8/src/scopes.cc +251 -156
- data/vendor/v8/src/scopes.h +61 -27
- data/vendor/v8/src/serialize.cc +348 -396
- data/vendor/v8/src/serialize.h +125 -114
- data/vendor/v8/src/small-pointer-list.h +11 -11
- data/vendor/v8/src/{smart-array-pointer.h → smart-pointers.h} +64 -15
- data/vendor/v8/src/snapshot-common.cc +64 -15
- data/vendor/v8/src/snapshot-empty.cc +7 -1
- data/vendor/v8/src/snapshot.h +9 -2
- data/vendor/v8/src/spaces-inl.h +17 -0
- data/vendor/v8/src/spaces.cc +477 -183
- data/vendor/v8/src/spaces.h +238 -58
- data/vendor/v8/src/splay-tree-inl.h +8 -7
- data/vendor/v8/src/splay-tree.h +24 -10
- data/vendor/v8/src/store-buffer.cc +12 -5
- data/vendor/v8/src/store-buffer.h +2 -4
- data/vendor/v8/src/string-search.h +22 -6
- data/vendor/v8/src/string-stream.cc +11 -8
- data/vendor/v8/src/string.js +47 -15
- data/vendor/v8/src/stub-cache.cc +461 -224
- data/vendor/v8/src/stub-cache.h +164 -102
- data/vendor/v8/src/sweeper-thread.cc +105 -0
- data/vendor/v8/src/sweeper-thread.h +81 -0
- data/vendor/v8/src/token.h +1 -0
- data/vendor/v8/src/transitions-inl.h +220 -0
- data/vendor/v8/src/transitions.cc +160 -0
- data/vendor/v8/src/transitions.h +207 -0
- data/vendor/v8/src/type-info.cc +182 -181
- data/vendor/v8/src/type-info.h +31 -19
- data/vendor/v8/src/unicode-inl.h +62 -106
- data/vendor/v8/src/unicode.cc +57 -67
- data/vendor/v8/src/unicode.h +45 -91
- data/vendor/v8/src/uri.js +57 -29
- data/vendor/v8/src/utils.h +105 -5
- data/vendor/v8/src/v8-counters.cc +54 -11
- data/vendor/v8/src/v8-counters.h +134 -19
- data/vendor/v8/src/v8.cc +29 -29
- data/vendor/v8/src/v8.h +1 -0
- data/vendor/v8/src/v8conversions.cc +26 -22
- data/vendor/v8/src/v8globals.h +56 -43
- data/vendor/v8/src/v8natives.js +83 -30
- data/vendor/v8/src/v8threads.cc +42 -21
- data/vendor/v8/src/v8threads.h +4 -1
- data/vendor/v8/src/v8utils.cc +9 -93
- data/vendor/v8/src/v8utils.h +37 -33
- data/vendor/v8/src/variables.cc +6 -3
- data/vendor/v8/src/variables.h +6 -13
- data/vendor/v8/src/version.cc +2 -2
- data/vendor/v8/src/vm-state-inl.h +11 -0
- data/vendor/v8/src/x64/assembler-x64-inl.h +39 -8
- data/vendor/v8/src/x64/assembler-x64.cc +78 -64
- data/vendor/v8/src/x64/assembler-x64.h +38 -33
- data/vendor/v8/src/x64/builtins-x64.cc +105 -7
- data/vendor/v8/src/x64/code-stubs-x64.cc +790 -413
- data/vendor/v8/src/x64/code-stubs-x64.h +10 -106
- data/vendor/v8/src/x64/codegen-x64.cc +210 -8
- data/vendor/v8/src/x64/codegen-x64.h +20 -1
- data/vendor/v8/src/x64/deoptimizer-x64.cc +336 -75
- data/vendor/v8/src/x64/disasm-x64.cc +15 -0
- data/vendor/v8/src/x64/frames-x64.h +0 -14
- data/vendor/v8/src/x64/full-codegen-x64.cc +293 -270
- data/vendor/v8/src/x64/ic-x64.cc +153 -251
- data/vendor/v8/src/x64/lithium-codegen-x64.cc +1379 -531
- data/vendor/v8/src/x64/lithium-codegen-x64.h +67 -23
- data/vendor/v8/src/x64/lithium-gap-resolver-x64.cc +2 -2
- data/vendor/v8/src/x64/lithium-x64.cc +349 -289
- data/vendor/v8/src/x64/lithium-x64.h +460 -250
- data/vendor/v8/src/x64/macro-assembler-x64.cc +350 -177
- data/vendor/v8/src/x64/macro-assembler-x64.h +67 -49
- data/vendor/v8/src/x64/regexp-macro-assembler-x64.cc +46 -33
- data/vendor/v8/src/x64/regexp-macro-assembler-x64.h +2 -3
- data/vendor/v8/src/x64/stub-cache-x64.cc +484 -653
- data/vendor/v8/src/zone-inl.h +9 -27
- data/vendor/v8/src/zone.cc +5 -5
- data/vendor/v8/src/zone.h +53 -27
- data/vendor/v8/test/benchmarks/testcfg.py +5 -0
- data/vendor/v8/test/cctest/cctest.cc +4 -0
- data/vendor/v8/test/cctest/cctest.gyp +3 -1
- data/vendor/v8/test/cctest/cctest.h +57 -9
- data/vendor/v8/test/cctest/cctest.status +15 -15
- data/vendor/v8/test/cctest/test-accessors.cc +26 -0
- data/vendor/v8/test/cctest/test-alloc.cc +22 -30
- data/vendor/v8/test/cctest/test-api.cc +1943 -314
- data/vendor/v8/test/cctest/test-assembler-arm.cc +133 -13
- data/vendor/v8/test/cctest/test-assembler-ia32.cc +1 -1
- data/vendor/v8/test/cctest/test-assembler-mips.cc +12 -0
- data/vendor/v8/test/cctest/test-ast.cc +4 -2
- data/vendor/v8/test/cctest/test-compiler.cc +61 -29
- data/vendor/v8/test/cctest/test-dataflow.cc +2 -2
- data/vendor/v8/test/cctest/test-debug.cc +212 -33
- data/vendor/v8/test/cctest/test-decls.cc +257 -11
- data/vendor/v8/test/cctest/test-dictionary.cc +24 -10
- data/vendor/v8/test/cctest/test-disasm-arm.cc +118 -1
- data/vendor/v8/test/cctest/test-disasm-ia32.cc +3 -2
- data/vendor/v8/test/cctest/test-flags.cc +14 -1
- data/vendor/v8/test/cctest/test-func-name-inference.cc +7 -4
- data/vendor/v8/test/cctest/test-global-object.cc +51 -0
- data/vendor/v8/test/cctest/test-hashing.cc +32 -23
- data/vendor/v8/test/cctest/test-heap-profiler.cc +131 -77
- data/vendor/v8/test/cctest/test-heap.cc +1084 -143
- data/vendor/v8/test/cctest/test-list.cc +1 -1
- data/vendor/v8/test/cctest/test-liveedit.cc +3 -2
- data/vendor/v8/test/cctest/test-lockers.cc +12 -13
- data/vendor/v8/test/cctest/test-log.cc +10 -8
- data/vendor/v8/test/cctest/test-macro-assembler-x64.cc +2 -2
- data/vendor/v8/test/cctest/test-mark-compact.cc +44 -22
- data/vendor/v8/test/cctest/test-object-observe.cc +434 -0
- data/vendor/v8/test/cctest/test-parsing.cc +86 -39
- data/vendor/v8/test/cctest/test-platform-linux.cc +6 -0
- data/vendor/v8/test/cctest/test-platform-win32.cc +7 -0
- data/vendor/v8/test/cctest/test-random.cc +5 -4
- data/vendor/v8/test/cctest/test-regexp.cc +137 -101
- data/vendor/v8/test/cctest/test-serialize.cc +150 -230
- data/vendor/v8/test/cctest/test-sockets.cc +1 -1
- data/vendor/v8/test/cctest/test-spaces.cc +139 -0
- data/vendor/v8/test/cctest/test-strings.cc +736 -74
- data/vendor/v8/test/cctest/test-thread-termination.cc +10 -11
- data/vendor/v8/test/cctest/test-threads.cc +4 -4
- data/vendor/v8/test/cctest/test-utils.cc +16 -0
- data/vendor/v8/test/cctest/test-weakmaps.cc +7 -3
- data/vendor/v8/test/cctest/testcfg.py +64 -5
- data/vendor/v8/test/es5conform/testcfg.py +5 -0
- data/vendor/v8/test/message/message.status +1 -1
- data/vendor/v8/test/message/overwritten-builtins.out +3 -0
- data/vendor/v8/test/message/testcfg.py +89 -8
- data/vendor/v8/test/message/try-catch-finally-no-message.out +26 -26
- data/vendor/v8/test/mjsunit/accessor-map-sharing.js +18 -2
- data/vendor/v8/test/mjsunit/allocation-site-info.js +126 -0
- data/vendor/v8/test/mjsunit/array-bounds-check-removal.js +62 -1
- data/vendor/v8/test/mjsunit/array-iteration.js +1 -1
- data/vendor/v8/test/mjsunit/array-literal-transitions.js +2 -0
- data/vendor/v8/test/mjsunit/array-natives-elements.js +317 -0
- data/vendor/v8/test/mjsunit/array-reduce.js +8 -8
- data/vendor/v8/test/mjsunit/array-slice.js +12 -0
- data/vendor/v8/test/mjsunit/array-store-and-grow.js +4 -1
- data/vendor/v8/test/mjsunit/assert-opt-and-deopt.js +1 -1
- data/vendor/v8/test/mjsunit/bugs/bug-2337.js +53 -0
- data/vendor/v8/test/mjsunit/compare-known-objects-slow.js +69 -0
- data/vendor/v8/test/mjsunit/compiler/alloc-object-huge.js +3 -1
- data/vendor/v8/test/mjsunit/compiler/inline-accessors.js +368 -0
- data/vendor/v8/test/mjsunit/compiler/inline-arguments.js +87 -1
- data/vendor/v8/test/mjsunit/compiler/inline-closures.js +49 -0
- data/vendor/v8/test/mjsunit/compiler/inline-construct.js +55 -43
- data/vendor/v8/test/mjsunit/compiler/inline-literals.js +39 -0
- data/vendor/v8/test/mjsunit/compiler/multiply-add.js +69 -0
- data/vendor/v8/test/mjsunit/compiler/optimized-closures.js +57 -0
- data/vendor/v8/test/mjsunit/compiler/parallel-proto-change.js +44 -0
- data/vendor/v8/test/mjsunit/compiler/property-static.js +69 -0
- data/vendor/v8/test/mjsunit/compiler/proto-chain-constant.js +55 -0
- data/vendor/v8/test/mjsunit/compiler/proto-chain-load.js +44 -0
- data/vendor/v8/test/mjsunit/compiler/regress-gvn.js +3 -2
- data/vendor/v8/test/mjsunit/compiler/regress-or.js +6 -2
- data/vendor/v8/test/mjsunit/compiler/rotate.js +224 -0
- data/vendor/v8/test/mjsunit/compiler/uint32.js +173 -0
- data/vendor/v8/test/mjsunit/count-based-osr.js +2 -1
- data/vendor/v8/test/mjsunit/d8-os.js +3 -3
- data/vendor/v8/test/mjsunit/date-parse.js +3 -0
- data/vendor/v8/test/mjsunit/date.js +22 -0
- data/vendor/v8/test/mjsunit/debug-break-inline.js +1 -0
- data/vendor/v8/test/mjsunit/debug-evaluate-locals-optimized-double.js +22 -12
- data/vendor/v8/test/mjsunit/debug-evaluate-locals-optimized.js +21 -10
- data/vendor/v8/test/mjsunit/debug-liveedit-compile-error.js +60 -0
- data/vendor/v8/test/mjsunit/debug-liveedit-double-call.js +142 -0
- data/vendor/v8/test/mjsunit/debug-liveedit-literals.js +94 -0
- data/vendor/v8/test/mjsunit/debug-liveedit-restart-frame.js +153 -0
- data/vendor/v8/test/mjsunit/debug-multiple-breakpoints.js +1 -1
- data/vendor/v8/test/mjsunit/debug-script-breakpoints-closure.js +67 -0
- data/vendor/v8/test/mjsunit/debug-script-breakpoints-nested.js +82 -0
- data/vendor/v8/test/mjsunit/debug-script.js +4 -2
- data/vendor/v8/test/mjsunit/debug-set-variable-value.js +308 -0
- data/vendor/v8/test/mjsunit/debug-stepout-scope-part1.js +190 -0
- data/vendor/v8/test/mjsunit/debug-stepout-scope-part2.js +83 -0
- data/vendor/v8/test/mjsunit/debug-stepout-scope-part3.js +80 -0
- data/vendor/v8/test/mjsunit/debug-stepout-scope-part4.js +80 -0
- data/vendor/v8/test/mjsunit/debug-stepout-scope-part5.js +77 -0
- data/vendor/v8/test/mjsunit/debug-stepout-scope-part6.js +79 -0
- data/vendor/v8/test/mjsunit/debug-stepout-scope-part7.js +79 -0
- data/vendor/v8/test/mjsunit/{debug-stepout-scope.js → debug-stepout-scope-part8.js} +0 -189
- data/vendor/v8/test/mjsunit/delete-non-configurable.js +74 -0
- data/vendor/v8/test/mjsunit/deopt-minus-zero.js +56 -0
- data/vendor/v8/test/mjsunit/elements-kind.js +6 -4
- data/vendor/v8/test/mjsunit/elements-length-no-holey.js +33 -0
- data/vendor/v8/test/mjsunit/elements-transition-hoisting.js +46 -19
- data/vendor/v8/test/mjsunit/error-accessors.js +54 -0
- data/vendor/v8/test/mjsunit/error-constructors.js +1 -14
- data/vendor/v8/test/mjsunit/error-tostring.js +8 -0
- data/vendor/v8/test/mjsunit/eval-stack-trace.js +204 -0
- data/vendor/v8/test/mjsunit/external-array.js +364 -1
- data/vendor/v8/test/mjsunit/fast-array-length.js +37 -0
- data/vendor/v8/test/mjsunit/fast-non-keyed.js +113 -0
- data/vendor/v8/test/mjsunit/fast-prototype.js +117 -0
- data/vendor/v8/test/mjsunit/function-call.js +14 -18
- data/vendor/v8/test/mjsunit/fuzz-natives-part1.js +230 -0
- data/vendor/v8/test/mjsunit/fuzz-natives-part2.js +229 -0
- data/vendor/v8/test/mjsunit/fuzz-natives-part3.js +229 -0
- data/vendor/v8/test/mjsunit/{fuzz-natives.js → fuzz-natives-part4.js} +12 -2
- data/vendor/v8/test/mjsunit/generated-transition-stub.js +218 -0
- data/vendor/v8/test/mjsunit/greedy.js +1 -1
- data/vendor/v8/test/mjsunit/harmony/block-conflicts.js +2 -1
- data/vendor/v8/test/mjsunit/harmony/block-let-crankshaft.js +1 -1
- data/vendor/v8/test/mjsunit/harmony/collections.js +69 -11
- data/vendor/v8/test/mjsunit/harmony/debug-blockscopes.js +2 -2
- data/vendor/v8/test/mjsunit/harmony/module-linking.js +180 -3
- data/vendor/v8/test/mjsunit/harmony/module-parsing.js +31 -0
- data/vendor/v8/test/mjsunit/harmony/module-recompile.js +87 -0
- data/vendor/v8/test/mjsunit/harmony/module-resolution.js +15 -2
- data/vendor/v8/test/mjsunit/harmony/object-observe.js +1056 -0
- data/vendor/v8/test/mjsunit/harmony/proxies-json.js +178 -0
- data/vendor/v8/test/mjsunit/harmony/proxies.js +25 -10
- data/vendor/v8/test/mjsunit/json-parser-recursive.js +33 -0
- data/vendor/v8/test/mjsunit/json-stringify-recursive.js +52 -0
- data/vendor/v8/test/mjsunit/json.js +38 -2
- data/vendor/v8/test/mjsunit/json2.js +153 -0
- data/vendor/v8/test/mjsunit/limit-locals.js +5 -4
- data/vendor/v8/test/mjsunit/manual-parallel-recompile.js +79 -0
- data/vendor/v8/test/mjsunit/math-exp-precision.js +64 -0
- data/vendor/v8/test/mjsunit/math-floor-negative.js +59 -0
- data/vendor/v8/test/mjsunit/math-floor-of-div-minus-zero.js +41 -0
- data/vendor/v8/test/mjsunit/math-floor-of-div-nosudiv.js +288 -0
- data/vendor/v8/test/mjsunit/math-floor-of-div.js +81 -9
- data/vendor/v8/test/mjsunit/{math-floor.js → math-floor-part1.js} +1 -72
- data/vendor/v8/test/mjsunit/math-floor-part2.js +76 -0
- data/vendor/v8/test/mjsunit/math-floor-part3.js +78 -0
- data/vendor/v8/test/mjsunit/math-floor-part4.js +76 -0
- data/vendor/v8/test/mjsunit/mirror-object.js +43 -9
- data/vendor/v8/test/mjsunit/mjsunit.js +1 -1
- data/vendor/v8/test/mjsunit/mjsunit.status +52 -27
- data/vendor/v8/test/mjsunit/mul-exhaustive-part1.js +491 -0
- data/vendor/v8/test/mjsunit/mul-exhaustive-part10.js +470 -0
- data/vendor/v8/test/mjsunit/mul-exhaustive-part2.js +525 -0
- data/vendor/v8/test/mjsunit/mul-exhaustive-part3.js +532 -0
- data/vendor/v8/test/mjsunit/mul-exhaustive-part4.js +509 -0
- data/vendor/v8/test/mjsunit/mul-exhaustive-part5.js +505 -0
- data/vendor/v8/test/mjsunit/mul-exhaustive-part6.js +554 -0
- data/vendor/v8/test/mjsunit/mul-exhaustive-part7.js +497 -0
- data/vendor/v8/test/mjsunit/mul-exhaustive-part8.js +526 -0
- data/vendor/v8/test/mjsunit/mul-exhaustive-part9.js +533 -0
- data/vendor/v8/test/mjsunit/new-function.js +34 -0
- data/vendor/v8/test/mjsunit/numops-fuzz-part1.js +1172 -0
- data/vendor/v8/test/mjsunit/numops-fuzz-part2.js +1178 -0
- data/vendor/v8/test/mjsunit/numops-fuzz-part3.js +1178 -0
- data/vendor/v8/test/mjsunit/numops-fuzz-part4.js +1177 -0
- data/vendor/v8/test/mjsunit/object-define-property.js +107 -2
- data/vendor/v8/test/mjsunit/override-read-only-property.js +6 -4
- data/vendor/v8/test/mjsunit/packed-elements.js +2 -2
- data/vendor/v8/test/mjsunit/parse-int-float.js +4 -4
- data/vendor/v8/test/mjsunit/pixel-array-rounding.js +1 -1
- data/vendor/v8/test/mjsunit/readonly.js +228 -0
- data/vendor/v8/test/mjsunit/regexp-capture-3.js +16 -18
- data/vendor/v8/test/mjsunit/regexp-capture.js +2 -0
- data/vendor/v8/test/mjsunit/regexp-global.js +122 -0
- data/vendor/v8/test/mjsunit/regexp-results-cache.js +78 -0
- data/vendor/v8/test/mjsunit/regress/regress-1117.js +12 -3
- data/vendor/v8/test/mjsunit/regress/regress-1118.js +1 -1
- data/vendor/v8/test/mjsunit/regress/regress-115100.js +36 -0
- data/vendor/v8/test/mjsunit/regress/regress-1199637.js +1 -3
- data/vendor/v8/test/mjsunit/regress/regress-121407.js +1 -1
- data/vendor/v8/test/mjsunit/regress/regress-131923.js +30 -0
- data/vendor/v8/test/mjsunit/regress/regress-131994.js +70 -0
- data/vendor/v8/test/mjsunit/regress/regress-133211.js +35 -0
- data/vendor/v8/test/mjsunit/regress/regress-133211b.js +39 -0
- data/vendor/v8/test/mjsunit/regress/regress-136048.js +34 -0
- data/vendor/v8/test/mjsunit/regress/regress-137768.js +73 -0
- data/vendor/v8/test/mjsunit/regress/regress-143967.js +34 -0
- data/vendor/v8/test/mjsunit/regress/regress-145201.js +107 -0
- data/vendor/v8/test/mjsunit/regress/regress-147497.js +45 -0
- data/vendor/v8/test/mjsunit/regress/regress-148378.js +38 -0
- data/vendor/v8/test/mjsunit/regress/regress-1563.js +1 -1
- data/vendor/v8/test/mjsunit/regress/regress-1591.js +48 -0
- data/vendor/v8/test/mjsunit/regress/regress-164442.js +45 -0
- data/vendor/v8/test/mjsunit/regress/regress-165637.js +61 -0
- data/vendor/v8/test/mjsunit/regress/regress-166379.js +39 -0
- data/vendor/v8/test/mjsunit/regress/regress-166553.js +33 -0
- data/vendor/v8/test/mjsunit/regress/regress-1692.js +1 -1
- data/vendor/v8/test/mjsunit/regress/regress-171641.js +40 -0
- data/vendor/v8/test/mjsunit/regress/regress-1980.js +1 -1
- data/vendor/v8/test/mjsunit/regress/regress-2073.js +99 -0
- data/vendor/v8/test/mjsunit/regress/regress-2119.js +36 -0
- data/vendor/v8/test/mjsunit/regress/regress-2156.js +39 -0
- data/vendor/v8/test/mjsunit/regress/regress-2163.js +70 -0
- data/vendor/v8/test/mjsunit/regress/regress-2170.js +58 -0
- data/vendor/v8/test/mjsunit/regress/regress-2172.js +35 -0
- data/vendor/v8/test/mjsunit/regress/regress-2185-2.js +145 -0
- data/vendor/v8/test/mjsunit/regress/regress-2185.js +38 -0
- data/vendor/v8/test/mjsunit/regress/regress-2186.js +49 -0
- data/vendor/v8/test/mjsunit/regress/regress-2193.js +58 -0
- data/vendor/v8/test/mjsunit/regress/regress-2219.js +32 -0
- data/vendor/v8/test/mjsunit/regress/regress-2225.js +65 -0
- data/vendor/v8/test/mjsunit/regress/regress-2226.js +36 -0
- data/vendor/v8/test/mjsunit/regress/regress-2234.js +41 -0
- data/vendor/v8/test/mjsunit/regress/regress-2243.js +31 -0
- data/vendor/v8/test/mjsunit/regress/regress-2249.js +33 -0
- data/vendor/v8/test/mjsunit/regress/regress-2250.js +68 -0
- data/vendor/v8/test/mjsunit/regress/regress-2261.js +113 -0
- data/vendor/v8/test/mjsunit/regress/regress-2263.js +30 -0
- data/vendor/v8/test/mjsunit/regress/regress-2284.js +32 -0
- data/vendor/v8/test/mjsunit/regress/regress-2285.js +32 -0
- data/vendor/v8/test/mjsunit/regress/regress-2286.js +32 -0
- data/vendor/v8/test/mjsunit/regress/regress-2289.js +34 -0
- data/vendor/v8/test/mjsunit/regress/regress-2291.js +36 -0
- data/vendor/v8/test/mjsunit/regress/regress-2294.js +70 -0
- data/vendor/v8/test/mjsunit/regress/regress-2296.js +40 -0
- data/vendor/v8/test/mjsunit/regress/regress-2315.js +40 -0
- data/vendor/v8/test/mjsunit/regress/regress-2318.js +66 -0
- data/vendor/v8/test/mjsunit/regress/regress-2322.js +36 -0
- data/vendor/v8/test/mjsunit/regress/regress-2326.js +54 -0
- data/vendor/v8/test/mjsunit/regress/regress-2336.js +53 -0
- data/vendor/v8/test/mjsunit/regress/regress-2339.js +59 -0
- data/vendor/v8/test/mjsunit/regress/regress-2346.js +123 -0
- data/vendor/v8/test/mjsunit/regress/regress-2373.js +29 -0
- data/vendor/v8/test/mjsunit/regress/regress-2374.js +33 -0
- data/vendor/v8/test/mjsunit/regress/regress-2398.js +41 -0
- data/vendor/v8/test/mjsunit/regress/regress-2410.js +36 -0
- data/vendor/v8/test/mjsunit/regress/regress-2416.js +75 -0
- data/vendor/v8/test/mjsunit/regress/regress-2419.js +37 -0
- data/vendor/v8/test/mjsunit/regress/regress-2433.js +36 -0
- data/vendor/v8/test/mjsunit/regress/regress-2437.js +156 -0
- data/vendor/v8/test/mjsunit/regress/regress-2438.js +52 -0
- data/vendor/v8/test/mjsunit/regress/regress-2443.js +129 -0
- data/vendor/v8/test/mjsunit/regress/regress-2444.js +120 -0
- data/vendor/v8/test/mjsunit/regress/regress-2489.js +50 -0
- data/vendor/v8/test/mjsunit/regress/regress-2499.js +40 -0
- data/vendor/v8/test/mjsunit/regress/regress-334.js +1 -1
- data/vendor/v8/test/mjsunit/regress/regress-492.js +39 -1
- data/vendor/v8/test/mjsunit/regress/regress-builtin-array-op.js +38 -0
- data/vendor/v8/test/mjsunit/regress/regress-cnlt-elements.js +43 -0
- data/vendor/v8/test/mjsunit/regress/regress-cnlt-enum-indices.js +45 -0
- data/vendor/v8/test/mjsunit/regress/regress-cntl-descriptors-enum.js +46 -0
- data/vendor/v8/test/mjsunit/regress/regress-convert-enum.js +60 -0
- data/vendor/v8/test/mjsunit/regress/regress-convert-enum2.js +46 -0
- data/vendor/v8/test/mjsunit/regress/regress-convert-transition.js +40 -0
- data/vendor/v8/test/mjsunit/regress/regress-crbug-119926.js +3 -1
- data/vendor/v8/test/mjsunit/regress/regress-crbug-125148.js +90 -0
- data/vendor/v8/test/mjsunit/regress/regress-crbug-134055.js +63 -0
- data/vendor/v8/test/mjsunit/regress/regress-crbug-134609.js +59 -0
- data/vendor/v8/test/mjsunit/regress/regress-crbug-135008.js +45 -0
- data/vendor/v8/test/mjsunit/regress/regress-crbug-135066.js +55 -0
- data/vendor/v8/test/mjsunit/regress/regress-crbug-137689.js +47 -0
- data/vendor/v8/test/mjsunit/regress/regress-crbug-138887.js +48 -0
- data/vendor/v8/test/mjsunit/regress/regress-crbug-140083.js +44 -0
- data/vendor/v8/test/mjsunit/regress/regress-crbug-142087.js +38 -0
- data/vendor/v8/test/mjsunit/regress/regress-crbug-142218.js +44 -0
- data/vendor/v8/test/mjsunit/regress/regress-crbug-145961.js +39 -0
- data/vendor/v8/test/mjsunit/regress/regress-crbug-146910.js +33 -0
- data/vendor/v8/test/mjsunit/regress/regress-crbug-147475.js +48 -0
- data/vendor/v8/test/mjsunit/regress/regress-crbug-148376.js +35 -0
- data/vendor/v8/test/mjsunit/regress/regress-crbug-150545.js +53 -0
- data/vendor/v8/test/mjsunit/regress/regress-crbug-150729.js +39 -0
- data/vendor/v8/test/mjsunit/regress/regress-crbug-157019.js +54 -0
- data/vendor/v8/test/mjsunit/regress/regress-crbug-157520.js +38 -0
- data/vendor/v8/test/mjsunit/regress/regress-crbug-158185.js +39 -0
- data/vendor/v8/test/mjsunit/regress/regress-crbug-160010.js +35 -0
- data/vendor/v8/test/mjsunit/regress/regress-crbug-162085.js +71 -0
- data/vendor/v8/test/mjsunit/regress/regress-crbug-168545.js +34 -0
- data/vendor/v8/test/mjsunit/regress/regress-crbug-170856.js +33 -0
- data/vendor/v8/test/mjsunit/regress/regress-crbug-172345.js +34 -0
- data/vendor/v8/test/mjsunit/regress/regress-crbug-173974.js +36 -0
- data/vendor/v8/test/mjsunit/regress/regress-crbug-18639.js +9 -5
- data/vendor/v8/test/mjsunit/regress/regress-debug-code-recompilation.js +2 -1
- data/vendor/v8/test/mjsunit/regress/regress-deep-proto.js +45 -0
- data/vendor/v8/test/mjsunit/regress/regress-delete-empty-double.js +40 -0
- data/vendor/v8/test/mjsunit/regress/regress-iteration-order.js +42 -0
- data/vendor/v8/test/mjsunit/regress/regress-json-stringify-gc.js +41 -0
- data/vendor/v8/test/mjsunit/regress/regress-latin-1.js +78 -0
- data/vendor/v8/test/mjsunit/regress/regress-load-elements.js +49 -0
- data/vendor/v8/test/mjsunit/regress/regress-observe-empty-double-array.js +38 -0
- data/vendor/v8/test/mjsunit/regress/regress-undefined-store-keyed-fast-element.js +37 -0
- data/vendor/v8/test/mjsunit/shift-for-integer-div.js +59 -0
- data/vendor/v8/test/mjsunit/stack-traces-gc.js +119 -0
- data/vendor/v8/test/mjsunit/stack-traces-overflow.js +122 -0
- data/vendor/v8/test/mjsunit/stack-traces.js +39 -1
- data/vendor/v8/test/mjsunit/str-to-num.js +7 -2
- data/vendor/v8/test/mjsunit/strict-mode.js +36 -11
- data/vendor/v8/test/mjsunit/string-charcodeat.js +3 -0
- data/vendor/v8/test/mjsunit/string-natives.js +72 -0
- data/vendor/v8/test/mjsunit/string-split.js +17 -0
- data/vendor/v8/test/mjsunit/testcfg.py +76 -6
- data/vendor/v8/test/mjsunit/tools/tickprocessor.js +4 -1
- data/vendor/v8/test/mjsunit/try-finally-continue.js +72 -0
- data/vendor/v8/test/mjsunit/typed-array-slice.js +61 -0
- data/vendor/v8/test/mjsunit/unbox-double-arrays.js +2 -0
- data/vendor/v8/test/mjsunit/uri.js +12 -0
- data/vendor/v8/test/mjsunit/with-readonly.js +4 -2
- data/vendor/v8/test/mozilla/mozilla.status +19 -113
- data/vendor/v8/test/mozilla/testcfg.py +122 -3
- data/vendor/v8/test/preparser/preparser.status +5 -0
- data/vendor/v8/test/preparser/strict-identifiers.pyt +1 -1
- data/vendor/v8/test/preparser/testcfg.py +101 -5
- data/vendor/v8/test/sputnik/sputnik.status +1 -1
- data/vendor/v8/test/sputnik/testcfg.py +5 -0
- data/vendor/v8/test/test262/README +2 -2
- data/vendor/v8/test/test262/test262.status +13 -36
- data/vendor/v8/test/test262/testcfg.py +102 -8
- data/vendor/v8/tools/android-build.sh +0 -0
- data/vendor/v8/tools/android-ll-prof.sh +69 -0
- data/vendor/v8/tools/android-run.py +109 -0
- data/vendor/v8/tools/android-sync.sh +105 -0
- data/vendor/v8/tools/bash-completion.sh +0 -0
- data/vendor/v8/tools/check-static-initializers.sh +0 -0
- data/vendor/v8/tools/common-includes.sh +15 -22
- data/vendor/v8/tools/disasm.py +4 -4
- data/vendor/v8/tools/fuzz-harness.sh +0 -0
- data/vendor/v8/tools/gen-postmortem-metadata.py +6 -8
- data/vendor/v8/tools/grokdump.py +404 -129
- data/vendor/v8/tools/gyp/v8.gyp +105 -43
- data/vendor/v8/tools/linux-tick-processor +5 -5
- data/vendor/v8/tools/ll_prof.py +75 -15
- data/vendor/v8/tools/merge-to-branch.sh +2 -2
- data/vendor/v8/tools/plot-timer-events +70 -0
- data/vendor/v8/tools/plot-timer-events.js +510 -0
- data/vendor/v8/tools/presubmit.py +1 -0
- data/vendor/v8/tools/push-to-trunk.sh +14 -4
- data/vendor/v8/tools/run-llprof.sh +69 -0
- data/vendor/v8/tools/run-tests.py +372 -0
- data/vendor/v8/tools/run-valgrind.py +1 -1
- data/vendor/v8/tools/status-file-converter.py +39 -0
- data/vendor/v8/tools/test-server.py +224 -0
- data/vendor/v8/tools/test-wrapper-gypbuild.py +13 -16
- data/vendor/v8/tools/test.py +10 -19
- data/vendor/v8/tools/testrunner/README +174 -0
- data/vendor/v8/tools/testrunner/__init__.py +26 -0
- data/vendor/v8/tools/testrunner/local/__init__.py +26 -0
- data/vendor/v8/tools/testrunner/local/commands.py +153 -0
- data/vendor/v8/tools/testrunner/local/execution.py +182 -0
- data/vendor/v8/tools/testrunner/local/old_statusfile.py +460 -0
- data/vendor/v8/tools/testrunner/local/progress.py +238 -0
- data/vendor/v8/tools/testrunner/local/statusfile.py +145 -0
- data/vendor/v8/tools/testrunner/local/testsuite.py +187 -0
- data/vendor/v8/tools/testrunner/local/utils.py +108 -0
- data/vendor/v8/tools/testrunner/local/verbose.py +99 -0
- data/vendor/v8/tools/testrunner/network/__init__.py +26 -0
- data/vendor/v8/tools/testrunner/network/distro.py +90 -0
- data/vendor/v8/tools/testrunner/network/endpoint.py +124 -0
- data/vendor/v8/tools/testrunner/network/network_execution.py +253 -0
- data/vendor/v8/tools/testrunner/network/perfdata.py +120 -0
- data/vendor/v8/tools/testrunner/objects/__init__.py +26 -0
- data/vendor/v8/tools/testrunner/objects/context.py +50 -0
- data/vendor/v8/tools/testrunner/objects/output.py +60 -0
- data/vendor/v8/tools/testrunner/objects/peer.py +80 -0
- data/vendor/v8/tools/testrunner/objects/testcase.py +83 -0
- data/vendor/v8/tools/testrunner/objects/workpacket.py +90 -0
- data/vendor/v8/tools/testrunner/server/__init__.py +26 -0
- data/vendor/v8/tools/testrunner/server/compression.py +111 -0
- data/vendor/v8/tools/testrunner/server/constants.py +51 -0
- data/vendor/v8/tools/testrunner/server/daemon.py +147 -0
- data/vendor/v8/tools/testrunner/server/local_handler.py +119 -0
- data/vendor/v8/tools/testrunner/server/main.py +245 -0
- data/vendor/v8/tools/testrunner/server/presence_handler.py +120 -0
- data/vendor/v8/tools/testrunner/server/signatures.py +63 -0
- data/vendor/v8/tools/testrunner/server/status_handler.py +112 -0
- data/vendor/v8/tools/testrunner/server/work_handler.py +150 -0
- data/vendor/v8/tools/tick-processor.html +168 -0
- data/vendor/v8/tools/tickprocessor-driver.js +5 -3
- data/vendor/v8/tools/tickprocessor.js +58 -15
- metadata +534 -30
- data/patches/add-freebsd9-and-freebsd10-to-gyp-GetFlavor.patch +0 -11
- data/patches/do-not-imply-vfp3-and-armv7.patch +0 -44
- data/patches/fPIC-on-x64.patch +0 -14
- data/vendor/v8/src/liveobjectlist-inl.h +0 -126
- data/vendor/v8/src/liveobjectlist.cc +0 -2631
- data/vendor/v8/src/liveobjectlist.h +0 -319
- data/vendor/v8/test/mjsunit/mul-exhaustive.js +0 -4629
- data/vendor/v8/test/mjsunit/numops-fuzz.js +0 -4609
- data/vendor/v8/test/mjsunit/regress/regress-1969.js +0 -5045
data/vendor/v8/src/scopes.h
CHANGED
@@ -40,7 +40,7 @@ class CompilationInfo;
|
|
40
40
|
// A hash map to support fast variable declaration and lookup.
|
41
41
|
class VariableMap: public ZoneHashMap {
|
42
42
|
public:
|
43
|
-
VariableMap();
|
43
|
+
explicit VariableMap(Zone* zone);
|
44
44
|
|
45
45
|
virtual ~VariableMap();
|
46
46
|
|
@@ -53,6 +53,11 @@ class VariableMap: public ZoneHashMap {
|
|
53
53
|
Interface* interface = Interface::NewValue());
|
54
54
|
|
55
55
|
Variable* Lookup(Handle<String> name);
|
56
|
+
|
57
|
+
Zone* zone() const { return zone_; }
|
58
|
+
|
59
|
+
private:
|
60
|
+
Zone* zone_;
|
56
61
|
};
|
57
62
|
|
58
63
|
|
@@ -62,14 +67,19 @@ class VariableMap: public ZoneHashMap {
|
|
62
67
|
// and setup time for scopes that don't need them.
|
63
68
|
class DynamicScopePart : public ZoneObject {
|
64
69
|
public:
|
70
|
+
explicit DynamicScopePart(Zone* zone) {
|
71
|
+
for (int i = 0; i < 3; i++)
|
72
|
+
maps_[i] = new(zone->New(sizeof(VariableMap))) VariableMap(zone);
|
73
|
+
}
|
74
|
+
|
65
75
|
VariableMap* GetMap(VariableMode mode) {
|
66
76
|
int index = mode - DYNAMIC;
|
67
77
|
ASSERT(index >= 0 && index < 3);
|
68
|
-
return
|
78
|
+
return maps_[index];
|
69
79
|
}
|
70
80
|
|
71
81
|
private:
|
72
|
-
VariableMap maps_[3];
|
82
|
+
VariableMap *maps_[3];
|
73
83
|
};
|
74
84
|
|
75
85
|
|
@@ -87,14 +97,15 @@ class Scope: public ZoneObject {
|
|
87
97
|
// ---------------------------------------------------------------------------
|
88
98
|
// Construction
|
89
99
|
|
90
|
-
Scope(Scope* outer_scope, ScopeType type);
|
100
|
+
Scope(Scope* outer_scope, ScopeType type, Zone* zone);
|
91
101
|
|
92
102
|
// Compute top scope and allocate variables. For lazy compilation the top
|
93
103
|
// scope only contains the single lazily compiled function, so this
|
94
104
|
// doesn't re-allocate variables repeatedly.
|
95
105
|
static bool Analyze(CompilationInfo* info);
|
96
106
|
|
97
|
-
static Scope* DeserializeScopeChain(Context* context, Scope* global_scope
|
107
|
+
static Scope* DeserializeScopeChain(Context* context, Scope* global_scope,
|
108
|
+
Zone* zone);
|
98
109
|
|
99
110
|
// The scope name is only used for printing/debugging.
|
100
111
|
void SetScopeName(Handle<String> scope_name) { scope_name_ = scope_name; }
|
@@ -106,6 +117,8 @@ class Scope: public ZoneObject {
|
|
106
117
|
// tree and its children are reparented.
|
107
118
|
Scope* FinalizeBlockScope();
|
108
119
|
|
120
|
+
Zone* zone() const { return zone_; }
|
121
|
+
|
109
122
|
// ---------------------------------------------------------------------------
|
110
123
|
// Declarations
|
111
124
|
|
@@ -147,21 +160,21 @@ class Scope: public ZoneObject {
|
|
147
160
|
// global scope. The variable was introduced (possibly from an inner
|
148
161
|
// scope) by a reference to an unresolved variable with no intervening
|
149
162
|
// with statements or eval calls.
|
150
|
-
Variable*
|
163
|
+
Variable* DeclareDynamicGlobal(Handle<String> name);
|
151
164
|
|
152
165
|
// Create a new unresolved variable.
|
153
166
|
template<class Visitor>
|
154
167
|
VariableProxy* NewUnresolved(AstNodeFactory<Visitor>* factory,
|
155
168
|
Handle<String> name,
|
156
|
-
|
157
|
-
|
169
|
+
Interface* interface = Interface::NewValue(),
|
170
|
+
int position = RelocInfo::kNoPosition) {
|
158
171
|
// Note that we must not share the unresolved variables with
|
159
172
|
// the same name because they may be removed selectively via
|
160
173
|
// RemoveUnresolved().
|
161
174
|
ASSERT(!already_resolved());
|
162
175
|
VariableProxy* proxy =
|
163
|
-
factory->NewVariableProxy(name, false,
|
164
|
-
unresolved_.Add(proxy);
|
176
|
+
factory->NewVariableProxy(name, false, interface, position);
|
177
|
+
unresolved_.Add(proxy, zone_);
|
165
178
|
return proxy;
|
166
179
|
}
|
167
180
|
|
@@ -173,10 +186,16 @@ class Scope: public ZoneObject {
|
|
173
186
|
// such a variable again if it was added; otherwise this is a no-op.
|
174
187
|
void RemoveUnresolved(VariableProxy* var);
|
175
188
|
|
176
|
-
// Creates a new
|
189
|
+
// Creates a new internal variable in this scope. The name is only used
|
177
190
|
// for printing and cannot be used to find the variable. In particular,
|
178
191
|
// the only way to get hold of the temporary is by keeping the Variable*
|
179
192
|
// around.
|
193
|
+
Variable* NewInternal(Handle<String> name);
|
194
|
+
|
195
|
+
// Creates a new temporary variable in this scope. The name is only used
|
196
|
+
// for printing and cannot be used to find the variable. In particular,
|
197
|
+
// the only way to get hold of the temporary is by keeping the Variable*
|
198
|
+
// around. The name should not clash with a legitimate variable names.
|
180
199
|
Variable* NewTemporary(Handle<String> name);
|
181
200
|
|
182
201
|
// Adds the specific declaration node to the list of declarations in
|
@@ -205,11 +224,6 @@ class Scope: public ZoneObject {
|
|
205
224
|
// scope over a let binding of the same name.
|
206
225
|
Declaration* CheckConflictingVarDeclarations();
|
207
226
|
|
208
|
-
// For harmony block scoping mode: Check if the scope has variable proxies
|
209
|
-
// that are used as lvalues and point to const variables. Assumes that scopes
|
210
|
-
// have been analyzed and variables been resolved.
|
211
|
-
VariableProxy* CheckAssignmentToConst();
|
212
|
-
|
213
227
|
// ---------------------------------------------------------------------------
|
214
228
|
// Scope-specific info.
|
215
229
|
|
@@ -267,7 +281,8 @@ class Scope: public ZoneObject {
|
|
267
281
|
bool is_block_scope() const { return type_ == BLOCK_SCOPE; }
|
268
282
|
bool is_with_scope() const { return type_ == WITH_SCOPE; }
|
269
283
|
bool is_declaration_scope() const {
|
270
|
-
return is_eval_scope() || is_function_scope() ||
|
284
|
+
return is_eval_scope() || is_function_scope() ||
|
285
|
+
is_module_scope() || is_global_scope();
|
271
286
|
}
|
272
287
|
bool is_classic_mode() const {
|
273
288
|
return language_mode() == CLASSIC_MODE;
|
@@ -355,26 +370,33 @@ class Scope: public ZoneObject {
|
|
355
370
|
int StackLocalCount() const;
|
356
371
|
int ContextLocalCount() const;
|
357
372
|
|
373
|
+
// For global scopes, the number of module literals (including nested ones).
|
374
|
+
int num_modules() const { return num_modules_; }
|
375
|
+
|
376
|
+
// For module scopes, the host scope's internal variable binding this module.
|
377
|
+
Variable* module_var() const { return module_var_; }
|
378
|
+
|
358
379
|
// Make sure this scope and all outer scopes are eagerly compiled.
|
359
380
|
void ForceEagerCompilation() { force_eager_compilation_ = true; }
|
360
381
|
|
361
382
|
// Determine if we can use lazy compilation for this scope.
|
362
383
|
bool AllowsLazyCompilation() const;
|
363
384
|
|
364
|
-
//
|
365
|
-
bool
|
385
|
+
// Determine if we can use lazy compilation for this scope without a context.
|
386
|
+
bool AllowsLazyCompilationWithoutContext() const;
|
366
387
|
|
367
|
-
// True if the outer context of this scope is always the
|
388
|
+
// True if the outer context of this scope is always the native context.
|
368
389
|
bool HasTrivialOuterContext() const;
|
369
390
|
|
370
|
-
// True if
|
371
|
-
|
372
|
-
// invisible during scope info deserialization.
|
373
|
-
bool TrivialDeclarationScopesBeforeWithScope() const;
|
391
|
+
// True if the outer context allows lazy compilation of this scope.
|
392
|
+
bool HasLazyCompilableOuterContext() const;
|
374
393
|
|
375
394
|
// The number of contexts between this and scope; zero if this == scope.
|
376
395
|
int ContextChainLength(Scope* scope);
|
377
396
|
|
397
|
+
// Find the innermost global scope.
|
398
|
+
Scope* GlobalScope();
|
399
|
+
|
378
400
|
// Find the first function, global, or eval scope. This is the scope
|
379
401
|
// where var declarations will be hoisted to in the implementation.
|
380
402
|
Scope* DeclarationScope();
|
@@ -429,6 +451,8 @@ class Scope: public ZoneObject {
|
|
429
451
|
// variables may be implicitly 'declared' by being used (possibly in
|
430
452
|
// an inner scope) with no intervening with statements or eval calls.
|
431
453
|
VariableMap variables_;
|
454
|
+
// Compiler-allocated (user-invisible) internals.
|
455
|
+
ZoneList<Variable*> internals_;
|
432
456
|
// Compiler-allocated (user-invisible) temporaries.
|
433
457
|
ZoneList<Variable*> temps_;
|
434
458
|
// Parameter list in source order.
|
@@ -482,6 +506,12 @@ class Scope: public ZoneObject {
|
|
482
506
|
int num_stack_slots_;
|
483
507
|
int num_heap_slots_;
|
484
508
|
|
509
|
+
// The number of modules (including nested ones).
|
510
|
+
int num_modules_;
|
511
|
+
|
512
|
+
// For module scopes, the host scope's internal variable binding this module.
|
513
|
+
Variable* module_var_;
|
514
|
+
|
485
515
|
// Serialized scope info support.
|
486
516
|
Handle<ScopeInfo> scope_info_;
|
487
517
|
bool already_resolved() { return already_resolved_; }
|
@@ -566,6 +596,7 @@ class Scope: public ZoneObject {
|
|
566
596
|
void AllocateNonParameterLocal(Variable* var);
|
567
597
|
void AllocateNonParameterLocals();
|
568
598
|
void AllocateVariablesRecursively();
|
599
|
+
void AllocateModulesRecursively(Scope* host_scope);
|
569
600
|
|
570
601
|
// Resolve and fill in the allocation information for all variables
|
571
602
|
// in this scopes. Must be called *after* all scopes have been
|
@@ -581,14 +612,15 @@ class Scope: public ZoneObject {
|
|
581
612
|
|
582
613
|
private:
|
583
614
|
// Construct a scope based on the scope info.
|
584
|
-
Scope(Scope* inner_scope, ScopeType type, Handle<ScopeInfo> scope_info
|
615
|
+
Scope(Scope* inner_scope, ScopeType type, Handle<ScopeInfo> scope_info,
|
616
|
+
Zone* zone);
|
585
617
|
|
586
618
|
// Construct a catch scope with a binding for the name.
|
587
|
-
Scope(Scope* inner_scope, Handle<String> catch_variable_name);
|
619
|
+
Scope(Scope* inner_scope, Handle<String> catch_variable_name, Zone* zone);
|
588
620
|
|
589
621
|
void AddInnerScope(Scope* inner_scope) {
|
590
622
|
if (inner_scope != NULL) {
|
591
|
-
inner_scopes_.Add(inner_scope);
|
623
|
+
inner_scopes_.Add(inner_scope, zone_);
|
592
624
|
inner_scope->outer_scope_ = this;
|
593
625
|
}
|
594
626
|
}
|
@@ -596,6 +628,8 @@ class Scope: public ZoneObject {
|
|
596
628
|
void SetDefaults(ScopeType type,
|
597
629
|
Scope* outer_scope,
|
598
630
|
Handle<ScopeInfo> scope_info);
|
631
|
+
|
632
|
+
Zone* zone_;
|
599
633
|
};
|
600
634
|
|
601
635
|
} } // namespace v8::internal
|
data/vendor/v8/src/serialize.cc
CHANGED
@@ -30,6 +30,7 @@
|
|
30
30
|
#include "accessors.h"
|
31
31
|
#include "api.h"
|
32
32
|
#include "bootstrapper.h"
|
33
|
+
#include "deoptimizer.h"
|
33
34
|
#include "execution.h"
|
34
35
|
#include "global-handles.h"
|
35
36
|
#include "ic-inl.h"
|
@@ -37,6 +38,7 @@
|
|
37
38
|
#include "platform.h"
|
38
39
|
#include "runtime.h"
|
39
40
|
#include "serialize.h"
|
41
|
+
#include "snapshot.h"
|
40
42
|
#include "stub-cache.h"
|
41
43
|
#include "v8threads.h"
|
42
44
|
|
@@ -510,6 +512,49 @@ void ExternalReferenceTable::PopulateTable(Isolate* isolate) {
|
|
510
512
|
UNCLASSIFIED,
|
511
513
|
47,
|
512
514
|
"date_cache_stamp");
|
515
|
+
Add(ExternalReference::address_of_pending_message_obj(isolate).address(),
|
516
|
+
UNCLASSIFIED,
|
517
|
+
48,
|
518
|
+
"address_of_pending_message_obj");
|
519
|
+
Add(ExternalReference::address_of_has_pending_message(isolate).address(),
|
520
|
+
UNCLASSIFIED,
|
521
|
+
49,
|
522
|
+
"address_of_has_pending_message");
|
523
|
+
Add(ExternalReference::address_of_pending_message_script(isolate).address(),
|
524
|
+
UNCLASSIFIED,
|
525
|
+
50,
|
526
|
+
"pending_message_script");
|
527
|
+
Add(ExternalReference::get_make_code_young_function(isolate).address(),
|
528
|
+
UNCLASSIFIED,
|
529
|
+
51,
|
530
|
+
"Code::MakeCodeYoung");
|
531
|
+
Add(ExternalReference::cpu_features().address(),
|
532
|
+
UNCLASSIFIED,
|
533
|
+
52,
|
534
|
+
"cpu_features");
|
535
|
+
Add(ExternalReference::new_space_allocation_top_address(isolate).address(),
|
536
|
+
UNCLASSIFIED,
|
537
|
+
53,
|
538
|
+
"Heap::NewSpaceAllocationTopAddress");
|
539
|
+
Add(ExternalReference::new_space_allocation_limit_address(isolate).address(),
|
540
|
+
UNCLASSIFIED,
|
541
|
+
54,
|
542
|
+
"Heap::NewSpaceAllocationLimitAddress");
|
543
|
+
Add(ExternalReference(Runtime::kAllocateInNewSpace, isolate).address(),
|
544
|
+
UNCLASSIFIED,
|
545
|
+
55,
|
546
|
+
"Runtime::AllocateInNewSpace");
|
547
|
+
|
548
|
+
// Add a small set of deopt entry addresses to encoder without generating the
|
549
|
+
// deopt table code, which isn't possible at deserialization time.
|
550
|
+
HandleScope scope(Isolate::Current());
|
551
|
+
for (int entry = 0; entry < kDeoptTableSerializeEntryCount; ++entry) {
|
552
|
+
Address address = Deoptimizer::GetDeoptimizationEntry(
|
553
|
+
entry,
|
554
|
+
Deoptimizer::LAZY,
|
555
|
+
Deoptimizer::CALCULATE_ENTRY_ADDRESS);
|
556
|
+
Add(address, LAZY_DEOPTIMIZATION, 56 + entry, "lazy_deopt");
|
557
|
+
}
|
513
558
|
}
|
514
559
|
|
515
560
|
|
@@ -586,104 +631,27 @@ Deserializer::Deserializer(SnapshotByteSource* source)
|
|
586
631
|
: isolate_(NULL),
|
587
632
|
source_(source),
|
588
633
|
external_reference_decoder_(NULL) {
|
589
|
-
|
590
|
-
|
591
|
-
|
592
|
-
// This routine both allocates a new object, and also keeps
|
593
|
-
// track of where objects have been allocated so that we can
|
594
|
-
// fix back references when deserializing.
|
595
|
-
Address Deserializer::Allocate(int space_index, Space* space, int size) {
|
596
|
-
Address address;
|
597
|
-
if (!SpaceIsLarge(space_index)) {
|
598
|
-
ASSERT(!SpaceIsPaged(space_index) ||
|
599
|
-
size <= Page::kPageSize - Page::kObjectStartOffset);
|
600
|
-
MaybeObject* maybe_new_allocation;
|
601
|
-
if (space_index == NEW_SPACE) {
|
602
|
-
maybe_new_allocation =
|
603
|
-
reinterpret_cast<NewSpace*>(space)->AllocateRaw(size);
|
604
|
-
} else {
|
605
|
-
maybe_new_allocation =
|
606
|
-
reinterpret_cast<PagedSpace*>(space)->AllocateRaw(size);
|
607
|
-
}
|
608
|
-
ASSERT(!maybe_new_allocation->IsFailure());
|
609
|
-
Object* new_allocation = maybe_new_allocation->ToObjectUnchecked();
|
610
|
-
HeapObject* new_object = HeapObject::cast(new_allocation);
|
611
|
-
address = new_object->address();
|
612
|
-
high_water_[space_index] = address + size;
|
613
|
-
} else {
|
614
|
-
ASSERT(SpaceIsLarge(space_index));
|
615
|
-
LargeObjectSpace* lo_space = reinterpret_cast<LargeObjectSpace*>(space);
|
616
|
-
Object* new_allocation;
|
617
|
-
if (space_index == kLargeData || space_index == kLargeFixedArray) {
|
618
|
-
new_allocation =
|
619
|
-
lo_space->AllocateRaw(size, NOT_EXECUTABLE)->ToObjectUnchecked();
|
620
|
-
} else {
|
621
|
-
ASSERT_EQ(kLargeCode, space_index);
|
622
|
-
new_allocation =
|
623
|
-
lo_space->AllocateRaw(size, EXECUTABLE)->ToObjectUnchecked();
|
624
|
-
}
|
625
|
-
HeapObject* new_object = HeapObject::cast(new_allocation);
|
626
|
-
// Record all large objects in the same space.
|
627
|
-
address = new_object->address();
|
628
|
-
pages_[LO_SPACE].Add(address);
|
629
|
-
}
|
630
|
-
last_object_address_ = address;
|
631
|
-
return address;
|
632
|
-
}
|
633
|
-
|
634
|
-
|
635
|
-
// This returns the address of an object that has been described in the
|
636
|
-
// snapshot as being offset bytes back in a particular space.
|
637
|
-
HeapObject* Deserializer::GetAddressFromEnd(int space) {
|
638
|
-
int offset = source_->GetInt();
|
639
|
-
ASSERT(!SpaceIsLarge(space));
|
640
|
-
offset <<= kObjectAlignmentBits;
|
641
|
-
return HeapObject::FromAddress(high_water_[space] - offset);
|
642
|
-
}
|
643
|
-
|
644
|
-
|
645
|
-
// This returns the address of an object that has been described in the
|
646
|
-
// snapshot as being offset bytes into a particular space.
|
647
|
-
HeapObject* Deserializer::GetAddressFromStart(int space) {
|
648
|
-
int offset = source_->GetInt();
|
649
|
-
if (SpaceIsLarge(space)) {
|
650
|
-
// Large spaces have one object per 'page'.
|
651
|
-
return HeapObject::FromAddress(pages_[LO_SPACE][offset]);
|
634
|
+
for (int i = 0; i < LAST_SPACE + 1; i++) {
|
635
|
+
reservations_[i] = kUninitializedReservation;
|
652
636
|
}
|
653
|
-
offset <<= kObjectAlignmentBits;
|
654
|
-
if (space == NEW_SPACE) {
|
655
|
-
// New space has only one space - numbered 0.
|
656
|
-
return HeapObject::FromAddress(pages_[space][0] + offset);
|
657
|
-
}
|
658
|
-
ASSERT(SpaceIsPaged(space));
|
659
|
-
int page_of_pointee = offset >> kPageSizeBits;
|
660
|
-
Address object_address = pages_[space][page_of_pointee] +
|
661
|
-
(offset & Page::kPageAlignmentMask);
|
662
|
-
return HeapObject::FromAddress(object_address);
|
663
637
|
}
|
664
638
|
|
665
639
|
|
666
640
|
void Deserializer::Deserialize() {
|
667
641
|
isolate_ = Isolate::Current();
|
668
642
|
ASSERT(isolate_ != NULL);
|
669
|
-
|
670
|
-
AlwaysAllocateScope always_allocate;
|
671
|
-
// Don't use the free lists while deserializing.
|
672
|
-
LinearAllocationScope allocate_linearly;
|
643
|
+
isolate_->heap()->ReserveSpace(reservations_, &high_water_[0]);
|
673
644
|
// No active threads.
|
674
645
|
ASSERT_EQ(NULL, isolate_->thread_manager()->FirstThreadStateInUse());
|
675
646
|
// No active handles.
|
676
647
|
ASSERT(isolate_->handle_scope_implementer()->blocks()->is_empty());
|
677
|
-
// Make sure the entire partial snapshot cache is traversed, filling it with
|
678
|
-
// valid object pointers.
|
679
|
-
isolate_->set_serialize_partial_snapshot_cache_length(
|
680
|
-
Isolate::kPartialSnapshotCacheCapacity);
|
681
648
|
ASSERT_EQ(NULL, external_reference_decoder_);
|
682
649
|
external_reference_decoder_ = new ExternalReferenceDecoder();
|
683
650
|
isolate_->heap()->IterateStrongRoots(this, VISIT_ONLY_STRONG);
|
651
|
+
isolate_->heap()->RepairFreeListsAfterBoot();
|
684
652
|
isolate_->heap()->IterateWeakRoots(this, VISIT_ALL);
|
685
653
|
|
686
|
-
isolate_->heap()->
|
654
|
+
isolate_->heap()->set_native_contexts_list(
|
687
655
|
isolate_->heap()->undefined_value());
|
688
656
|
|
689
657
|
// Update data pointers to the external strings containing natives sources.
|
@@ -693,19 +661,33 @@ void Deserializer::Deserialize() {
|
|
693
661
|
ExternalAsciiString::cast(source)->update_data_cache();
|
694
662
|
}
|
695
663
|
}
|
664
|
+
|
665
|
+
// Issue code events for newly deserialized code objects.
|
666
|
+
LOG_CODE_EVENT(isolate_, LogCodeObjects());
|
667
|
+
LOG_CODE_EVENT(isolate_, LogCompiledFunctions());
|
696
668
|
}
|
697
669
|
|
698
670
|
|
699
671
|
void Deserializer::DeserializePartial(Object** root) {
|
700
672
|
isolate_ = Isolate::Current();
|
701
|
-
|
702
|
-
|
703
|
-
|
704
|
-
|
673
|
+
for (int i = NEW_SPACE; i < kNumberOfSpaces; i++) {
|
674
|
+
ASSERT(reservations_[i] != kUninitializedReservation);
|
675
|
+
}
|
676
|
+
isolate_->heap()->ReserveSpace(reservations_, &high_water_[0]);
|
705
677
|
if (external_reference_decoder_ == NULL) {
|
706
678
|
external_reference_decoder_ = new ExternalReferenceDecoder();
|
707
679
|
}
|
680
|
+
|
681
|
+
// Keep track of the code space start and end pointers in case new
|
682
|
+
// code objects were unserialized
|
683
|
+
OldSpace* code_space = isolate_->heap()->code_space();
|
684
|
+
Address start_address = code_space->top();
|
708
685
|
VisitPointer(root);
|
686
|
+
|
687
|
+
// There's no code deserialized here. If this assert fires
|
688
|
+
// then that's changed and logging should be added to notify
|
689
|
+
// the profiler et al of the new code.
|
690
|
+
CHECK_EQ(start_address, code_space->top());
|
709
691
|
}
|
710
692
|
|
711
693
|
|
@@ -733,10 +715,9 @@ void Deserializer::VisitPointers(Object** start, Object** end) {
|
|
733
715
|
// written very late, which means the FreeSpace map is not set up by the
|
734
716
|
// time we need to use it to mark the space at the end of a page free.
|
735
717
|
void Deserializer::ReadObject(int space_number,
|
736
|
-
Space* space,
|
737
718
|
Object** write_back) {
|
738
719
|
int size = source_->GetInt() << kObjectAlignmentBits;
|
739
|
-
Address address = Allocate(space_number,
|
720
|
+
Address address = Allocate(space_number, size);
|
740
721
|
*write_back = HeapObject::FromAddress(address);
|
741
722
|
Object** current = reinterpret_cast<Object**>(address);
|
742
723
|
Object** limit = current + (size >> kPointerSizeLog2);
|
@@ -745,44 +726,19 @@ void Deserializer::ReadObject(int space_number,
|
|
745
726
|
}
|
746
727
|
ReadChunk(current, limit, space_number, address);
|
747
728
|
#ifdef DEBUG
|
748
|
-
bool is_codespace = (
|
749
|
-
((space == HEAP->lo_space()) && (space_number == kLargeCode));
|
729
|
+
bool is_codespace = (space_number == CODE_SPACE);
|
750
730
|
ASSERT(HeapObject::FromAddress(address)->IsCode() == is_codespace);
|
751
731
|
#endif
|
752
732
|
}
|
753
733
|
|
754
|
-
|
755
|
-
// This macro is always used with a constant argument so it should all fold
|
756
|
-
// away to almost nothing in the generated code. It might be nicer to do this
|
757
|
-
// with the ternary operator but there are type issues with that.
|
758
|
-
#define ASSIGN_DEST_SPACE(space_number) \
|
759
|
-
Space* dest_space; \
|
760
|
-
if (space_number == NEW_SPACE) { \
|
761
|
-
dest_space = isolate->heap()->new_space(); \
|
762
|
-
} else if (space_number == OLD_POINTER_SPACE) { \
|
763
|
-
dest_space = isolate->heap()->old_pointer_space(); \
|
764
|
-
} else if (space_number == OLD_DATA_SPACE) { \
|
765
|
-
dest_space = isolate->heap()->old_data_space(); \
|
766
|
-
} else if (space_number == CODE_SPACE) { \
|
767
|
-
dest_space = isolate->heap()->code_space(); \
|
768
|
-
} else if (space_number == MAP_SPACE) { \
|
769
|
-
dest_space = isolate->heap()->map_space(); \
|
770
|
-
} else if (space_number == CELL_SPACE) { \
|
771
|
-
dest_space = isolate->heap()->cell_space(); \
|
772
|
-
} else { \
|
773
|
-
ASSERT(space_number >= LO_SPACE); \
|
774
|
-
dest_space = isolate->heap()->lo_space(); \
|
775
|
-
}
|
776
|
-
|
777
|
-
|
778
|
-
static const int kUnknownOffsetFromStart = -1;
|
779
|
-
|
780
|
-
|
781
734
|
void Deserializer::ReadChunk(Object** current,
|
782
735
|
Object** limit,
|
783
736
|
int source_space,
|
784
737
|
Address current_object_address) {
|
785
738
|
Isolate* const isolate = isolate_;
|
739
|
+
// Write barrier support costs around 1% in startup time. In fact there
|
740
|
+
// are no new space objects in current boot snapshots, so it's not needed,
|
741
|
+
// but that may change.
|
786
742
|
bool write_barrier_needed = (current_object_address != NULL &&
|
787
743
|
source_space != NEW_SPACE &&
|
788
744
|
source_space != CELL_SPACE &&
|
@@ -798,21 +754,19 @@ void Deserializer::ReadChunk(Object** current,
|
|
798
754
|
ASSERT((within & ~kWhereToPointMask) == 0); \
|
799
755
|
ASSERT((space_number & ~kSpaceMask) == 0);
|
800
756
|
|
801
|
-
#define CASE_BODY(where, how, within, space_number_if_any
|
757
|
+
#define CASE_BODY(where, how, within, space_number_if_any) \
|
802
758
|
{ \
|
803
759
|
bool emit_write_barrier = false; \
|
804
760
|
bool current_was_incremented = false; \
|
805
761
|
int space_number = space_number_if_any == kAnyOldSpace ? \
|
806
762
|
(data & kSpaceMask) : space_number_if_any; \
|
807
763
|
if (where == kNewObject && how == kPlain && within == kStartOfObject) {\
|
808
|
-
|
809
|
-
ReadObject(space_number, dest_space, current); \
|
764
|
+
ReadObject(space_number, current); \
|
810
765
|
emit_write_barrier = (space_number == NEW_SPACE); \
|
811
766
|
} else { \
|
812
767
|
Object* new_object = NULL; /* May not be a real Object pointer. */ \
|
813
768
|
if (where == kNewObject) { \
|
814
|
-
|
815
|
-
ReadObject(space_number, dest_space, &new_object); \
|
769
|
+
ReadObject(space_number, &new_object); \
|
816
770
|
} else if (where == kRootArray) { \
|
817
771
|
int root_id = source_->GetInt(); \
|
818
772
|
new_object = isolate->heap()->roots_array_start()[root_id]; \
|
@@ -823,6 +777,9 @@ void Deserializer::ReadChunk(Object** current,
|
|
823
777
|
[cache_index]; \
|
824
778
|
emit_write_barrier = isolate->heap()->InNewSpace(new_object); \
|
825
779
|
} else if (where == kExternalReference) { \
|
780
|
+
int skip = source_->GetInt(); \
|
781
|
+
current = reinterpret_cast<Object**>(reinterpret_cast<Address>( \
|
782
|
+
current) + skip); \
|
826
783
|
int reference_id = source_->GetInt(); \
|
827
784
|
Address address = external_reference_decoder_-> \
|
828
785
|
Decode(reference_id); \
|
@@ -831,21 +788,26 @@ void Deserializer::ReadChunk(Object** current,
|
|
831
788
|
emit_write_barrier = (space_number == NEW_SPACE); \
|
832
789
|
new_object = GetAddressFromEnd(data & kSpaceMask); \
|
833
790
|
} else { \
|
834
|
-
ASSERT(where ==
|
835
|
-
|
836
|
-
|
837
|
-
|
791
|
+
ASSERT(where == kBackrefWithSkip); \
|
792
|
+
int skip = source_->GetInt(); \
|
793
|
+
current = reinterpret_cast<Object**>( \
|
794
|
+
reinterpret_cast<Address>(current) + skip); \
|
795
|
+
emit_write_barrier = (space_number == NEW_SPACE); \
|
796
|
+
new_object = GetAddressFromEnd(data & kSpaceMask); \
|
797
|
+
} \
|
798
|
+
if (within == kInnerPointer) { \
|
799
|
+
if (space_number != CODE_SPACE || new_object->IsCode()) { \
|
800
|
+
Code* new_code_object = reinterpret_cast<Code*>(new_object); \
|
801
|
+
new_object = reinterpret_cast<Object*>( \
|
802
|
+
new_code_object->instruction_start()); \
|
838
803
|
} else { \
|
839
|
-
|
840
|
-
|
841
|
-
|
804
|
+
ASSERT(space_number == CODE_SPACE); \
|
805
|
+
JSGlobalPropertyCell* cell = \
|
806
|
+
JSGlobalPropertyCell::cast(new_object); \
|
807
|
+
new_object = reinterpret_cast<Object*>( \
|
808
|
+
cell->ValueAddress()); \
|
842
809
|
} \
|
843
810
|
} \
|
844
|
-
if (within == kFirstInstruction) { \
|
845
|
-
Code* new_code_object = reinterpret_cast<Code*>(new_object); \
|
846
|
-
new_object = reinterpret_cast<Object*>( \
|
847
|
-
new_code_object->instruction_start()); \
|
848
|
-
} \
|
849
811
|
if (how == kFromCode) { \
|
850
812
|
Address location_of_branch_data = \
|
851
813
|
reinterpret_cast<Address>(current); \
|
@@ -871,47 +833,18 @@ void Deserializer::ReadChunk(Object** current,
|
|
871
833
|
break; \
|
872
834
|
} \
|
873
835
|
|
874
|
-
// This generates a case and a body for each space. The large object spaces are
|
875
|
-
// very rare in snapshots so they are grouped in one body.
|
876
|
-
#define ONE_PER_SPACE(where, how, within) \
|
877
|
-
CASE_STATEMENT(where, how, within, NEW_SPACE) \
|
878
|
-
CASE_BODY(where, how, within, NEW_SPACE, kUnknownOffsetFromStart) \
|
879
|
-
CASE_STATEMENT(where, how, within, OLD_DATA_SPACE) \
|
880
|
-
CASE_BODY(where, how, within, OLD_DATA_SPACE, kUnknownOffsetFromStart) \
|
881
|
-
CASE_STATEMENT(where, how, within, OLD_POINTER_SPACE) \
|
882
|
-
CASE_BODY(where, how, within, OLD_POINTER_SPACE, kUnknownOffsetFromStart) \
|
883
|
-
CASE_STATEMENT(where, how, within, CODE_SPACE) \
|
884
|
-
CASE_BODY(where, how, within, CODE_SPACE, kUnknownOffsetFromStart) \
|
885
|
-
CASE_STATEMENT(where, how, within, CELL_SPACE) \
|
886
|
-
CASE_BODY(where, how, within, CELL_SPACE, kUnknownOffsetFromStart) \
|
887
|
-
CASE_STATEMENT(where, how, within, MAP_SPACE) \
|
888
|
-
CASE_BODY(where, how, within, MAP_SPACE, kUnknownOffsetFromStart) \
|
889
|
-
CASE_STATEMENT(where, how, within, kLargeData) \
|
890
|
-
CASE_STATEMENT(where, how, within, kLargeCode) \
|
891
|
-
CASE_STATEMENT(where, how, within, kLargeFixedArray) \
|
892
|
-
CASE_BODY(where, how, within, kAnyOldSpace, kUnknownOffsetFromStart)
|
893
|
-
|
894
836
|
// This generates a case and a body for the new space (which has to do extra
|
895
837
|
// write barrier handling) and handles the other spaces with 8 fall-through
|
896
838
|
// cases and one body.
|
897
839
|
#define ALL_SPACES(where, how, within) \
|
898
840
|
CASE_STATEMENT(where, how, within, NEW_SPACE) \
|
899
|
-
CASE_BODY(where, how, within, NEW_SPACE
|
841
|
+
CASE_BODY(where, how, within, NEW_SPACE) \
|
900
842
|
CASE_STATEMENT(where, how, within, OLD_DATA_SPACE) \
|
901
843
|
CASE_STATEMENT(where, how, within, OLD_POINTER_SPACE) \
|
902
844
|
CASE_STATEMENT(where, how, within, CODE_SPACE) \
|
903
845
|
CASE_STATEMENT(where, how, within, CELL_SPACE) \
|
904
846
|
CASE_STATEMENT(where, how, within, MAP_SPACE) \
|
905
|
-
|
906
|
-
CASE_STATEMENT(where, how, within, kLargeCode) \
|
907
|
-
CASE_STATEMENT(where, how, within, kLargeFixedArray) \
|
908
|
-
CASE_BODY(where, how, within, kAnyOldSpace, kUnknownOffsetFromStart)
|
909
|
-
|
910
|
-
#define ONE_PER_CODE_SPACE(where, how, within) \
|
911
|
-
CASE_STATEMENT(where, how, within, CODE_SPACE) \
|
912
|
-
CASE_BODY(where, how, within, CODE_SPACE, kUnknownOffsetFromStart) \
|
913
|
-
CASE_STATEMENT(where, how, within, kLargeCode) \
|
914
|
-
CASE_BODY(where, how, within, kLargeCode, kUnknownOffsetFromStart)
|
847
|
+
CASE_BODY(where, how, within, kAnyOldSpace)
|
915
848
|
|
916
849
|
#define FOUR_CASES(byte_code) \
|
917
850
|
case byte_code: \
|
@@ -925,14 +858,48 @@ void Deserializer::ReadChunk(Object** current,
|
|
925
858
|
FOUR_CASES(byte_code + 8) \
|
926
859
|
FOUR_CASES(byte_code + 12)
|
927
860
|
|
861
|
+
#define COMMON_RAW_LENGTHS(f) \
|
862
|
+
f(1) \
|
863
|
+
f(2) \
|
864
|
+
f(3) \
|
865
|
+
f(4) \
|
866
|
+
f(5) \
|
867
|
+
f(6) \
|
868
|
+
f(7) \
|
869
|
+
f(8) \
|
870
|
+
f(9) \
|
871
|
+
f(10) \
|
872
|
+
f(11) \
|
873
|
+
f(12) \
|
874
|
+
f(13) \
|
875
|
+
f(14) \
|
876
|
+
f(15) \
|
877
|
+
f(16) \
|
878
|
+
f(17) \
|
879
|
+
f(18) \
|
880
|
+
f(19) \
|
881
|
+
f(20) \
|
882
|
+
f(21) \
|
883
|
+
f(22) \
|
884
|
+
f(23) \
|
885
|
+
f(24) \
|
886
|
+
f(25) \
|
887
|
+
f(26) \
|
888
|
+
f(27) \
|
889
|
+
f(28) \
|
890
|
+
f(29) \
|
891
|
+
f(30) \
|
892
|
+
f(31)
|
893
|
+
|
928
894
|
// We generate 15 cases and bodies that process special tags that combine
|
929
895
|
// the raw data tag and the length into one byte.
|
930
|
-
#define RAW_CASE(index
|
931
|
-
case kRawData + index: {
|
932
|
-
byte* raw_data_out = reinterpret_cast<byte*>(current);
|
933
|
-
source_->CopyRaw(raw_data_out,
|
934
|
-
current =
|
935
|
-
|
896
|
+
#define RAW_CASE(index) \
|
897
|
+
case kRawData + index: { \
|
898
|
+
byte* raw_data_out = reinterpret_cast<byte*>(current); \
|
899
|
+
source_->CopyRaw(raw_data_out, index * kPointerSize); \
|
900
|
+
current = \
|
901
|
+
reinterpret_cast<Object**>(raw_data_out + index * kPointerSize); \
|
902
|
+
break; \
|
936
903
|
}
|
937
904
|
COMMON_RAW_LENGTHS(RAW_CASE)
|
938
905
|
#undef RAW_CASE
|
@@ -943,13 +910,24 @@ void Deserializer::ReadChunk(Object** current,
|
|
943
910
|
int size = source_->GetInt();
|
944
911
|
byte* raw_data_out = reinterpret_cast<byte*>(current);
|
945
912
|
source_->CopyRaw(raw_data_out, size);
|
946
|
-
current = reinterpret_cast<Object**>(raw_data_out + size);
|
947
913
|
break;
|
948
914
|
}
|
949
915
|
|
950
|
-
SIXTEEN_CASES(
|
951
|
-
SIXTEEN_CASES(
|
916
|
+
SIXTEEN_CASES(kRootArrayConstants + kNoSkipDistance)
|
917
|
+
SIXTEEN_CASES(kRootArrayConstants + kNoSkipDistance + 16) {
|
918
|
+
int root_id = RootArrayConstantFromByteCode(data);
|
919
|
+
Object* object = isolate->heap()->roots_array_start()[root_id];
|
920
|
+
ASSERT(!isolate->heap()->InNewSpace(object));
|
921
|
+
*current++ = object;
|
922
|
+
break;
|
923
|
+
}
|
924
|
+
|
925
|
+
SIXTEEN_CASES(kRootArrayConstants + kHasSkipDistance)
|
926
|
+
SIXTEEN_CASES(kRootArrayConstants + kHasSkipDistance + 16) {
|
952
927
|
int root_id = RootArrayConstantFromByteCode(data);
|
928
|
+
int skip = source_->GetInt();
|
929
|
+
current = reinterpret_cast<Object**>(
|
930
|
+
reinterpret_cast<intptr_t>(current) + skip);
|
953
931
|
Object* object = isolate->heap()->roots_array_start()[root_id];
|
954
932
|
ASSERT(!isolate->heap()->InNewSpace(object));
|
955
933
|
*current++ = object;
|
@@ -967,10 +945,11 @@ void Deserializer::ReadChunk(Object** current,
|
|
967
945
|
|
968
946
|
STATIC_ASSERT(kRootArrayNumberOfConstantEncodings ==
|
969
947
|
Heap::kOldSpaceRoots);
|
970
|
-
STATIC_ASSERT(kMaxRepeats ==
|
971
|
-
|
972
|
-
FOUR_CASES(kConstantRepeat +
|
973
|
-
FOUR_CASES(kConstantRepeat +
|
948
|
+
STATIC_ASSERT(kMaxRepeats == 13);
|
949
|
+
case kConstantRepeat:
|
950
|
+
FOUR_CASES(kConstantRepeat + 1)
|
951
|
+
FOUR_CASES(kConstantRepeat + 5)
|
952
|
+
FOUR_CASES(kConstantRepeat + 9) {
|
974
953
|
int repeats = RepeatsForCode(data);
|
975
954
|
Object* object = current[-1];
|
976
955
|
ASSERT(!isolate->heap()->InNewSpace(object));
|
@@ -981,98 +960,80 @@ void Deserializer::ReadChunk(Object** current,
|
|
981
960
|
|
982
961
|
// Deserialize a new object and write a pointer to it to the current
|
983
962
|
// object.
|
984
|
-
|
985
|
-
// Support for direct instruction pointers in functions
|
986
|
-
|
963
|
+
ALL_SPACES(kNewObject, kPlain, kStartOfObject)
|
964
|
+
// Support for direct instruction pointers in functions. It's an inner
|
965
|
+
// pointer because it points at the entry point, not at the start of the
|
966
|
+
// code object.
|
967
|
+
CASE_STATEMENT(kNewObject, kPlain, kInnerPointer, CODE_SPACE)
|
968
|
+
CASE_BODY(kNewObject, kPlain, kInnerPointer, CODE_SPACE)
|
987
969
|
// Deserialize a new code object and write a pointer to its first
|
988
970
|
// instruction to the current code object.
|
989
|
-
|
971
|
+
ALL_SPACES(kNewObject, kFromCode, kInnerPointer)
|
990
972
|
// Find a recently deserialized object using its offset from the current
|
991
973
|
// allocation point and write a pointer to it to the current object.
|
992
974
|
ALL_SPACES(kBackref, kPlain, kStartOfObject)
|
975
|
+
ALL_SPACES(kBackrefWithSkip, kPlain, kStartOfObject)
|
993
976
|
#if V8_TARGET_ARCH_MIPS
|
994
977
|
// Deserialize a new object from pointer found in code and write
|
995
978
|
// a pointer to it to the current object. Required only for MIPS, and
|
996
979
|
// omitted on the other architectures because it is fully unrolled and
|
997
980
|
// would cause bloat.
|
998
|
-
|
981
|
+
ALL_SPACES(kNewObject, kFromCode, kStartOfObject)
|
999
982
|
// Find a recently deserialized code object using its offset from the
|
1000
983
|
// current allocation point and write a pointer to it to the current
|
1001
984
|
// object. Required only for MIPS.
|
1002
985
|
ALL_SPACES(kBackref, kFromCode, kStartOfObject)
|
1003
|
-
|
1004
|
-
// the start and write a pointer to it to the current object.
|
1005
|
-
// Required only for MIPS.
|
1006
|
-
ALL_SPACES(kFromStart, kFromCode, kStartOfObject)
|
986
|
+
ALL_SPACES(kBackrefWithSkip, kFromCode, kStartOfObject)
|
1007
987
|
#endif
|
1008
988
|
// Find a recently deserialized code object using its offset from the
|
1009
989
|
// current allocation point and write a pointer to its first instruction
|
1010
990
|
// to the current code object or the instruction pointer in a function
|
1011
991
|
// object.
|
1012
|
-
ALL_SPACES(kBackref, kFromCode,
|
1013
|
-
ALL_SPACES(
|
1014
|
-
|
1015
|
-
|
1016
|
-
ALL_SPACES(kFromStart, kPlain, kStartOfObject)
|
1017
|
-
ALL_SPACES(kFromStart, kPlain, kFirstInstruction)
|
1018
|
-
// Find an already deserialized code object using its offset from the
|
1019
|
-
// start and write a pointer to its first instruction to the current code
|
1020
|
-
// object.
|
1021
|
-
ALL_SPACES(kFromStart, kFromCode, kFirstInstruction)
|
992
|
+
ALL_SPACES(kBackref, kFromCode, kInnerPointer)
|
993
|
+
ALL_SPACES(kBackrefWithSkip, kFromCode, kInnerPointer)
|
994
|
+
ALL_SPACES(kBackref, kPlain, kInnerPointer)
|
995
|
+
ALL_SPACES(kBackrefWithSkip, kPlain, kInnerPointer)
|
1022
996
|
// Find an object in the roots array and write a pointer to it to the
|
1023
997
|
// current object.
|
1024
998
|
CASE_STATEMENT(kRootArray, kPlain, kStartOfObject, 0)
|
1025
|
-
CASE_BODY(kRootArray, kPlain, kStartOfObject, 0
|
999
|
+
CASE_BODY(kRootArray, kPlain, kStartOfObject, 0)
|
1026
1000
|
// Find an object in the partial snapshots cache and write a pointer to it
|
1027
1001
|
// to the current object.
|
1028
1002
|
CASE_STATEMENT(kPartialSnapshotCache, kPlain, kStartOfObject, 0)
|
1029
1003
|
CASE_BODY(kPartialSnapshotCache,
|
1030
1004
|
kPlain,
|
1031
1005
|
kStartOfObject,
|
1032
|
-
0
|
1033
|
-
kUnknownOffsetFromStart)
|
1006
|
+
0)
|
1034
1007
|
// Find an code entry in the partial snapshots cache and
|
1035
1008
|
// write a pointer to it to the current object.
|
1036
|
-
CASE_STATEMENT(kPartialSnapshotCache, kPlain,
|
1009
|
+
CASE_STATEMENT(kPartialSnapshotCache, kPlain, kInnerPointer, 0)
|
1037
1010
|
CASE_BODY(kPartialSnapshotCache,
|
1038
1011
|
kPlain,
|
1039
|
-
|
1040
|
-
0
|
1041
|
-
kUnknownOffsetFromStart)
|
1012
|
+
kInnerPointer,
|
1013
|
+
0)
|
1042
1014
|
// Find an external reference and write a pointer to it to the current
|
1043
1015
|
// object.
|
1044
1016
|
CASE_STATEMENT(kExternalReference, kPlain, kStartOfObject, 0)
|
1045
1017
|
CASE_BODY(kExternalReference,
|
1046
1018
|
kPlain,
|
1047
1019
|
kStartOfObject,
|
1048
|
-
0
|
1049
|
-
kUnknownOffsetFromStart)
|
1020
|
+
0)
|
1050
1021
|
// Find an external reference and write a pointer to it in the current
|
1051
1022
|
// code object.
|
1052
1023
|
CASE_STATEMENT(kExternalReference, kFromCode, kStartOfObject, 0)
|
1053
1024
|
CASE_BODY(kExternalReference,
|
1054
1025
|
kFromCode,
|
1055
1026
|
kStartOfObject,
|
1056
|
-
0
|
1057
|
-
kUnknownOffsetFromStart)
|
1027
|
+
0)
|
1058
1028
|
|
1059
1029
|
#undef CASE_STATEMENT
|
1060
1030
|
#undef CASE_BODY
|
1061
|
-
#undef ONE_PER_SPACE
|
1062
1031
|
#undef ALL_SPACES
|
1063
|
-
#undef ASSIGN_DEST_SPACE
|
1064
|
-
|
1065
|
-
case kNewPage: {
|
1066
|
-
int space = source_->Get();
|
1067
|
-
pages_[space].Add(last_object_address_);
|
1068
|
-
if (space == CODE_SPACE) {
|
1069
|
-
CPU::FlushICache(last_object_address_, Page::kPageSize);
|
1070
|
-
}
|
1071
|
-
break;
|
1072
|
-
}
|
1073
1032
|
|
1074
1033
|
case kSkip: {
|
1075
|
-
|
1034
|
+
int size = source_->GetInt();
|
1035
|
+
current = reinterpret_cast<Object**>(
|
1036
|
+
reinterpret_cast<intptr_t>(current) + size);
|
1076
1037
|
break;
|
1077
1038
|
}
|
1078
1039
|
|
@@ -1097,18 +1058,20 @@ void Deserializer::ReadChunk(Object** current,
|
|
1097
1058
|
UNREACHABLE();
|
1098
1059
|
}
|
1099
1060
|
}
|
1100
|
-
ASSERT_EQ(
|
1061
|
+
ASSERT_EQ(limit, current);
|
1101
1062
|
}
|
1102
1063
|
|
1103
1064
|
|
1104
1065
|
void SnapshotByteSink::PutInt(uintptr_t integer, const char* description) {
|
1105
|
-
|
1106
|
-
|
1107
|
-
|
1108
|
-
|
1109
|
-
|
1110
|
-
|
1111
|
-
|
1066
|
+
ASSERT(integer < 1 << 22);
|
1067
|
+
integer <<= 2;
|
1068
|
+
int bytes = 1;
|
1069
|
+
if (integer > 0xff) bytes = 2;
|
1070
|
+
if (integer > 0xffff) bytes = 3;
|
1071
|
+
integer |= bytes;
|
1072
|
+
Put(static_cast<int>(integer & 0xff), "IntPart1");
|
1073
|
+
if (bytes > 1) Put(static_cast<int>((integer >> 8) & 0xff), "IntPart2");
|
1074
|
+
if (bytes > 2) Put(static_cast<int>((integer >> 16) & 0xff), "IntPart3");
|
1112
1075
|
}
|
1113
1076
|
|
1114
1077
|
|
@@ -1116,7 +1079,6 @@ Serializer::Serializer(SnapshotByteSink* sink)
|
|
1116
1079
|
: sink_(sink),
|
1117
1080
|
current_root_index_(0),
|
1118
1081
|
external_reference_encoder_(new ExternalReferenceEncoder),
|
1119
|
-
large_object_total_(0),
|
1120
1082
|
root_index_wave_front_(0) {
|
1121
1083
|
isolate_ = Isolate::Current();
|
1122
1084
|
// The serializer is meant to be used only to generate initial heap images
|
@@ -1149,22 +1111,7 @@ void StartupSerializer::SerializeStrongReferences() {
|
|
1149
1111
|
|
1150
1112
|
void PartialSerializer::Serialize(Object** object) {
|
1151
1113
|
this->VisitPointer(object);
|
1152
|
-
|
1153
|
-
|
1154
|
-
// After we have done the partial serialization the partial snapshot cache
|
1155
|
-
// will contain some references needed to decode the partial snapshot. We
|
1156
|
-
// fill it up with undefineds so it has a predictable length so the
|
1157
|
-
// deserialization code doesn't need to know the length.
|
1158
|
-
for (int index = isolate->serialize_partial_snapshot_cache_length();
|
1159
|
-
index < Isolate::kPartialSnapshotCacheCapacity;
|
1160
|
-
index++) {
|
1161
|
-
isolate->serialize_partial_snapshot_cache()[index] =
|
1162
|
-
isolate->heap()->undefined_value();
|
1163
|
-
startup_serializer_->VisitPointer(
|
1164
|
-
&isolate->serialize_partial_snapshot_cache()[index]);
|
1165
|
-
}
|
1166
|
-
isolate->set_serialize_partial_snapshot_cache_length(
|
1167
|
-
Isolate::kPartialSnapshotCacheCapacity);
|
1114
|
+
Pad();
|
1168
1115
|
}
|
1169
1116
|
|
1170
1117
|
|
@@ -1179,14 +1126,14 @@ void Serializer::VisitPointers(Object** start, Object** end) {
|
|
1179
1126
|
if (reinterpret_cast<Address>(current) ==
|
1180
1127
|
isolate->heap()->store_buffer()->TopAddress()) {
|
1181
1128
|
sink_->Put(kSkip, "Skip");
|
1129
|
+
sink_->PutInt(kPointerSize, "SkipOneWord");
|
1182
1130
|
} else if ((*current)->IsSmi()) {
|
1183
|
-
sink_->Put(kRawData, "
|
1184
|
-
sink_->PutInt(kPointerSize, "length");
|
1131
|
+
sink_->Put(kRawData + 1, "Smi");
|
1185
1132
|
for (int i = 0; i < kPointerSize; i++) {
|
1186
1133
|
sink_->Put(reinterpret_cast<byte*>(current)[i], "Byte");
|
1187
1134
|
}
|
1188
1135
|
} else {
|
1189
|
-
SerializeObject(*current, kPlain, kStartOfObject);
|
1136
|
+
SerializeObject(*current, kPlain, kStartOfObject, 0);
|
1190
1137
|
}
|
1191
1138
|
}
|
1192
1139
|
}
|
@@ -1194,26 +1141,29 @@ void Serializer::VisitPointers(Object** start, Object** end) {
|
|
1194
1141
|
|
1195
1142
|
// This ensures that the partial snapshot cache keeps things alive during GC and
|
1196
1143
|
// tracks their movement. When it is called during serialization of the startup
|
1197
|
-
// snapshot
|
1198
|
-
//
|
1199
|
-
//
|
1200
|
-
//
|
1201
|
-
//
|
1202
|
-
//
|
1144
|
+
// snapshot nothing happens. When the partial (context) snapshot is created,
|
1145
|
+
// this array is populated with the pointers that the partial snapshot will
|
1146
|
+
// need. As that happens we emit serialized objects to the startup snapshot
|
1147
|
+
// that correspond to the elements of this cache array. On deserialization we
|
1148
|
+
// therefore need to visit the cache array. This fills it up with pointers to
|
1149
|
+
// deserialized objects.
|
1203
1150
|
void SerializerDeserializer::Iterate(ObjectVisitor* visitor) {
|
1151
|
+
if (Serializer::enabled()) return;
|
1204
1152
|
Isolate* isolate = Isolate::Current();
|
1205
|
-
|
1206
|
-
|
1207
|
-
|
1208
|
-
|
1209
|
-
|
1210
|
-
|
1211
|
-
|
1212
|
-
|
1213
|
-
// the
|
1214
|
-
//
|
1215
|
-
|
1216
|
-
|
1153
|
+
for (int i = 0; ; i++) {
|
1154
|
+
if (isolate->serialize_partial_snapshot_cache_length() <= i) {
|
1155
|
+
// Extend the array ready to get a value from the visitor when
|
1156
|
+
// deserializing.
|
1157
|
+
isolate->PushToPartialSnapshotCache(Smi::FromInt(0));
|
1158
|
+
}
|
1159
|
+
Object** cache = isolate->serialize_partial_snapshot_cache();
|
1160
|
+
visitor->VisitPointers(&cache[i], &cache[i + 1]);
|
1161
|
+
// Sentinel is the undefined object, which is a root so it will not normally
|
1162
|
+
// be found in the cache.
|
1163
|
+
if (cache[i] == isolate->heap()->undefined_value()) {
|
1164
|
+
break;
|
1165
|
+
}
|
1166
|
+
}
|
1217
1167
|
}
|
1218
1168
|
|
1219
1169
|
|
@@ -1231,14 +1181,11 @@ int PartialSerializer::PartialSnapshotCacheIndex(HeapObject* heap_object) {
|
|
1231
1181
|
// then visit the pointer so that it becomes part of the startup snapshot
|
1232
1182
|
// and we can refer to it from the partial snapshot.
|
1233
1183
|
int length = isolate->serialize_partial_snapshot_cache_length();
|
1234
|
-
|
1235
|
-
|
1236
|
-
startup_serializer_->VisitPointer(
|
1237
|
-
&isolate->serialize_partial_snapshot_cache()[length]);
|
1184
|
+
isolate->PushToPartialSnapshotCache(heap_object);
|
1185
|
+
startup_serializer_->VisitPointer(reinterpret_cast<Object**>(&heap_object));
|
1238
1186
|
// We don't recurse from the startup snapshot generator into the partial
|
1239
1187
|
// snapshot generator.
|
1240
|
-
ASSERT(length == isolate->serialize_partial_snapshot_cache_length());
|
1241
|
-
isolate->set_serialize_partial_snapshot_cache_length(length + 1);
|
1188
|
+
ASSERT(length == isolate->serialize_partial_snapshot_cache_length() - 1);
|
1242
1189
|
return length;
|
1243
1190
|
}
|
1244
1191
|
|
@@ -1273,58 +1220,50 @@ void Serializer::SerializeReferenceToPreviousObject(
|
|
1273
1220
|
int space,
|
1274
1221
|
int address,
|
1275
1222
|
HowToCode how_to_code,
|
1276
|
-
WhereToPoint where_to_point
|
1223
|
+
WhereToPoint where_to_point,
|
1224
|
+
int skip) {
|
1277
1225
|
int offset = CurrentAllocationAddress(space) - address;
|
1278
|
-
|
1279
|
-
|
1280
|
-
|
1281
|
-
// the object is on the same page as the current allocation pointer.
|
1282
|
-
if ((CurrentAllocationAddress(space) >> kPageSizeBits) ==
|
1283
|
-
(address >> kPageSizeBits)) {
|
1284
|
-
from_start = false;
|
1285
|
-
address = offset;
|
1286
|
-
}
|
1287
|
-
} else if (space == NEW_SPACE) {
|
1288
|
-
// For new space it is always simple to encode back from current allocation.
|
1289
|
-
if (offset < address) {
|
1290
|
-
from_start = false;
|
1291
|
-
address = offset;
|
1292
|
-
}
|
1293
|
-
}
|
1294
|
-
// If we are actually dealing with real offsets (and not a numbering of
|
1295
|
-
// all objects) then we should shift out the bits that are always 0.
|
1296
|
-
if (!SpaceIsLarge(space)) address >>= kObjectAlignmentBits;
|
1297
|
-
if (from_start) {
|
1298
|
-
sink_->Put(kFromStart + how_to_code + where_to_point + space, "RefSer");
|
1299
|
-
sink_->PutInt(address, "address");
|
1300
|
-
} else {
|
1226
|
+
// Shift out the bits that are always 0.
|
1227
|
+
offset >>= kObjectAlignmentBits;
|
1228
|
+
if (skip == 0) {
|
1301
1229
|
sink_->Put(kBackref + how_to_code + where_to_point + space, "BackRefSer");
|
1302
|
-
|
1230
|
+
} else {
|
1231
|
+
sink_->Put(kBackrefWithSkip + how_to_code + where_to_point + space,
|
1232
|
+
"BackRefSerWithSkip");
|
1233
|
+
sink_->PutInt(skip, "BackRefSkipDistance");
|
1303
1234
|
}
|
1235
|
+
sink_->PutInt(offset, "offset");
|
1304
1236
|
}
|
1305
1237
|
|
1306
1238
|
|
1307
1239
|
void StartupSerializer::SerializeObject(
|
1308
1240
|
Object* o,
|
1309
1241
|
HowToCode how_to_code,
|
1310
|
-
WhereToPoint where_to_point
|
1242
|
+
WhereToPoint where_to_point,
|
1243
|
+
int skip) {
|
1311
1244
|
CHECK(o->IsHeapObject());
|
1312
1245
|
HeapObject* heap_object = HeapObject::cast(o);
|
1313
1246
|
|
1314
1247
|
int root_index;
|
1315
1248
|
if ((root_index = RootIndex(heap_object, how_to_code)) != kInvalidRootIndex) {
|
1316
|
-
PutRoot(root_index, heap_object, how_to_code, where_to_point);
|
1249
|
+
PutRoot(root_index, heap_object, how_to_code, where_to_point, skip);
|
1317
1250
|
return;
|
1318
1251
|
}
|
1319
1252
|
|
1320
1253
|
if (address_mapper_.IsMapped(heap_object)) {
|
1321
|
-
int space =
|
1254
|
+
int space = SpaceOfObject(heap_object);
|
1322
1255
|
int address = address_mapper_.MappedTo(heap_object);
|
1323
1256
|
SerializeReferenceToPreviousObject(space,
|
1324
1257
|
address,
|
1325
1258
|
how_to_code,
|
1326
|
-
where_to_point
|
1259
|
+
where_to_point,
|
1260
|
+
skip);
|
1327
1261
|
} else {
|
1262
|
+
if (skip != 0) {
|
1263
|
+
sink_->Put(kSkip, "FlushPendingSkip");
|
1264
|
+
sink_->PutInt(skip, "SkipDistance");
|
1265
|
+
}
|
1266
|
+
|
1328
1267
|
// Object has not yet been serialized. Serialize it here.
|
1329
1268
|
ObjectSerializer object_serializer(this,
|
1330
1269
|
heap_object,
|
@@ -1337,32 +1276,41 @@ void StartupSerializer::SerializeObject(
|
|
1337
1276
|
|
1338
1277
|
|
1339
1278
|
void StartupSerializer::SerializeWeakReferences() {
|
1340
|
-
|
1341
|
-
|
1342
|
-
|
1343
|
-
|
1344
|
-
|
1345
|
-
|
1279
|
+
// This phase comes right after the partial serialization (of the snapshot).
|
1280
|
+
// After we have done the partial serialization the partial snapshot cache
|
1281
|
+
// will contain some references needed to decode the partial snapshot. We
|
1282
|
+
// add one entry with 'undefined' which is the sentinel that the deserializer
|
1283
|
+
// uses to know it is done deserializing the array.
|
1284
|
+
Isolate* isolate = Isolate::Current();
|
1285
|
+
Object* undefined = isolate->heap()->undefined_value();
|
1286
|
+
VisitPointer(&undefined);
|
1346
1287
|
HEAP->IterateWeakRoots(this, VISIT_ALL);
|
1288
|
+
Pad();
|
1347
1289
|
}
|
1348
1290
|
|
1349
1291
|
|
1350
1292
|
void Serializer::PutRoot(int root_index,
|
1351
1293
|
HeapObject* object,
|
1352
1294
|
SerializerDeserializer::HowToCode how_to_code,
|
1353
|
-
SerializerDeserializer::WhereToPoint where_to_point
|
1295
|
+
SerializerDeserializer::WhereToPoint where_to_point,
|
1296
|
+
int skip) {
|
1354
1297
|
if (how_to_code == kPlain &&
|
1355
1298
|
where_to_point == kStartOfObject &&
|
1356
1299
|
root_index < kRootArrayNumberOfConstantEncodings &&
|
1357
1300
|
!HEAP->InNewSpace(object)) {
|
1358
|
-
if (
|
1359
|
-
sink_->Put(
|
1301
|
+
if (skip == 0) {
|
1302
|
+
sink_->Put(kRootArrayConstants + kNoSkipDistance + root_index,
|
1303
|
+
"RootConstant");
|
1360
1304
|
} else {
|
1361
|
-
sink_->Put(
|
1362
|
-
|
1363
|
-
|
1305
|
+
sink_->Put(kRootArrayConstants + kHasSkipDistance + root_index,
|
1306
|
+
"RootConstant");
|
1307
|
+
sink_->PutInt(skip, "SkipInPutRoot");
|
1364
1308
|
}
|
1365
1309
|
} else {
|
1310
|
+
if (skip != 0) {
|
1311
|
+
sink_->Put(kSkip, "SkipFromPutRoot");
|
1312
|
+
sink_->PutInt(skip, "SkipFromPutRootDistance");
|
1313
|
+
}
|
1366
1314
|
sink_->Put(kRootArray + how_to_code + where_to_point, "RootSerialization");
|
1367
1315
|
sink_->PutInt(root_index, "root_index");
|
1368
1316
|
}
|
@@ -1372,7 +1320,8 @@ void Serializer::PutRoot(int root_index,
|
|
1372
1320
|
void PartialSerializer::SerializeObject(
|
1373
1321
|
Object* o,
|
1374
1322
|
HowToCode how_to_code,
|
1375
|
-
WhereToPoint where_to_point
|
1323
|
+
WhereToPoint where_to_point,
|
1324
|
+
int skip) {
|
1376
1325
|
CHECK(o->IsHeapObject());
|
1377
1326
|
HeapObject* heap_object = HeapObject::cast(o);
|
1378
1327
|
|
@@ -1380,16 +1329,21 @@ void PartialSerializer::SerializeObject(
|
|
1380
1329
|
// The code-caches link to context-specific code objects, which
|
1381
1330
|
// the startup and context serializes cannot currently handle.
|
1382
1331
|
ASSERT(Map::cast(heap_object)->code_cache() ==
|
1383
|
-
heap_object->GetHeap()->
|
1332
|
+
heap_object->GetHeap()->empty_fixed_array());
|
1384
1333
|
}
|
1385
1334
|
|
1386
1335
|
int root_index;
|
1387
1336
|
if ((root_index = RootIndex(heap_object, how_to_code)) != kInvalidRootIndex) {
|
1388
|
-
PutRoot(root_index, heap_object, how_to_code, where_to_point);
|
1337
|
+
PutRoot(root_index, heap_object, how_to_code, where_to_point, skip);
|
1389
1338
|
return;
|
1390
1339
|
}
|
1391
1340
|
|
1392
1341
|
if (ShouldBeInThePartialSnapshotCache(heap_object)) {
|
1342
|
+
if (skip != 0) {
|
1343
|
+
sink_->Put(kSkip, "SkipFromSerializeObject");
|
1344
|
+
sink_->PutInt(skip, "SkipDistanceFromSerializeObject");
|
1345
|
+
}
|
1346
|
+
|
1393
1347
|
int cache_index = PartialSnapshotCacheIndex(heap_object);
|
1394
1348
|
sink_->Put(kPartialSnapshotCache + how_to_code + where_to_point,
|
1395
1349
|
"PartialSnapshotCache");
|
@@ -1406,13 +1360,18 @@ void PartialSerializer::SerializeObject(
|
|
1406
1360
|
ASSERT(!heap_object->IsSymbol());
|
1407
1361
|
|
1408
1362
|
if (address_mapper_.IsMapped(heap_object)) {
|
1409
|
-
int space =
|
1363
|
+
int space = SpaceOfObject(heap_object);
|
1410
1364
|
int address = address_mapper_.MappedTo(heap_object);
|
1411
1365
|
SerializeReferenceToPreviousObject(space,
|
1412
1366
|
address,
|
1413
1367
|
how_to_code,
|
1414
|
-
where_to_point
|
1368
|
+
where_to_point,
|
1369
|
+
skip);
|
1415
1370
|
} else {
|
1371
|
+
if (skip != 0) {
|
1372
|
+
sink_->Put(kSkip, "SkipFromSerializeObject");
|
1373
|
+
sink_->PutInt(skip, "SkipDistanceFromSerializeObject");
|
1374
|
+
}
|
1416
1375
|
// Object has not yet been serialized. Serialize it here.
|
1417
1376
|
ObjectSerializer serializer(this,
|
1418
1377
|
heap_object,
|
@@ -1436,16 +1395,11 @@ void Serializer::ObjectSerializer::Serialize() {
|
|
1436
1395
|
SnapshotPositionEvent(object_->address(), sink_->Position()));
|
1437
1396
|
|
1438
1397
|
// Mark this object as already serialized.
|
1439
|
-
|
1440
|
-
int offset = serializer_->Allocate(space, size, &start_new_page);
|
1398
|
+
int offset = serializer_->Allocate(space, size);
|
1441
1399
|
serializer_->address_mapper()->AddMapping(object_, offset);
|
1442
|
-
if (start_new_page) {
|
1443
|
-
sink_->Put(kNewPage, "NewPage");
|
1444
|
-
sink_->PutSection(space, "NewPageSpace");
|
1445
|
-
}
|
1446
1400
|
|
1447
1401
|
// Serialize the map (first word of the object).
|
1448
|
-
serializer_->SerializeObject(object_->map(), kPlain, kStartOfObject);
|
1402
|
+
serializer_->SerializeObject(object_->map(), kPlain, kStartOfObject, 0);
|
1449
1403
|
|
1450
1404
|
// Serialize the rest of the object.
|
1451
1405
|
CHECK_EQ(0, bytes_processed_so_far_);
|
@@ -1486,7 +1440,8 @@ void Serializer::ObjectSerializer::VisitPointers(Object** start,
|
|
1486
1440
|
sink_->Put(CodeForRepeats(repeat_count), "SerializeRepeats");
|
1487
1441
|
}
|
1488
1442
|
} else {
|
1489
|
-
serializer_->SerializeObject(
|
1443
|
+
serializer_->SerializeObject(
|
1444
|
+
current_contents, kPlain, kStartOfObject, 0);
|
1490
1445
|
bytes_processed_so_far_ += kPointerSize;
|
1491
1446
|
current++;
|
1492
1447
|
}
|
@@ -1498,9 +1453,10 @@ void Serializer::ObjectSerializer::VisitPointers(Object** start,
|
|
1498
1453
|
void Serializer::ObjectSerializer::VisitEmbeddedPointer(RelocInfo* rinfo) {
|
1499
1454
|
Object** current = rinfo->target_object_address();
|
1500
1455
|
|
1501
|
-
OutputRawData(rinfo->target_address_address()
|
1456
|
+
int skip = OutputRawData(rinfo->target_address_address(),
|
1457
|
+
kCanReturnSkipInsteadOfSkipping);
|
1502
1458
|
HowToCode representation = rinfo->IsCodedSpecially() ? kFromCode : kPlain;
|
1503
|
-
serializer_->SerializeObject(*current, representation, kStartOfObject);
|
1459
|
+
serializer_->SerializeObject(*current, representation, kStartOfObject, skip);
|
1504
1460
|
bytes_processed_so_far_ += rinfo->target_address_size();
|
1505
1461
|
}
|
1506
1462
|
|
@@ -1508,10 +1464,12 @@ void Serializer::ObjectSerializer::VisitEmbeddedPointer(RelocInfo* rinfo) {
|
|
1508
1464
|
void Serializer::ObjectSerializer::VisitExternalReferences(Address* start,
|
1509
1465
|
Address* end) {
|
1510
1466
|
Address references_start = reinterpret_cast<Address>(start);
|
1511
|
-
OutputRawData(references_start);
|
1467
|
+
int skip = OutputRawData(references_start, kCanReturnSkipInsteadOfSkipping);
|
1512
1468
|
|
1513
1469
|
for (Address* current = start; current < end; current++) {
|
1514
1470
|
sink_->Put(kExternalReference + kPlain + kStartOfObject, "ExternalRef");
|
1471
|
+
sink_->PutInt(skip, "SkipB4ExternalRef");
|
1472
|
+
skip = 0;
|
1515
1473
|
int reference_id = serializer_->EncodeExternalReference(*current);
|
1516
1474
|
sink_->PutInt(reference_id, "reference id");
|
1517
1475
|
}
|
@@ -1521,12 +1479,13 @@ void Serializer::ObjectSerializer::VisitExternalReferences(Address* start,
|
|
1521
1479
|
|
1522
1480
|
void Serializer::ObjectSerializer::VisitExternalReference(RelocInfo* rinfo) {
|
1523
1481
|
Address references_start = rinfo->target_address_address();
|
1524
|
-
OutputRawData(references_start);
|
1482
|
+
int skip = OutputRawData(references_start, kCanReturnSkipInsteadOfSkipping);
|
1525
1483
|
|
1526
1484
|
Address* current = rinfo->target_reference_address();
|
1527
1485
|
int representation = rinfo->IsCodedSpecially() ?
|
1528
1486
|
kFromCode + kStartOfObject : kPlain + kStartOfObject;
|
1529
1487
|
sink_->Put(kExternalReference + representation, "ExternalRef");
|
1488
|
+
sink_->PutInt(skip, "SkipB4ExternalRef");
|
1530
1489
|
int reference_id = serializer_->EncodeExternalReference(*current);
|
1531
1490
|
sink_->PutInt(reference_id, "reference id");
|
1532
1491
|
bytes_processed_so_far_ += rinfo->target_address_size();
|
@@ -1535,7 +1494,7 @@ void Serializer::ObjectSerializer::VisitExternalReference(RelocInfo* rinfo) {
|
|
1535
1494
|
|
1536
1495
|
void Serializer::ObjectSerializer::VisitRuntimeEntry(RelocInfo* rinfo) {
|
1537
1496
|
Address target_start = rinfo->target_address_address();
|
1538
|
-
OutputRawData(target_start);
|
1497
|
+
int skip = OutputRawData(target_start, kCanReturnSkipInsteadOfSkipping);
|
1539
1498
|
Address target = rinfo->target_address();
|
1540
1499
|
uint32_t encoding = serializer_->EncodeExternalReference(target);
|
1541
1500
|
CHECK(target == NULL ? encoding == 0 : encoding != 0);
|
@@ -1547,6 +1506,7 @@ void Serializer::ObjectSerializer::VisitRuntimeEntry(RelocInfo* rinfo) {
|
|
1547
1506
|
representation = kStartOfObject + kPlain;
|
1548
1507
|
}
|
1549
1508
|
sink_->Put(kExternalReference + representation, "ExternalReference");
|
1509
|
+
sink_->PutInt(skip, "SkipB4ExternalRef");
|
1550
1510
|
sink_->PutInt(encoding, "reference id");
|
1551
1511
|
bytes_processed_so_far_ += rinfo->target_address_size();
|
1552
1512
|
}
|
@@ -1555,25 +1515,27 @@ void Serializer::ObjectSerializer::VisitRuntimeEntry(RelocInfo* rinfo) {
|
|
1555
1515
|
void Serializer::ObjectSerializer::VisitCodeTarget(RelocInfo* rinfo) {
|
1556
1516
|
CHECK(RelocInfo::IsCodeTarget(rinfo->rmode()));
|
1557
1517
|
Address target_start = rinfo->target_address_address();
|
1558
|
-
OutputRawData(target_start);
|
1518
|
+
int skip = OutputRawData(target_start, kCanReturnSkipInsteadOfSkipping);
|
1559
1519
|
Code* target = Code::GetCodeFromTargetAddress(rinfo->target_address());
|
1560
|
-
serializer_->SerializeObject(target, kFromCode,
|
1520
|
+
serializer_->SerializeObject(target, kFromCode, kInnerPointer, skip);
|
1561
1521
|
bytes_processed_so_far_ += rinfo->target_address_size();
|
1562
1522
|
}
|
1563
1523
|
|
1564
1524
|
|
1565
1525
|
void Serializer::ObjectSerializer::VisitCodeEntry(Address entry_address) {
|
1566
1526
|
Code* target = Code::cast(Code::GetObjectFromEntryAddress(entry_address));
|
1567
|
-
OutputRawData(entry_address);
|
1568
|
-
serializer_->SerializeObject(target, kPlain,
|
1527
|
+
int skip = OutputRawData(entry_address, kCanReturnSkipInsteadOfSkipping);
|
1528
|
+
serializer_->SerializeObject(target, kPlain, kInnerPointer, skip);
|
1569
1529
|
bytes_processed_so_far_ += kPointerSize;
|
1570
1530
|
}
|
1571
1531
|
|
1572
1532
|
|
1573
1533
|
void Serializer::ObjectSerializer::VisitGlobalPropertyCell(RelocInfo* rinfo) {
|
1574
|
-
|
1575
|
-
|
1576
|
-
|
1534
|
+
ASSERT(rinfo->rmode() == RelocInfo::GLOBAL_PROPERTY_CELL);
|
1535
|
+
JSGlobalPropertyCell* cell =
|
1536
|
+
JSGlobalPropertyCell::cast(rinfo->target_cell());
|
1537
|
+
int skip = OutputRawData(rinfo->pc(), kCanReturnSkipInsteadOfSkipping);
|
1538
|
+
serializer_->SerializeObject(cell, kPlain, kInnerPointer, skip);
|
1577
1539
|
}
|
1578
1540
|
|
1579
1541
|
|
@@ -1601,59 +1563,58 @@ void Serializer::ObjectSerializer::VisitExternalAsciiString(
|
|
1601
1563
|
}
|
1602
1564
|
|
1603
1565
|
|
1604
|
-
|
1566
|
+
int Serializer::ObjectSerializer::OutputRawData(
|
1567
|
+
Address up_to, Serializer::ObjectSerializer::ReturnSkip return_skip) {
|
1605
1568
|
Address object_start = object_->address();
|
1569
|
+
Address base = object_start + bytes_processed_so_far_;
|
1606
1570
|
int up_to_offset = static_cast<int>(up_to - object_start);
|
1607
|
-
int
|
1571
|
+
int to_skip = up_to_offset - bytes_processed_so_far_;
|
1572
|
+
int bytes_to_output = to_skip;
|
1573
|
+
bytes_processed_so_far_ += to_skip;
|
1608
1574
|
// This assert will fail if the reloc info gives us the target_address_address
|
1609
1575
|
// locations in a non-ascending order. Luckily that doesn't happen.
|
1610
|
-
ASSERT(
|
1611
|
-
|
1612
|
-
|
1613
|
-
|
1614
|
-
|
1576
|
+
ASSERT(to_skip >= 0);
|
1577
|
+
bool outputting_code = false;
|
1578
|
+
if (to_skip != 0 && code_object_ && !code_has_been_output_) {
|
1579
|
+
// Output the code all at once and fix later.
|
1580
|
+
bytes_to_output = object_->Size() + to_skip - bytes_processed_so_far_;
|
1581
|
+
outputting_code = true;
|
1582
|
+
code_has_been_output_ = true;
|
1583
|
+
}
|
1584
|
+
if (bytes_to_output != 0 &&
|
1585
|
+
(!code_object_ || outputting_code)) {
|
1586
|
+
#define RAW_CASE(index) \
|
1587
|
+
if (!outputting_code && bytes_to_output == index * kPointerSize && \
|
1588
|
+
index * kPointerSize == to_skip) { \
|
1615
1589
|
sink_->PutSection(kRawData + index, "RawDataFixed"); \
|
1590
|
+
to_skip = 0; /* This insn already skips. */ \
|
1616
1591
|
} else /* NOLINT */
|
1617
1592
|
COMMON_RAW_LENGTHS(RAW_CASE)
|
1618
1593
|
#undef RAW_CASE
|
1619
1594
|
{ /* NOLINT */
|
1595
|
+
// We always end up here if we are outputting the code of a code object.
|
1620
1596
|
sink_->Put(kRawData, "RawData");
|
1621
|
-
sink_->PutInt(
|
1597
|
+
sink_->PutInt(bytes_to_output, "length");
|
1622
1598
|
}
|
1623
|
-
for (int i = 0; i <
|
1599
|
+
for (int i = 0; i < bytes_to_output; i++) {
|
1624
1600
|
unsigned int data = base[i];
|
1625
1601
|
sink_->PutSection(data, "Byte");
|
1626
1602
|
}
|
1627
|
-
bytes_processed_so_far_ += skipped;
|
1628
1603
|
}
|
1629
|
-
|
1630
|
-
|
1631
|
-
|
1632
|
-
|
1633
|
-
for (int i = FIRST_SPACE; i <= LAST_SPACE; i++) {
|
1634
|
-
AllocationSpace s = static_cast<AllocationSpace>(i);
|
1635
|
-
if (HEAP->InSpace(object, s)) {
|
1636
|
-
if (i == LO_SPACE) {
|
1637
|
-
if (object->IsCode()) {
|
1638
|
-
return kLargeCode;
|
1639
|
-
} else if (object->IsFixedArray()) {
|
1640
|
-
return kLargeFixedArray;
|
1641
|
-
} else {
|
1642
|
-
return kLargeData;
|
1643
|
-
}
|
1644
|
-
}
|
1645
|
-
return i;
|
1646
|
-
}
|
1604
|
+
if (to_skip != 0 && return_skip == kIgnoringReturn) {
|
1605
|
+
sink_->Put(kSkip, "Skip");
|
1606
|
+
sink_->PutInt(to_skip, "SkipDistance");
|
1607
|
+
to_skip = 0;
|
1647
1608
|
}
|
1648
|
-
|
1649
|
-
return 0;
|
1609
|
+
return to_skip;
|
1650
1610
|
}
|
1651
1611
|
|
1652
1612
|
|
1653
|
-
int Serializer::
|
1613
|
+
int Serializer::SpaceOfObject(HeapObject* object) {
|
1654
1614
|
for (int i = FIRST_SPACE; i <= LAST_SPACE; i++) {
|
1655
1615
|
AllocationSpace s = static_cast<AllocationSpace>(i);
|
1656
1616
|
if (HEAP->InSpace(object, s)) {
|
1617
|
+
ASSERT(i < kNumberOfSpaces);
|
1657
1618
|
return i;
|
1658
1619
|
}
|
1659
1620
|
}
|
@@ -1662,34 +1623,8 @@ int Serializer::SpaceOfAlreadySerializedObject(HeapObject* object) {
|
|
1662
1623
|
}
|
1663
1624
|
|
1664
1625
|
|
1665
|
-
int Serializer::Allocate(int space, int size
|
1626
|
+
int Serializer::Allocate(int space, int size) {
|
1666
1627
|
CHECK(space >= 0 && space < kNumberOfSpaces);
|
1667
|
-
if (SpaceIsLarge(space)) {
|
1668
|
-
// In large object space we merely number the objects instead of trying to
|
1669
|
-
// determine some sort of address.
|
1670
|
-
*new_page = true;
|
1671
|
-
large_object_total_ += size;
|
1672
|
-
return fullness_[LO_SPACE]++;
|
1673
|
-
}
|
1674
|
-
*new_page = false;
|
1675
|
-
if (fullness_[space] == 0) {
|
1676
|
-
*new_page = true;
|
1677
|
-
}
|
1678
|
-
if (SpaceIsPaged(space)) {
|
1679
|
-
// Paged spaces are a little special. We encode their addresses as if the
|
1680
|
-
// pages were all contiguous and each page were filled up in the range
|
1681
|
-
// 0 - Page::kObjectAreaSize. In practice the pages may not be contiguous
|
1682
|
-
// and allocation does not start at offset 0 in the page, but this scheme
|
1683
|
-
// means the deserializer can get the page number quickly by shifting the
|
1684
|
-
// serialized address.
|
1685
|
-
CHECK(IsPowerOf2(Page::kPageSize));
|
1686
|
-
int used_in_this_page = (fullness_[space] & (Page::kPageSize - 1));
|
1687
|
-
CHECK(size <= SpaceAreaSize(space));
|
1688
|
-
if (used_in_this_page + size > SpaceAreaSize(space)) {
|
1689
|
-
*new_page = true;
|
1690
|
-
fullness_[space] = RoundUp(fullness_[space], Page::kPageSize);
|
1691
|
-
}
|
1692
|
-
}
|
1693
1628
|
int allocation_address = fullness_[space];
|
1694
1629
|
fullness_[space] = allocation_address + size;
|
1695
1630
|
return allocation_address;
|
@@ -1705,4 +1640,21 @@ int Serializer::SpaceAreaSize(int space) {
|
|
1705
1640
|
}
|
1706
1641
|
|
1707
1642
|
|
1643
|
+
void Serializer::Pad() {
|
1644
|
+
// The non-branching GetInt will read up to 3 bytes too far, so we need
|
1645
|
+
// to pad the snapshot to make sure we don't read over the end.
|
1646
|
+
for (unsigned i = 0; i < sizeof(int32_t) - 1; i++) {
|
1647
|
+
sink_->Put(kNop, "Padding");
|
1648
|
+
}
|
1649
|
+
}
|
1650
|
+
|
1651
|
+
|
1652
|
+
bool SnapshotByteSource::AtEOF() {
|
1653
|
+
if (0u + length_ - position_ > 2 * sizeof(uint32_t)) return false;
|
1654
|
+
for (int x = position_; x < length_; x++) {
|
1655
|
+
if (data_[x] != SerializerDeserializer::nop()) return false;
|
1656
|
+
}
|
1657
|
+
return true;
|
1658
|
+
}
|
1659
|
+
|
1708
1660
|
} } // namespace v8::internal
|