mustang 0.0.1 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.rspec +1 -0
- data/Isolate +9 -0
- data/README.md +6 -12
- data/Rakefile +30 -4
- data/TODO.md +9 -0
- data/ext/v8/extconf.rb +56 -0
- data/ext/v8/v8.cpp +37 -0
- data/ext/v8/v8_array.cpp +161 -0
- data/ext/v8/v8_array.h +17 -0
- data/ext/v8/v8_base.cpp +147 -0
- data/ext/v8/v8_base.h +23 -0
- data/ext/v8/v8_cast.cpp +151 -0
- data/ext/v8/v8_cast.h +64 -0
- data/ext/v8/v8_context.cpp +174 -0
- data/ext/v8/v8_context.h +12 -0
- data/ext/v8/v8_date.cpp +61 -0
- data/ext/v8/v8_date.h +16 -0
- data/ext/v8/v8_errors.cpp +147 -0
- data/ext/v8/v8_errors.h +19 -0
- data/ext/v8/v8_external.cpp +66 -0
- data/ext/v8/v8_external.h +16 -0
- data/ext/v8/v8_function.cpp +182 -0
- data/ext/v8/v8_function.h +14 -0
- data/ext/v8/v8_integer.cpp +70 -0
- data/ext/v8/v8_integer.h +16 -0
- data/ext/v8/v8_macros.h +30 -0
- data/ext/v8/v8_main.cpp +53 -0
- data/ext/v8/v8_main.h +13 -0
- data/ext/v8/v8_number.cpp +62 -0
- data/ext/v8/v8_number.h +16 -0
- data/ext/v8/v8_object.cpp +172 -0
- data/ext/v8/v8_object.h +17 -0
- data/ext/v8/v8_ref.cpp +72 -0
- data/ext/v8/v8_ref.h +43 -0
- data/ext/v8/v8_regexp.cpp +148 -0
- data/ext/v8/v8_regexp.h +16 -0
- data/ext/v8/v8_string.cpp +78 -0
- data/ext/v8/v8_string.h +16 -0
- data/ext/v8/v8_value.cpp +370 -0
- data/ext/v8/v8_value.h +19 -0
- data/gemspec.yml +2 -1
- data/lib/core_ext/class.rb +14 -0
- data/lib/core_ext/object.rb +12 -0
- data/lib/core_ext/symbol.rb +23 -0
- data/lib/mustang.rb +44 -0
- data/lib/mustang/context.rb +69 -0
- data/lib/mustang/errors.rb +36 -0
- data/lib/support/delegated.rb +25 -0
- data/lib/v8/array.rb +21 -0
- data/lib/v8/context.rb +13 -0
- data/lib/v8/date.rb +20 -0
- data/lib/v8/error.rb +15 -0
- data/lib/v8/external.rb +16 -0
- data/lib/v8/function.rb +11 -0
- data/lib/v8/integer.rb +16 -0
- data/lib/v8/number.rb +16 -0
- data/lib/v8/object.rb +66 -0
- data/lib/v8/regexp.rb +23 -0
- data/lib/v8/string.rb +27 -0
- data/mustang.gemspec +3 -0
- data/spec/core_ext/class_spec.rb +19 -0
- data/spec/core_ext/object_spec.rb +19 -0
- data/spec/core_ext/symbol_spec.rb +27 -0
- data/spec/fixtures/test1.js +2 -0
- data/spec/fixtures/test2.js +2 -0
- data/spec/spec_helper.rb +20 -0
- data/spec/v8/array_spec.rb +88 -0
- data/spec/v8/cast_spec.rb +151 -0
- data/spec/v8/context_spec.rb +78 -0
- data/spec/v8/data_spec.rb +39 -0
- data/spec/v8/date_spec.rb +45 -0
- data/spec/v8/empty_spec.rb +27 -0
- data/spec/v8/errors_spec.rb +142 -0
- data/spec/v8/external_spec.rb +44 -0
- data/spec/v8/function_spec.rb +170 -0
- data/spec/v8/integer_spec.rb +41 -0
- data/spec/v8/main_spec.rb +18 -0
- data/spec/v8/null_spec.rb +27 -0
- data/spec/v8/number_spec.rb +40 -0
- data/spec/v8/object_spec.rb +79 -0
- data/spec/v8/primitive_spec.rb +9 -0
- data/spec/v8/regexp_spec.rb +65 -0
- data/spec/v8/string_spec.rb +48 -0
- data/spec/v8/undefined_spec.rb +27 -0
- data/spec/v8/value_spec.rb +215 -0
- data/vendor/v8/.gitignore +2 -0
- data/vendor/v8/AUTHORS +3 -1
- data/vendor/v8/ChangeLog +117 -0
- data/vendor/v8/SConstruct +334 -53
- data/vendor/v8/include/v8-debug.h +21 -11
- data/vendor/v8/include/v8-preparser.h +1 -1
- data/vendor/v8/include/v8-profiler.h +122 -43
- data/vendor/v8/include/v8-testing.h +5 -0
- data/vendor/v8/include/v8.h +171 -17
- data/vendor/v8/preparser/SConscript +38 -0
- data/vendor/v8/preparser/preparser-process.cc +77 -114
- data/vendor/v8/samples/shell.cc +232 -46
- data/vendor/v8/src/SConscript +29 -5
- data/vendor/v8/src/accessors.cc +70 -211
- data/vendor/v8/{test/cctest/test-mips.cc → src/allocation-inl.h} +15 -18
- data/vendor/v8/src/allocation.cc +0 -82
- data/vendor/v8/src/allocation.h +9 -42
- data/vendor/v8/src/api.cc +1645 -1156
- data/vendor/v8/src/api.h +76 -12
- data/vendor/v8/src/apiutils.h +0 -7
- data/vendor/v8/src/arguments.h +15 -4
- data/vendor/v8/src/arm/assembler-arm-inl.h +10 -9
- data/vendor/v8/src/arm/assembler-arm.cc +62 -23
- data/vendor/v8/src/arm/assembler-arm.h +76 -11
- data/vendor/v8/src/arm/builtins-arm.cc +39 -33
- data/vendor/v8/src/arm/code-stubs-arm.cc +1182 -402
- data/vendor/v8/src/arm/code-stubs-arm.h +20 -54
- data/vendor/v8/src/arm/codegen-arm.cc +159 -106
- data/vendor/v8/src/arm/codegen-arm.h +6 -6
- data/vendor/v8/src/arm/constants-arm.h +16 -1
- data/vendor/v8/src/arm/cpu-arm.cc +7 -5
- data/vendor/v8/src/arm/debug-arm.cc +6 -4
- data/vendor/v8/src/arm/deoptimizer-arm.cc +51 -14
- data/vendor/v8/src/arm/disasm-arm.cc +47 -15
- data/vendor/v8/src/arm/frames-arm.h +1 -1
- data/vendor/v8/src/arm/full-codegen-arm.cc +724 -408
- data/vendor/v8/src/arm/ic-arm.cc +90 -85
- data/vendor/v8/src/arm/lithium-arm.cc +140 -69
- data/vendor/v8/src/arm/lithium-arm.h +161 -46
- data/vendor/v8/src/arm/lithium-codegen-arm.cc +567 -297
- data/vendor/v8/src/arm/lithium-codegen-arm.h +21 -9
- data/vendor/v8/src/arm/lithium-gap-resolver-arm.cc +2 -0
- data/vendor/v8/src/arm/macro-assembler-arm.cc +457 -96
- data/vendor/v8/src/arm/macro-assembler-arm.h +115 -18
- data/vendor/v8/src/arm/regexp-macro-assembler-arm.cc +20 -13
- data/vendor/v8/src/arm/regexp-macro-assembler-arm.h +1 -0
- data/vendor/v8/src/arm/simulator-arm.cc +184 -101
- data/vendor/v8/src/arm/simulator-arm.h +26 -21
- data/vendor/v8/src/arm/stub-cache-arm.cc +450 -467
- data/vendor/v8/src/arm/virtual-frame-arm.cc +14 -12
- data/vendor/v8/src/arm/virtual-frame-arm.h +11 -8
- data/vendor/v8/src/array.js +35 -18
- data/vendor/v8/src/assembler.cc +186 -92
- data/vendor/v8/src/assembler.h +106 -69
- data/vendor/v8/src/ast-inl.h +5 -0
- data/vendor/v8/src/ast.cc +46 -35
- data/vendor/v8/src/ast.h +107 -50
- data/vendor/v8/src/atomicops.h +2 -0
- data/vendor/v8/src/atomicops_internals_mips_gcc.h +169 -0
- data/vendor/v8/src/bootstrapper.cc +649 -399
- data/vendor/v8/src/bootstrapper.h +94 -27
- data/vendor/v8/src/builtins.cc +359 -227
- data/vendor/v8/src/builtins.h +157 -123
- data/vendor/v8/src/checks.cc +2 -2
- data/vendor/v8/src/checks.h +4 -0
- data/vendor/v8/src/code-stubs.cc +27 -17
- data/vendor/v8/src/code-stubs.h +38 -17
- data/vendor/v8/src/codegen-inl.h +5 -1
- data/vendor/v8/src/codegen.cc +27 -17
- data/vendor/v8/src/codegen.h +9 -9
- data/vendor/v8/src/compilation-cache.cc +92 -206
- data/vendor/v8/src/compilation-cache.h +205 -30
- data/vendor/v8/src/compiler.cc +107 -120
- data/vendor/v8/src/compiler.h +17 -2
- data/vendor/v8/src/contexts.cc +22 -15
- data/vendor/v8/src/contexts.h +14 -8
- data/vendor/v8/src/conversions.cc +86 -30
- data/vendor/v8/src/counters.cc +19 -4
- data/vendor/v8/src/counters.h +28 -16
- data/vendor/v8/src/cpu-profiler-inl.h +4 -3
- data/vendor/v8/src/cpu-profiler.cc +123 -72
- data/vendor/v8/src/cpu-profiler.h +33 -19
- data/vendor/v8/src/cpu.h +2 -0
- data/vendor/v8/src/d8-debug.cc +3 -3
- data/vendor/v8/src/d8-debug.h +7 -6
- data/vendor/v8/src/d8-posix.cc +2 -0
- data/vendor/v8/src/d8.cc +22 -12
- data/vendor/v8/src/d8.gyp +3 -0
- data/vendor/v8/src/d8.js +618 -0
- data/vendor/v8/src/data-flow.h +3 -3
- data/vendor/v8/src/dateparser.h +4 -2
- data/vendor/v8/src/debug-agent.cc +10 -9
- data/vendor/v8/src/debug-agent.h +9 -11
- data/vendor/v8/src/debug-debugger.js +121 -0
- data/vendor/v8/src/debug.cc +331 -227
- data/vendor/v8/src/debug.h +248 -219
- data/vendor/v8/src/deoptimizer.cc +173 -62
- data/vendor/v8/src/deoptimizer.h +119 -19
- data/vendor/v8/src/disasm.h +3 -0
- data/vendor/v8/src/disassembler.cc +10 -9
- data/vendor/v8/src/execution.cc +185 -129
- data/vendor/v8/src/execution.h +47 -78
- data/vendor/v8/src/extensions/experimental/break-iterator.cc +250 -0
- data/vendor/v8/src/extensions/experimental/break-iterator.h +89 -0
- data/vendor/v8/src/extensions/experimental/experimental.gyp +2 -0
- data/vendor/v8/src/extensions/experimental/i18n-extension.cc +22 -2
- data/vendor/v8/src/extensions/externalize-string-extension.cc +2 -2
- data/vendor/v8/src/extensions/gc-extension.cc +1 -1
- data/vendor/v8/src/factory.cc +261 -154
- data/vendor/v8/src/factory.h +162 -158
- data/vendor/v8/src/flag-definitions.h +17 -11
- data/vendor/v8/src/frame-element.cc +0 -5
- data/vendor/v8/src/frame-element.h +9 -13
- data/vendor/v8/src/frames-inl.h +7 -0
- data/vendor/v8/src/frames.cc +56 -46
- data/vendor/v8/src/frames.h +36 -25
- data/vendor/v8/src/full-codegen.cc +15 -24
- data/vendor/v8/src/full-codegen.h +13 -41
- data/vendor/v8/src/func-name-inferrer.cc +7 -6
- data/vendor/v8/src/func-name-inferrer.h +1 -1
- data/vendor/v8/src/gdb-jit.cc +1 -0
- data/vendor/v8/src/global-handles.cc +118 -56
- data/vendor/v8/src/global-handles.h +98 -40
- data/vendor/v8/src/globals.h +2 -2
- data/vendor/v8/src/handles-inl.h +106 -9
- data/vendor/v8/src/handles.cc +220 -157
- data/vendor/v8/src/handles.h +38 -59
- data/vendor/v8/src/hashmap.h +3 -3
- data/vendor/v8/src/heap-inl.h +141 -25
- data/vendor/v8/src/heap-profiler.cc +117 -63
- data/vendor/v8/src/heap-profiler.h +38 -21
- data/vendor/v8/src/heap.cc +805 -564
- data/vendor/v8/src/heap.h +640 -594
- data/vendor/v8/src/hydrogen-instructions.cc +216 -73
- data/vendor/v8/src/hydrogen-instructions.h +259 -124
- data/vendor/v8/src/hydrogen.cc +996 -1171
- data/vendor/v8/src/hydrogen.h +163 -144
- data/vendor/v8/src/ia32/assembler-ia32-inl.h +12 -11
- data/vendor/v8/src/ia32/assembler-ia32.cc +85 -39
- data/vendor/v8/src/ia32/assembler-ia32.h +82 -16
- data/vendor/v8/src/ia32/builtins-ia32.cc +64 -58
- data/vendor/v8/src/ia32/code-stubs-ia32.cc +248 -324
- data/vendor/v8/src/ia32/code-stubs-ia32.h +3 -44
- data/vendor/v8/src/ia32/codegen-ia32.cc +217 -165
- data/vendor/v8/src/ia32/codegen-ia32.h +3 -0
- data/vendor/v8/src/ia32/cpu-ia32.cc +6 -5
- data/vendor/v8/src/ia32/debug-ia32.cc +8 -5
- data/vendor/v8/src/ia32/deoptimizer-ia32.cc +124 -14
- data/vendor/v8/src/ia32/disasm-ia32.cc +85 -62
- data/vendor/v8/src/ia32/frames-ia32.h +1 -1
- data/vendor/v8/src/ia32/full-codegen-ia32.cc +348 -435
- data/vendor/v8/src/ia32/ic-ia32.cc +91 -91
- data/vendor/v8/src/ia32/lithium-codegen-ia32.cc +500 -255
- data/vendor/v8/src/ia32/lithium-codegen-ia32.h +13 -4
- data/vendor/v8/src/ia32/lithium-gap-resolver-ia32.cc +6 -0
- data/vendor/v8/src/ia32/lithium-ia32.cc +122 -45
- data/vendor/v8/src/ia32/lithium-ia32.h +128 -41
- data/vendor/v8/src/ia32/macro-assembler-ia32.cc +109 -84
- data/vendor/v8/src/ia32/macro-assembler-ia32.h +18 -9
- data/vendor/v8/src/ia32/regexp-macro-assembler-ia32.cc +26 -15
- data/vendor/v8/src/ia32/regexp-macro-assembler-ia32.h +1 -0
- data/vendor/v8/src/ia32/register-allocator-ia32.cc +30 -30
- data/vendor/v8/src/ia32/simulator-ia32.h +4 -4
- data/vendor/v8/src/ia32/stub-cache-ia32.cc +383 -400
- data/vendor/v8/src/ia32/virtual-frame-ia32.cc +36 -13
- data/vendor/v8/src/ia32/virtual-frame-ia32.h +11 -5
- data/vendor/v8/src/ic-inl.h +12 -2
- data/vendor/v8/src/ic.cc +304 -221
- data/vendor/v8/src/ic.h +115 -58
- data/vendor/v8/src/interpreter-irregexp.cc +25 -21
- data/vendor/v8/src/interpreter-irregexp.h +2 -1
- data/vendor/v8/src/isolate.cc +883 -0
- data/vendor/v8/src/isolate.h +1304 -0
- data/vendor/v8/src/json.js +10 -10
- data/vendor/v8/src/jsregexp.cc +111 -80
- data/vendor/v8/src/jsregexp.h +6 -7
- data/vendor/v8/src/jump-target-heavy.cc +5 -8
- data/vendor/v8/src/jump-target-heavy.h +0 -6
- data/vendor/v8/src/jump-target-inl.h +1 -1
- data/vendor/v8/src/jump-target-light.cc +3 -3
- data/vendor/v8/src/lithium-allocator-inl.h +2 -0
- data/vendor/v8/src/lithium-allocator.cc +42 -30
- data/vendor/v8/src/lithium-allocator.h +8 -22
- data/vendor/v8/src/lithium.cc +1 -0
- data/vendor/v8/src/liveedit.cc +141 -99
- data/vendor/v8/src/liveedit.h +7 -2
- data/vendor/v8/src/liveobjectlist-inl.h +90 -0
- data/vendor/v8/src/liveobjectlist.cc +2537 -1
- data/vendor/v8/src/liveobjectlist.h +245 -35
- data/vendor/v8/src/log-utils.cc +122 -35
- data/vendor/v8/src/log-utils.h +33 -36
- data/vendor/v8/src/log.cc +299 -241
- data/vendor/v8/src/log.h +177 -110
- data/vendor/v8/src/mark-compact.cc +612 -470
- data/vendor/v8/src/mark-compact.h +153 -80
- data/vendor/v8/src/messages.cc +16 -14
- data/vendor/v8/src/messages.js +30 -7
- data/vendor/v8/src/mips/assembler-mips-inl.h +155 -35
- data/vendor/v8/src/mips/assembler-mips.cc +1093 -219
- data/vendor/v8/src/mips/assembler-mips.h +552 -153
- data/vendor/v8/src/mips/builtins-mips.cc +43 -100
- data/vendor/v8/src/mips/code-stubs-mips.cc +752 -0
- data/vendor/v8/src/mips/code-stubs-mips.h +511 -0
- data/vendor/v8/src/mips/codegen-mips-inl.h +8 -14
- data/vendor/v8/src/mips/codegen-mips.cc +672 -896
- data/vendor/v8/src/mips/codegen-mips.h +271 -69
- data/vendor/v8/src/mips/constants-mips.cc +44 -20
- data/vendor/v8/src/mips/constants-mips.h +238 -40
- data/vendor/v8/src/mips/cpu-mips.cc +20 -3
- data/vendor/v8/src/mips/debug-mips.cc +35 -7
- data/vendor/v8/src/mips/deoptimizer-mips.cc +91 -0
- data/vendor/v8/src/mips/disasm-mips.cc +329 -93
- data/vendor/v8/src/mips/frames-mips.cc +2 -50
- data/vendor/v8/src/mips/frames-mips.h +24 -9
- data/vendor/v8/src/mips/full-codegen-mips.cc +473 -23
- data/vendor/v8/src/mips/ic-mips.cc +81 -45
- data/vendor/v8/src/mips/jump-target-mips.cc +11 -106
- data/vendor/v8/src/mips/lithium-codegen-mips.h +65 -0
- data/vendor/v8/src/mips/lithium-mips.h +304 -0
- data/vendor/v8/src/mips/macro-assembler-mips.cc +2391 -390
- data/vendor/v8/src/mips/macro-assembler-mips.h +718 -121
- data/vendor/v8/src/mips/regexp-macro-assembler-mips.cc +478 -0
- data/vendor/v8/src/mips/regexp-macro-assembler-mips.h +250 -0
- data/vendor/v8/src/mips/register-allocator-mips-inl.h +0 -3
- data/vendor/v8/src/mips/register-allocator-mips.h +3 -2
- data/vendor/v8/src/mips/simulator-mips.cc +1009 -221
- data/vendor/v8/src/mips/simulator-mips.h +119 -36
- data/vendor/v8/src/mips/stub-cache-mips.cc +331 -148
- data/vendor/v8/src/mips/{fast-codegen-mips.cc → virtual-frame-mips-inl.h} +11 -30
- data/vendor/v8/src/mips/virtual-frame-mips.cc +137 -149
- data/vendor/v8/src/mips/virtual-frame-mips.h +294 -312
- data/vendor/v8/src/mirror-debugger.js +9 -8
- data/vendor/v8/src/mksnapshot.cc +2 -2
- data/vendor/v8/src/objects-debug.cc +16 -16
- data/vendor/v8/src/objects-inl.h +421 -195
- data/vendor/v8/src/objects-printer.cc +7 -7
- data/vendor/v8/src/objects-visiting.cc +1 -1
- data/vendor/v8/src/objects-visiting.h +33 -12
- data/vendor/v8/src/objects.cc +935 -658
- data/vendor/v8/src/objects.h +234 -139
- data/vendor/v8/src/parser.cc +484 -439
- data/vendor/v8/src/parser.h +35 -14
- data/vendor/v8/src/platform-cygwin.cc +173 -107
- data/vendor/v8/src/platform-freebsd.cc +224 -72
- data/vendor/v8/src/platform-linux.cc +234 -95
- data/vendor/v8/src/platform-macos.cc +215 -82
- data/vendor/v8/src/platform-nullos.cc +9 -3
- data/vendor/v8/src/platform-openbsd.cc +22 -7
- data/vendor/v8/src/platform-posix.cc +30 -5
- data/vendor/v8/src/platform-solaris.cc +120 -38
- data/vendor/v8/src/platform-tls-mac.h +62 -0
- data/vendor/v8/src/platform-tls-win32.h +62 -0
- data/vendor/v8/src/platform-tls.h +50 -0
- data/vendor/v8/src/platform-win32.cc +195 -97
- data/vendor/v8/src/platform.h +72 -15
- data/vendor/v8/src/preparse-data.cc +2 -0
- data/vendor/v8/src/preparser-api.cc +8 -2
- data/vendor/v8/src/preparser.cc +1 -1
- data/vendor/v8/src/prettyprinter.cc +43 -52
- data/vendor/v8/src/prettyprinter.h +1 -1
- data/vendor/v8/src/profile-generator-inl.h +0 -28
- data/vendor/v8/src/profile-generator.cc +942 -685
- data/vendor/v8/src/profile-generator.h +210 -176
- data/vendor/v8/src/property.cc +6 -0
- data/vendor/v8/src/property.h +14 -3
- data/vendor/v8/src/regexp-macro-assembler-irregexp.cc +1 -1
- data/vendor/v8/src/regexp-macro-assembler.cc +28 -19
- data/vendor/v8/src/regexp-macro-assembler.h +11 -6
- data/vendor/v8/src/regexp-stack.cc +18 -10
- data/vendor/v8/src/regexp-stack.h +45 -21
- data/vendor/v8/src/regexp.js +3 -3
- data/vendor/v8/src/register-allocator-inl.h +3 -3
- data/vendor/v8/src/register-allocator.cc +1 -7
- data/vendor/v8/src/register-allocator.h +5 -15
- data/vendor/v8/src/rewriter.cc +2 -1
- data/vendor/v8/src/runtime-profiler.cc +158 -128
- data/vendor/v8/src/runtime-profiler.h +131 -15
- data/vendor/v8/src/runtime.cc +2409 -1692
- data/vendor/v8/src/runtime.h +93 -17
- data/vendor/v8/src/safepoint-table.cc +3 -0
- data/vendor/v8/src/safepoint-table.h +9 -3
- data/vendor/v8/src/scanner-base.cc +21 -28
- data/vendor/v8/src/scanner-base.h +22 -11
- data/vendor/v8/src/scanner.cc +3 -5
- data/vendor/v8/src/scanner.h +4 -2
- data/vendor/v8/src/scopeinfo.cc +11 -16
- data/vendor/v8/src/scopeinfo.h +26 -15
- data/vendor/v8/src/scopes.cc +67 -37
- data/vendor/v8/src/scopes.h +26 -12
- data/vendor/v8/src/serialize.cc +193 -154
- data/vendor/v8/src/serialize.h +41 -36
- data/vendor/v8/src/small-pointer-list.h +163 -0
- data/vendor/v8/src/snapshot-common.cc +1 -1
- data/vendor/v8/src/snapshot.h +3 -1
- data/vendor/v8/src/spaces-inl.h +30 -25
- data/vendor/v8/src/spaces.cc +263 -370
- data/vendor/v8/src/spaces.h +178 -166
- data/vendor/v8/src/string-search.cc +4 -3
- data/vendor/v8/src/string-search.h +21 -20
- data/vendor/v8/src/string-stream.cc +32 -24
- data/vendor/v8/src/string.js +7 -7
- data/vendor/v8/src/stub-cache.cc +324 -248
- data/vendor/v8/src/stub-cache.h +181 -155
- data/vendor/v8/src/token.cc +3 -3
- data/vendor/v8/src/token.h +3 -3
- data/vendor/v8/src/top.cc +218 -390
- data/vendor/v8/src/type-info.cc +98 -32
- data/vendor/v8/src/type-info.h +10 -3
- data/vendor/v8/src/unicode.cc +1 -1
- data/vendor/v8/src/unicode.h +1 -1
- data/vendor/v8/src/utils.h +3 -0
- data/vendor/v8/src/v8-counters.cc +18 -11
- data/vendor/v8/src/v8-counters.h +34 -13
- data/vendor/v8/src/v8.cc +66 -121
- data/vendor/v8/src/v8.h +7 -4
- data/vendor/v8/src/v8globals.h +18 -12
- data/vendor/v8/src/{memory.h → v8memory.h} +0 -0
- data/vendor/v8/src/v8natives.js +59 -18
- data/vendor/v8/src/v8threads.cc +127 -114
- data/vendor/v8/src/v8threads.h +42 -35
- data/vendor/v8/src/v8utils.h +2 -39
- data/vendor/v8/src/variables.h +1 -1
- data/vendor/v8/src/version.cc +26 -5
- data/vendor/v8/src/version.h +4 -0
- data/vendor/v8/src/virtual-frame-heavy-inl.h +2 -4
- data/vendor/v8/src/virtual-frame-light-inl.h +5 -4
- data/vendor/v8/src/vm-state-inl.h +21 -17
- data/vendor/v8/src/vm-state.h +7 -5
- data/vendor/v8/src/win32-headers.h +1 -0
- data/vendor/v8/src/x64/assembler-x64-inl.h +12 -11
- data/vendor/v8/src/x64/assembler-x64.cc +80 -40
- data/vendor/v8/src/x64/assembler-x64.h +67 -17
- data/vendor/v8/src/x64/builtins-x64.cc +34 -33
- data/vendor/v8/src/x64/code-stubs-x64.cc +636 -377
- data/vendor/v8/src/x64/code-stubs-x64.h +14 -48
- data/vendor/v8/src/x64/codegen-x64-inl.h +1 -1
- data/vendor/v8/src/x64/codegen-x64.cc +158 -136
- data/vendor/v8/src/x64/codegen-x64.h +4 -1
- data/vendor/v8/src/x64/cpu-x64.cc +7 -5
- data/vendor/v8/src/x64/debug-x64.cc +8 -6
- data/vendor/v8/src/x64/deoptimizer-x64.cc +195 -20
- data/vendor/v8/src/x64/disasm-x64.cc +42 -23
- data/vendor/v8/src/x64/frames-x64.cc +1 -1
- data/vendor/v8/src/x64/frames-x64.h +2 -2
- data/vendor/v8/src/x64/full-codegen-x64.cc +780 -218
- data/vendor/v8/src/x64/ic-x64.cc +77 -79
- data/vendor/v8/src/x64/jump-target-x64.cc +1 -1
- data/vendor/v8/src/x64/lithium-codegen-x64.cc +698 -181
- data/vendor/v8/src/x64/lithium-codegen-x64.h +31 -6
- data/vendor/v8/src/x64/lithium-x64.cc +136 -54
- data/vendor/v8/src/x64/lithium-x64.h +142 -51
- data/vendor/v8/src/x64/macro-assembler-x64.cc +456 -187
- data/vendor/v8/src/x64/macro-assembler-x64.h +166 -34
- data/vendor/v8/src/x64/regexp-macro-assembler-x64.cc +44 -28
- data/vendor/v8/src/x64/regexp-macro-assembler-x64.h +8 -4
- data/vendor/v8/src/x64/register-allocator-x64-inl.h +3 -3
- data/vendor/v8/src/x64/register-allocator-x64.cc +12 -8
- data/vendor/v8/src/x64/simulator-x64.h +5 -5
- data/vendor/v8/src/x64/stub-cache-x64.cc +299 -344
- data/vendor/v8/src/x64/virtual-frame-x64.cc +37 -13
- data/vendor/v8/src/x64/virtual-frame-x64.h +13 -7
- data/vendor/v8/src/zone-inl.h +49 -3
- data/vendor/v8/src/zone.cc +42 -41
- data/vendor/v8/src/zone.h +37 -34
- data/vendor/v8/test/benchmarks/testcfg.py +100 -0
- data/vendor/v8/test/cctest/SConscript +5 -4
- data/vendor/v8/test/cctest/cctest.h +3 -2
- data/vendor/v8/test/cctest/cctest.status +6 -11
- data/vendor/v8/test/cctest/test-accessors.cc +3 -3
- data/vendor/v8/test/cctest/test-alloc.cc +39 -33
- data/vendor/v8/test/cctest/test-api.cc +1092 -205
- data/vendor/v8/test/cctest/test-assembler-arm.cc +39 -25
- data/vendor/v8/test/cctest/test-assembler-ia32.cc +36 -37
- data/vendor/v8/test/cctest/test-assembler-mips.cc +1098 -40
- data/vendor/v8/test/cctest/test-assembler-x64.cc +32 -25
- data/vendor/v8/test/cctest/test-ast.cc +1 -0
- data/vendor/v8/test/cctest/test-circular-queue.cc +8 -5
- data/vendor/v8/test/cctest/test-compiler.cc +24 -24
- data/vendor/v8/test/cctest/test-cpu-profiler.cc +140 -5
- data/vendor/v8/test/cctest/test-dataflow.cc +1 -0
- data/vendor/v8/test/cctest/test-debug.cc +136 -77
- data/vendor/v8/test/cctest/test-decls.cc +1 -1
- data/vendor/v8/test/cctest/test-deoptimization.cc +25 -24
- data/vendor/v8/test/cctest/test-disasm-arm.cc +9 -4
- data/vendor/v8/test/cctest/test-disasm-ia32.cc +10 -8
- data/vendor/v8/test/cctest/test-func-name-inference.cc +10 -4
- data/vendor/v8/test/cctest/test-heap-profiler.cc +226 -164
- data/vendor/v8/test/cctest/test-heap.cc +240 -217
- data/vendor/v8/test/cctest/test-liveedit.cc +1 -0
- data/vendor/v8/test/cctest/test-log-stack-tracer.cc +18 -20
- data/vendor/v8/test/cctest/test-log.cc +114 -108
- data/vendor/v8/test/cctest/test-macro-assembler-x64.cc +247 -177
- data/vendor/v8/test/cctest/test-mark-compact.cc +129 -90
- data/vendor/v8/test/cctest/test-parsing.cc +15 -14
- data/vendor/v8/test/cctest/test-platform-linux.cc +1 -0
- data/vendor/v8/test/cctest/test-platform-tls.cc +66 -0
- data/vendor/v8/test/cctest/test-platform-win32.cc +1 -0
- data/vendor/v8/test/cctest/test-profile-generator.cc +1 -1
- data/vendor/v8/test/cctest/test-regexp.cc +53 -41
- data/vendor/v8/test/cctest/test-reloc-info.cc +18 -11
- data/vendor/v8/test/cctest/test-serialize.cc +44 -43
- data/vendor/v8/test/cctest/test-sockets.cc +8 -3
- data/vendor/v8/test/cctest/test-spaces.cc +47 -29
- data/vendor/v8/test/cctest/test-strings.cc +20 -20
- data/vendor/v8/test/cctest/test-thread-termination.cc +8 -3
- data/vendor/v8/test/cctest/test-threads.cc +5 -3
- data/vendor/v8/test/cctest/test-utils.cc +5 -4
- data/vendor/v8/test/cctest/testcfg.py +7 -3
- data/vendor/v8/test/es5conform/es5conform.status +2 -77
- data/vendor/v8/test/es5conform/testcfg.py +1 -1
- data/vendor/v8/test/message/testcfg.py +1 -1
- data/vendor/v8/test/mjsunit/accessors-on-global-object.js +3 -3
- data/vendor/v8/test/mjsunit/array-concat.js +43 -1
- data/vendor/v8/test/mjsunit/array-join.js +25 -0
- data/vendor/v8/test/mjsunit/bitops-info.js +7 -1
- data/vendor/v8/test/mjsunit/compiler/array-length.js +2 -2
- data/vendor/v8/test/mjsunit/compiler/global-accessors.js +47 -0
- data/vendor/v8/test/mjsunit/compiler/pic.js +1 -1
- data/vendor/v8/test/mjsunit/compiler/regress-loadfield.js +65 -0
- data/vendor/v8/test/mjsunit/math-sqrt.js +5 -1
- data/vendor/v8/test/mjsunit/mjsunit.js +59 -8
- data/vendor/v8/test/mjsunit/mjsunit.status +0 -12
- data/vendor/v8/test/mjsunit/mul-exhaustive.js +129 -11
- data/vendor/v8/test/mjsunit/negate-zero.js +1 -1
- data/vendor/v8/test/mjsunit/object-freeze.js +5 -13
- data/vendor/v8/test/mjsunit/object-prevent-extensions.js +9 -50
- data/vendor/v8/test/mjsunit/object-seal.js +4 -13
- data/vendor/v8/test/mjsunit/override-eval-with-non-function.js +36 -0
- data/vendor/v8/test/mjsunit/regress/regress-1145.js +54 -0
- data/vendor/v8/test/mjsunit/regress/regress-1172-bis.js +37 -0
- data/vendor/v8/test/mjsunit/regress/regress-1181.js +54 -0
- data/vendor/v8/test/mjsunit/regress/regress-1207.js +35 -0
- data/vendor/v8/test/mjsunit/regress/regress-1209.js +34 -0
- data/vendor/v8/test/mjsunit/regress/regress-1210.js +48 -0
- data/vendor/v8/test/mjsunit/regress/regress-1213.js +43 -0
- data/vendor/v8/test/mjsunit/regress/regress-1218.js +29 -0
- data/vendor/v8/test/mjsunit/regress/regress-1229.js +79 -0
- data/vendor/v8/test/mjsunit/regress/regress-1233.js +47 -0
- data/vendor/v8/test/mjsunit/regress/regress-1236.js +34 -0
- data/vendor/v8/test/mjsunit/regress/regress-1237.js +36 -0
- data/vendor/v8/test/mjsunit/regress/regress-1240.js +39 -0
- data/vendor/v8/test/mjsunit/regress/regress-1257.js +58 -0
- data/vendor/v8/test/mjsunit/regress/regress-1278.js +69 -0
- data/vendor/v8/test/mjsunit/regress/regress-create-exception.js +1 -0
- data/vendor/v8/test/mjsunit/regress/regress-lazy-deopt-reloc.js +52 -0
- data/vendor/v8/test/mjsunit/sin-cos.js +15 -10
- data/vendor/v8/test/mjsunit/smi-negative-zero.js +2 -2
- data/vendor/v8/test/mjsunit/str-to-num.js +1 -1
- data/vendor/v8/test/mjsunit/strict-mode.js +435 -0
- data/vendor/v8/test/mjsunit/testcfg.py +23 -6
- data/vendor/v8/test/mozilla/mozilla.status +0 -2
- data/vendor/v8/test/mozilla/testcfg.py +1 -1
- data/vendor/v8/test/preparser/empty.js +28 -0
- data/vendor/v8/test/preparser/functions-only.js +38 -0
- data/vendor/v8/test/preparser/non-alphanum.js +34 -0
- data/vendor/v8/test/preparser/symbols-only.js +49 -0
- data/vendor/v8/test/preparser/testcfg.py +90 -0
- data/vendor/v8/test/sputnik/testcfg.py +1 -1
- data/vendor/v8/test/test262/README +16 -0
- data/vendor/v8/test/test262/harness-adapt.js +80 -0
- data/vendor/v8/test/test262/test262.status +1506 -0
- data/vendor/v8/test/test262/testcfg.py +123 -0
- data/vendor/v8/tools/freebsd-tick-processor +10 -0
- data/vendor/v8/tools/gyp/v8.gyp +8 -33
- data/vendor/v8/tools/linux-tick-processor +5 -3
- data/vendor/v8/tools/test.py +37 -14
- data/vendor/v8/tools/tickprocessor.js +22 -8
- data/vendor/v8/tools/visual_studio/v8_base.vcproj +13 -1
- data/vendor/v8/tools/visual_studio/v8_base_arm.vcproj +5 -1
- data/vendor/v8/tools/visual_studio/v8_base_x64.vcproj +5 -1
- data/vendor/v8/tools/visual_studio/x64.vsprops +1 -0
- metadata +1495 -1341
- data/ext/extconf.rb +0 -22
- data/ext/mustang.cpp +0 -58
- data/vendor/v8/src/top.h +0 -608
@@ -31,6 +31,152 @@
|
|
31
31
|
namespace v8 {
|
32
32
|
namespace internal {
|
33
33
|
|
34
|
+
class HashMap;
|
35
|
+
|
36
|
+
// The compilation cache consists of several generational sub-caches which uses
|
37
|
+
// this class as a base class. A sub-cache contains a compilation cache tables
|
38
|
+
// for each generation of the sub-cache. Since the same source code string has
|
39
|
+
// different compiled code for scripts and evals, we use separate sub-caches
|
40
|
+
// for different compilation modes, to avoid retrieving the wrong result.
|
41
|
+
class CompilationSubCache {
|
42
|
+
public:
|
43
|
+
CompilationSubCache(Isolate* isolate, int generations)
|
44
|
+
: isolate_(isolate),
|
45
|
+
generations_(generations) {
|
46
|
+
tables_ = NewArray<Object*>(generations);
|
47
|
+
}
|
48
|
+
|
49
|
+
~CompilationSubCache() { DeleteArray(tables_); }
|
50
|
+
|
51
|
+
// Index for the first generation in the cache.
|
52
|
+
static const int kFirstGeneration = 0;
|
53
|
+
|
54
|
+
// Get the compilation cache tables for a specific generation.
|
55
|
+
Handle<CompilationCacheTable> GetTable(int generation);
|
56
|
+
|
57
|
+
// Accessors for first generation.
|
58
|
+
Handle<CompilationCacheTable> GetFirstTable() {
|
59
|
+
return GetTable(kFirstGeneration);
|
60
|
+
}
|
61
|
+
void SetFirstTable(Handle<CompilationCacheTable> value) {
|
62
|
+
ASSERT(kFirstGeneration < generations_);
|
63
|
+
tables_[kFirstGeneration] = *value;
|
64
|
+
}
|
65
|
+
|
66
|
+
// Age the sub-cache by evicting the oldest generation and creating a new
|
67
|
+
// young generation.
|
68
|
+
void Age();
|
69
|
+
|
70
|
+
// GC support.
|
71
|
+
void Iterate(ObjectVisitor* v);
|
72
|
+
void IterateFunctions(ObjectVisitor* v);
|
73
|
+
|
74
|
+
// Clear this sub-cache evicting all its content.
|
75
|
+
void Clear();
|
76
|
+
|
77
|
+
// Remove given shared function info from sub-cache.
|
78
|
+
void Remove(Handle<SharedFunctionInfo> function_info);
|
79
|
+
|
80
|
+
// Number of generations in this sub-cache.
|
81
|
+
inline int generations() { return generations_; }
|
82
|
+
|
83
|
+
protected:
|
84
|
+
Isolate* isolate() { return isolate_; }
|
85
|
+
|
86
|
+
private:
|
87
|
+
Isolate* isolate_;
|
88
|
+
int generations_; // Number of generations.
|
89
|
+
Object** tables_; // Compilation cache tables - one for each generation.
|
90
|
+
|
91
|
+
DISALLOW_IMPLICIT_CONSTRUCTORS(CompilationSubCache);
|
92
|
+
};
|
93
|
+
|
94
|
+
|
95
|
+
// Sub-cache for scripts.
|
96
|
+
class CompilationCacheScript : public CompilationSubCache {
|
97
|
+
public:
|
98
|
+
CompilationCacheScript(Isolate* isolate, int generations);
|
99
|
+
|
100
|
+
Handle<SharedFunctionInfo> Lookup(Handle<String> source,
|
101
|
+
Handle<Object> name,
|
102
|
+
int line_offset,
|
103
|
+
int column_offset);
|
104
|
+
void Put(Handle<String> source, Handle<SharedFunctionInfo> function_info);
|
105
|
+
|
106
|
+
private:
|
107
|
+
MUST_USE_RESULT MaybeObject* TryTablePut(
|
108
|
+
Handle<String> source, Handle<SharedFunctionInfo> function_info);
|
109
|
+
|
110
|
+
// Note: Returns a new hash table if operation results in expansion.
|
111
|
+
Handle<CompilationCacheTable> TablePut(
|
112
|
+
Handle<String> source, Handle<SharedFunctionInfo> function_info);
|
113
|
+
|
114
|
+
bool HasOrigin(Handle<SharedFunctionInfo> function_info,
|
115
|
+
Handle<Object> name,
|
116
|
+
int line_offset,
|
117
|
+
int column_offset);
|
118
|
+
|
119
|
+
void* script_histogram_;
|
120
|
+
bool script_histogram_initialized_;
|
121
|
+
|
122
|
+
DISALLOW_IMPLICIT_CONSTRUCTORS(CompilationCacheScript);
|
123
|
+
};
|
124
|
+
|
125
|
+
|
126
|
+
// Sub-cache for eval scripts.
|
127
|
+
class CompilationCacheEval: public CompilationSubCache {
|
128
|
+
public:
|
129
|
+
CompilationCacheEval(Isolate* isolate, int generations)
|
130
|
+
: CompilationSubCache(isolate, generations) { }
|
131
|
+
|
132
|
+
Handle<SharedFunctionInfo> Lookup(Handle<String> source,
|
133
|
+
Handle<Context> context,
|
134
|
+
StrictModeFlag strict_mode);
|
135
|
+
|
136
|
+
void Put(Handle<String> source,
|
137
|
+
Handle<Context> context,
|
138
|
+
Handle<SharedFunctionInfo> function_info);
|
139
|
+
|
140
|
+
private:
|
141
|
+
MUST_USE_RESULT MaybeObject* TryTablePut(
|
142
|
+
Handle<String> source,
|
143
|
+
Handle<Context> context,
|
144
|
+
Handle<SharedFunctionInfo> function_info);
|
145
|
+
|
146
|
+
// Note: Returns a new hash table if operation results in expansion.
|
147
|
+
Handle<CompilationCacheTable> TablePut(
|
148
|
+
Handle<String> source,
|
149
|
+
Handle<Context> context,
|
150
|
+
Handle<SharedFunctionInfo> function_info);
|
151
|
+
|
152
|
+
DISALLOW_IMPLICIT_CONSTRUCTORS(CompilationCacheEval);
|
153
|
+
};
|
154
|
+
|
155
|
+
|
156
|
+
// Sub-cache for regular expressions.
|
157
|
+
class CompilationCacheRegExp: public CompilationSubCache {
|
158
|
+
public:
|
159
|
+
CompilationCacheRegExp(Isolate* isolate, int generations)
|
160
|
+
: CompilationSubCache(isolate, generations) { }
|
161
|
+
|
162
|
+
Handle<FixedArray> Lookup(Handle<String> source, JSRegExp::Flags flags);
|
163
|
+
|
164
|
+
void Put(Handle<String> source,
|
165
|
+
JSRegExp::Flags flags,
|
166
|
+
Handle<FixedArray> data);
|
167
|
+
private:
|
168
|
+
MUST_USE_RESULT MaybeObject* TryTablePut(Handle<String> source,
|
169
|
+
JSRegExp::Flags flags,
|
170
|
+
Handle<FixedArray> data);
|
171
|
+
|
172
|
+
// Note: Returns a new hash table if operation results in expansion.
|
173
|
+
Handle<CompilationCacheTable> TablePut(Handle<String> source,
|
174
|
+
JSRegExp::Flags flags,
|
175
|
+
Handle<FixedArray> data);
|
176
|
+
|
177
|
+
DISALLOW_IMPLICIT_CONSTRUCTORS(CompilationCacheRegExp);
|
178
|
+
};
|
179
|
+
|
34
180
|
|
35
181
|
// The compilation cache keeps shared function infos for compiled
|
36
182
|
// scripts and evals. The shared function infos are looked up using
|
@@ -41,69 +187,98 @@ class CompilationCache {
|
|
41
187
|
// Finds the script shared function info for a source
|
42
188
|
// string. Returns an empty handle if the cache doesn't contain a
|
43
189
|
// script for the given source string with the right origin.
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
190
|
+
Handle<SharedFunctionInfo> LookupScript(Handle<String> source,
|
191
|
+
Handle<Object> name,
|
192
|
+
int line_offset,
|
193
|
+
int column_offset);
|
48
194
|
|
49
195
|
// Finds the shared function info for a source string for eval in a
|
50
196
|
// given context. Returns an empty handle if the cache doesn't
|
51
197
|
// contain a script for the given source string.
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
198
|
+
Handle<SharedFunctionInfo> LookupEval(Handle<String> source,
|
199
|
+
Handle<Context> context,
|
200
|
+
bool is_global,
|
201
|
+
StrictModeFlag strict_mode);
|
56
202
|
|
57
203
|
// Returns the regexp data associated with the given regexp if it
|
58
204
|
// is in cache, otherwise an empty handle.
|
59
|
-
|
60
|
-
|
205
|
+
Handle<FixedArray> LookupRegExp(Handle<String> source,
|
206
|
+
JSRegExp::Flags flags);
|
61
207
|
|
62
208
|
// Associate the (source, kind) pair to the shared function
|
63
209
|
// info. This may overwrite an existing mapping.
|
64
|
-
|
65
|
-
|
210
|
+
void PutScript(Handle<String> source,
|
211
|
+
Handle<SharedFunctionInfo> function_info);
|
66
212
|
|
67
213
|
// Associate the (source, context->closure()->shared(), kind) triple
|
68
214
|
// with the shared function info. This may overwrite an existing mapping.
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
215
|
+
void PutEval(Handle<String> source,
|
216
|
+
Handle<Context> context,
|
217
|
+
bool is_global,
|
218
|
+
Handle<SharedFunctionInfo> function_info);
|
73
219
|
|
74
220
|
// Associate the (source, flags) pair to the given regexp data.
|
75
221
|
// This may overwrite an existing mapping.
|
76
|
-
|
77
|
-
|
78
|
-
|
222
|
+
void PutRegExp(Handle<String> source,
|
223
|
+
JSRegExp::Flags flags,
|
224
|
+
Handle<FixedArray> data);
|
79
225
|
|
80
226
|
// Support for eager optimization tracking.
|
81
|
-
|
82
|
-
|
83
|
-
|
227
|
+
bool ShouldOptimizeEagerly(Handle<JSFunction> function);
|
228
|
+
void MarkForEagerOptimizing(Handle<JSFunction> function);
|
229
|
+
void MarkForLazyOptimizing(Handle<JSFunction> function);
|
84
230
|
|
85
231
|
// Reset the eager optimization tracking data.
|
86
|
-
|
232
|
+
void ResetEagerOptimizingData();
|
87
233
|
|
88
234
|
// Clear the cache - also used to initialize the cache at startup.
|
89
|
-
|
235
|
+
void Clear();
|
90
236
|
|
91
237
|
// Remove given shared function info from all caches.
|
92
|
-
|
238
|
+
void Remove(Handle<SharedFunctionInfo> function_info);
|
93
239
|
|
94
240
|
// GC support.
|
95
|
-
|
96
|
-
|
241
|
+
void Iterate(ObjectVisitor* v);
|
242
|
+
void IterateFunctions(ObjectVisitor* v);
|
97
243
|
|
98
244
|
// Notify the cache that a mark-sweep garbage collection is about to
|
99
245
|
// take place. This is used to retire entries from the cache to
|
100
246
|
// avoid keeping them alive too long without using them.
|
101
|
-
|
247
|
+
void MarkCompactPrologue();
|
102
248
|
|
103
249
|
// Enable/disable compilation cache. Used by debugger to disable compilation
|
104
250
|
// cache during debugging to make sure new scripts are always compiled.
|
105
|
-
|
106
|
-
|
251
|
+
void Enable();
|
252
|
+
void Disable();
|
253
|
+
private:
|
254
|
+
explicit CompilationCache(Isolate* isolate);
|
255
|
+
~CompilationCache();
|
256
|
+
|
257
|
+
HashMap* EagerOptimizingSet();
|
258
|
+
|
259
|
+
// The number of sub caches covering the different types to cache.
|
260
|
+
static const int kSubCacheCount = 4;
|
261
|
+
|
262
|
+
bool IsEnabled() { return FLAG_compilation_cache && enabled_; }
|
263
|
+
|
264
|
+
Isolate* isolate() { return isolate_; }
|
265
|
+
|
266
|
+
Isolate* isolate_;
|
267
|
+
|
268
|
+
CompilationCacheScript script_;
|
269
|
+
CompilationCacheEval eval_global_;
|
270
|
+
CompilationCacheEval eval_contextual_;
|
271
|
+
CompilationCacheRegExp reg_exp_;
|
272
|
+
CompilationSubCache* subcaches_[kSubCacheCount];
|
273
|
+
|
274
|
+
// Current enable state of the compilation cache.
|
275
|
+
bool enabled_;
|
276
|
+
|
277
|
+
HashMap* eager_optimizing_set_;
|
278
|
+
|
279
|
+
friend class Isolate;
|
280
|
+
|
281
|
+
DISALLOW_COPY_AND_ASSIGN(CompilationCache);
|
107
282
|
};
|
108
283
|
|
109
284
|
|
data/vendor/v8/src/compiler.cc
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
// Copyright
|
1
|
+
// Copyright 2011 the V8 project authors. All rights reserved.
|
2
2
|
// Redistribution and use in source and binary forms, with or without
|
3
3
|
// modification, are permitted provided that the following conditions are
|
4
4
|
// met:
|
@@ -51,7 +51,8 @@ namespace internal {
|
|
51
51
|
|
52
52
|
|
53
53
|
CompilationInfo::CompilationInfo(Handle<Script> script)
|
54
|
-
:
|
54
|
+
: isolate_(script->GetIsolate()),
|
55
|
+
flags_(0),
|
55
56
|
function_(NULL),
|
56
57
|
scope_(NULL),
|
57
58
|
script_(script),
|
@@ -64,7 +65,8 @@ CompilationInfo::CompilationInfo(Handle<Script> script)
|
|
64
65
|
|
65
66
|
|
66
67
|
CompilationInfo::CompilationInfo(Handle<SharedFunctionInfo> shared_info)
|
67
|
-
:
|
68
|
+
: isolate_(shared_info->GetIsolate()),
|
69
|
+
flags_(IsLazy::encode(true)),
|
68
70
|
function_(NULL),
|
69
71
|
scope_(NULL),
|
70
72
|
shared_info_(shared_info),
|
@@ -78,7 +80,8 @@ CompilationInfo::CompilationInfo(Handle<SharedFunctionInfo> shared_info)
|
|
78
80
|
|
79
81
|
|
80
82
|
CompilationInfo::CompilationInfo(Handle<JSFunction> closure)
|
81
|
-
:
|
83
|
+
: isolate_(closure->GetIsolate()),
|
84
|
+
flags_(IsLazy::encode(true)),
|
82
85
|
function_(NULL),
|
83
86
|
scope_(NULL),
|
84
87
|
closure_(closure),
|
@@ -121,10 +124,11 @@ void CompilationInfo::DisableOptimization() {
|
|
121
124
|
// break points has actually been set.
|
122
125
|
static bool AlwaysFullCompiler() {
|
123
126
|
#ifdef ENABLE_DEBUGGER_SUPPORT
|
127
|
+
Isolate* isolate = Isolate::Current();
|
124
128
|
if (V8::UseCrankshaft()) {
|
125
|
-
return FLAG_always_full_compiler ||
|
129
|
+
return FLAG_always_full_compiler || isolate->debug()->has_break_points();
|
126
130
|
} else {
|
127
|
-
return FLAG_always_full_compiler ||
|
131
|
+
return FLAG_always_full_compiler || isolate->debugger()->IsDebuggerActive();
|
128
132
|
}
|
129
133
|
#else
|
130
134
|
return FLAG_always_full_compiler;
|
@@ -172,6 +176,8 @@ static void AbortAndDisable(CompilationInfo* info) {
|
|
172
176
|
ASSERT(code->kind() == Code::FUNCTION);
|
173
177
|
code->set_optimizable(false);
|
174
178
|
info->SetCode(code);
|
179
|
+
Isolate* isolate = code->GetIsolate();
|
180
|
+
isolate->compilation_cache()->MarkForLazyOptimizing(info->closure());
|
175
181
|
if (FLAG_trace_opt) {
|
176
182
|
PrintF("[disabled optimization for: ");
|
177
183
|
info->closure()->PrintName();
|
@@ -197,6 +203,10 @@ static bool MakeCrankshaftCode(CompilationInfo* info) {
|
|
197
203
|
Handle<Code> code(info->shared_info()->code());
|
198
204
|
ASSERT(code->kind() == Code::FUNCTION);
|
199
205
|
|
206
|
+
// We should never arrive here if optimization has been disabled on the
|
207
|
+
// shared function info.
|
208
|
+
ASSERT(!info->shared_info()->optimization_disabled());
|
209
|
+
|
200
210
|
// Fall back to using the full code generator if it's not possible
|
201
211
|
// to use the Hydrogen-based optimizing compiler. We already have
|
202
212
|
// generated code for this from the shared function object.
|
@@ -221,11 +231,12 @@ static bool MakeCrankshaftCode(CompilationInfo* info) {
|
|
221
231
|
// or perform on-stack replacement for function with too many
|
222
232
|
// stack-allocated local variables.
|
223
233
|
//
|
224
|
-
// The encoding is as a signed value, with parameters
|
225
|
-
// indices and locals the non-negative ones.
|
234
|
+
// The encoding is as a signed value, with parameters and receiver using
|
235
|
+
// the negative indices and locals the non-negative ones.
|
226
236
|
const int limit = LUnallocated::kMaxFixedIndices / 2;
|
227
237
|
Scope* scope = info->scope();
|
228
|
-
if (scope->num_parameters()
|
238
|
+
if ((scope->num_parameters() + 1) > limit ||
|
239
|
+
scope->num_stack_slots() > limit) {
|
229
240
|
AbortAndDisable(info);
|
230
241
|
// True indicates the compilation pipeline is still going, not
|
231
242
|
// necessarily that we optimized the code.
|
@@ -247,7 +258,7 @@ static bool MakeCrankshaftCode(CompilationInfo* info) {
|
|
247
258
|
// performance of the hydrogen-based compiler.
|
248
259
|
int64_t start = OS::Ticks();
|
249
260
|
bool should_recompile = !info->shared_info()->has_deoptimization_support();
|
250
|
-
if (should_recompile ||
|
261
|
+
if (should_recompile || FLAG_hydrogen_stats) {
|
251
262
|
HPhase phase(HPhase::kFullCodeGen);
|
252
263
|
CompilationInfo unoptimized(info->shared_info());
|
253
264
|
// Note that we use the same AST that we will use for generating the
|
@@ -280,18 +291,18 @@ static bool MakeCrankshaftCode(CompilationInfo* info) {
|
|
280
291
|
HTracer::Instance()->TraceCompilation(info->function());
|
281
292
|
}
|
282
293
|
|
283
|
-
|
284
|
-
|
285
|
-
HGraphBuilder builder(&oracle);
|
294
|
+
Handle<Context> global_context(info->closure()->context()->global_context());
|
295
|
+
TypeFeedbackOracle oracle(code, global_context);
|
296
|
+
HGraphBuilder builder(info, &oracle);
|
286
297
|
HPhase phase(HPhase::kTotal);
|
287
|
-
HGraph* graph = builder.CreateGraph(
|
288
|
-
if (
|
298
|
+
HGraph* graph = builder.CreateGraph();
|
299
|
+
if (info->isolate()->has_pending_exception()) {
|
289
300
|
info->SetCode(Handle<Code>::null());
|
290
301
|
return false;
|
291
302
|
}
|
292
303
|
|
293
304
|
if (graph != NULL && FLAG_build_lithium) {
|
294
|
-
Handle<Code> optimized_code = graph->Compile();
|
305
|
+
Handle<Code> optimized_code = graph->Compile(info);
|
295
306
|
if (!optimized_code.is_null()) {
|
296
307
|
info->SetCode(optimized_code);
|
297
308
|
FinishOptimization(info->closure(), start);
|
@@ -315,30 +326,9 @@ static bool MakeCode(CompilationInfo* info) {
|
|
315
326
|
|
316
327
|
if (Rewriter::Rewrite(info) && Scope::Analyze(info)) {
|
317
328
|
if (V8::UseCrankshaft()) return MakeCrankshaftCode(info);
|
318
|
-
|
319
|
-
//
|
320
|
-
|
321
|
-
// run-once code or not.
|
322
|
-
//
|
323
|
-
// --full-compiler enables the dedicated backend for code we expect to
|
324
|
-
// be run once
|
325
|
-
//
|
326
|
-
// The normal choice of backend can be overridden with the flags
|
327
|
-
// --always-full-compiler.
|
328
|
-
if (Rewriter::Analyze(info)) {
|
329
|
-
Handle<SharedFunctionInfo> shared = info->shared_info();
|
330
|
-
bool is_run_once = (shared.is_null())
|
331
|
-
? info->scope()->is_global_scope()
|
332
|
-
: (shared->is_toplevel() || shared->try_full_codegen());
|
333
|
-
bool can_use_full =
|
334
|
-
FLAG_full_compiler && !info->function()->contains_loops();
|
335
|
-
if (AlwaysFullCompiler() || (is_run_once && can_use_full)) {
|
336
|
-
return FullCodeGenerator::MakeCode(info);
|
337
|
-
} else {
|
338
|
-
return AssignedVariablesAnalyzer::Analyze(info) &&
|
339
|
-
CodeGenerator::MakeCode(info);
|
340
|
-
}
|
341
|
-
}
|
329
|
+
// If crankshaft is not supported fall back to full code generator
|
330
|
+
// for all compilation.
|
331
|
+
return FullCodeGenerator::MakeCode(info);
|
342
332
|
}
|
343
333
|
|
344
334
|
return false;
|
@@ -363,11 +353,12 @@ bool Compiler::MakeCodeForLiveEdit(CompilationInfo* info) {
|
|
363
353
|
static Handle<SharedFunctionInfo> MakeFunctionInfo(CompilationInfo* info) {
|
364
354
|
CompilationZoneScope zone_scope(DELETE_ON_EXIT);
|
365
355
|
|
366
|
-
|
356
|
+
Isolate* isolate = info->isolate();
|
357
|
+
PostponeInterruptsScope postpone(isolate);
|
367
358
|
|
368
|
-
ASSERT(!
|
359
|
+
ASSERT(!isolate->global_context().is_null());
|
369
360
|
Handle<Script> script = info->script();
|
370
|
-
script->set_context_data((*
|
361
|
+
script->set_context_data((*isolate->global_context())->data());
|
371
362
|
|
372
363
|
#ifdef ENABLE_DEBUGGER_SUPPORT
|
373
364
|
if (info->is_eval()) {
|
@@ -380,15 +371,16 @@ static Handle<SharedFunctionInfo> MakeFunctionInfo(CompilationInfo* info) {
|
|
380
371
|
if (!it.done()) {
|
381
372
|
script->set_eval_from_shared(
|
382
373
|
JSFunction::cast(it.frame()->function())->shared());
|
374
|
+
Code* code = it.frame()->LookupCode(isolate);
|
383
375
|
int offset = static_cast<int>(
|
384
|
-
it.frame()->pc() -
|
376
|
+
it.frame()->pc() - code->instruction_start());
|
385
377
|
script->set_eval_from_instructions_offset(Smi::FromInt(offset));
|
386
378
|
}
|
387
379
|
}
|
388
380
|
}
|
389
381
|
|
390
382
|
// Notify debugger
|
391
|
-
|
383
|
+
isolate->debugger()->OnBeforeCompile(script);
|
392
384
|
#endif
|
393
385
|
|
394
386
|
// Only allow non-global compiles for eval.
|
@@ -400,22 +392,22 @@ static Handle<SharedFunctionInfo> MakeFunctionInfo(CompilationInfo* info) {
|
|
400
392
|
// rest of the function into account to avoid overlap with the
|
401
393
|
// parsing statistics.
|
402
394
|
HistogramTimer* rate = info->is_eval()
|
403
|
-
?
|
404
|
-
:
|
395
|
+
? info->isolate()->counters()->compile_eval()
|
396
|
+
: info->isolate()->counters()->compile();
|
405
397
|
HistogramTimerScope timer(rate);
|
406
398
|
|
407
399
|
// Compile the code.
|
408
400
|
FunctionLiteral* lit = info->function();
|
409
|
-
LiveEditFunctionTracker live_edit_tracker(lit);
|
401
|
+
LiveEditFunctionTracker live_edit_tracker(isolate, lit);
|
410
402
|
if (!MakeCode(info)) {
|
411
|
-
|
403
|
+
isolate->StackOverflow();
|
412
404
|
return Handle<SharedFunctionInfo>::null();
|
413
405
|
}
|
414
406
|
|
415
407
|
// Allocate function.
|
416
408
|
ASSERT(!info->code().is_null());
|
417
409
|
Handle<SharedFunctionInfo> result =
|
418
|
-
|
410
|
+
isolate->factory()->NewSharedFunctionInfo(
|
419
411
|
lit->name(),
|
420
412
|
lit->materialized_literal_count(),
|
421
413
|
info->code(),
|
@@ -425,7 +417,7 @@ static Handle<SharedFunctionInfo> MakeFunctionInfo(CompilationInfo* info) {
|
|
425
417
|
Compiler::SetFunctionInfo(result, lit, true, script);
|
426
418
|
|
427
419
|
if (script->name()->IsString()) {
|
428
|
-
PROFILE(CodeCreateEvent(
|
420
|
+
PROFILE(isolate, CodeCreateEvent(
|
429
421
|
info->is_eval()
|
430
422
|
? Logger::EVAL_TAG
|
431
423
|
: Logger::ToNativeByScript(Logger::SCRIPT_TAG, *script),
|
@@ -436,13 +428,13 @@ static Handle<SharedFunctionInfo> MakeFunctionInfo(CompilationInfo* info) {
|
|
436
428
|
script,
|
437
429
|
info->code()));
|
438
430
|
} else {
|
439
|
-
PROFILE(CodeCreateEvent(
|
431
|
+
PROFILE(isolate, CodeCreateEvent(
|
440
432
|
info->is_eval()
|
441
433
|
? Logger::EVAL_TAG
|
442
434
|
: Logger::ToNativeByScript(Logger::SCRIPT_TAG, *script),
|
443
435
|
*info->code(),
|
444
436
|
*result,
|
445
|
-
|
437
|
+
isolate->heap()->empty_string()));
|
446
438
|
GDBJIT(AddCode(Handle<String>(), script, info->code()));
|
447
439
|
}
|
448
440
|
|
@@ -453,7 +445,8 @@ static Handle<SharedFunctionInfo> MakeFunctionInfo(CompilationInfo* info) {
|
|
453
445
|
|
454
446
|
#ifdef ENABLE_DEBUGGER_SUPPORT
|
455
447
|
// Notify debugger
|
456
|
-
|
448
|
+
isolate->debugger()->OnAfterCompile(
|
449
|
+
script, Debugger::NO_AFTER_COMPILE_FLAGS);
|
457
450
|
#endif
|
458
451
|
|
459
452
|
live_edit_tracker.RecordFunctionInfo(result, lit);
|
@@ -470,20 +463,23 @@ Handle<SharedFunctionInfo> Compiler::Compile(Handle<String> source,
|
|
470
463
|
ScriptDataImpl* input_pre_data,
|
471
464
|
Handle<Object> script_data,
|
472
465
|
NativesFlag natives) {
|
466
|
+
Isolate* isolate = source->GetIsolate();
|
473
467
|
int source_length = source->length();
|
474
|
-
|
475
|
-
|
468
|
+
isolate->counters()->total_load_size()->Increment(source_length);
|
469
|
+
isolate->counters()->total_compile_size()->Increment(source_length);
|
476
470
|
|
477
471
|
// The VM is in the COMPILER state until exiting this function.
|
478
|
-
VMState state(COMPILER);
|
472
|
+
VMState state(isolate, COMPILER);
|
473
|
+
|
474
|
+
CompilationCache* compilation_cache = isolate->compilation_cache();
|
479
475
|
|
480
476
|
// Do a lookup in the compilation cache but not for extensions.
|
481
477
|
Handle<SharedFunctionInfo> result;
|
482
478
|
if (extension == NULL) {
|
483
|
-
result =
|
484
|
-
|
485
|
-
|
486
|
-
|
479
|
+
result = compilation_cache->LookupScript(source,
|
480
|
+
script_name,
|
481
|
+
line_offset,
|
482
|
+
column_offset);
|
487
483
|
}
|
488
484
|
|
489
485
|
if (result.is_null()) {
|
@@ -509,7 +505,7 @@ Handle<SharedFunctionInfo> Compiler::Compile(Handle<String> source,
|
|
509
505
|
}
|
510
506
|
|
511
507
|
// Create a script object describing the script to be compiled.
|
512
|
-
Handle<Script> script =
|
508
|
+
Handle<Script> script = FACTORY->NewScript(source);
|
513
509
|
if (natives == NATIVES_CODE) {
|
514
510
|
script->set_type(Smi::FromInt(Script::TYPE_NATIVE));
|
515
511
|
}
|
@@ -519,7 +515,7 @@ Handle<SharedFunctionInfo> Compiler::Compile(Handle<String> source,
|
|
519
515
|
script->set_column_offset(Smi::FromInt(column_offset));
|
520
516
|
}
|
521
517
|
|
522
|
-
script->set_data(script_data.is_null() ?
|
518
|
+
script->set_data(script_data.is_null() ? HEAP->undefined_value()
|
523
519
|
: *script_data);
|
524
520
|
|
525
521
|
// Compile the function and add it to the cache.
|
@@ -527,9 +523,10 @@ Handle<SharedFunctionInfo> Compiler::Compile(Handle<String> source,
|
|
527
523
|
info.MarkAsGlobal();
|
528
524
|
info.SetExtension(extension);
|
529
525
|
info.SetPreParseData(pre_data);
|
526
|
+
if (natives == NATIVES_CODE) info.MarkAsAllowingNativesSyntax();
|
530
527
|
result = MakeFunctionInfo(&info);
|
531
528
|
if (extension == NULL && !result.is_null()) {
|
532
|
-
|
529
|
+
compilation_cache->PutScript(source, result);
|
533
530
|
}
|
534
531
|
|
535
532
|
// Get rid of the pre-parsing data (if necessary).
|
@@ -538,7 +535,7 @@ Handle<SharedFunctionInfo> Compiler::Compile(Handle<String> source,
|
|
538
535
|
}
|
539
536
|
}
|
540
537
|
|
541
|
-
if (result.is_null())
|
538
|
+
if (result.is_null()) isolate->ReportPendingMessages();
|
542
539
|
return result;
|
543
540
|
}
|
544
541
|
|
@@ -547,24 +544,26 @@ Handle<SharedFunctionInfo> Compiler::CompileEval(Handle<String> source,
|
|
547
544
|
Handle<Context> context,
|
548
545
|
bool is_global,
|
549
546
|
StrictModeFlag strict_mode) {
|
547
|
+
Isolate* isolate = source->GetIsolate();
|
550
548
|
int source_length = source->length();
|
551
|
-
|
552
|
-
|
549
|
+
isolate->counters()->total_eval_size()->Increment(source_length);
|
550
|
+
isolate->counters()->total_compile_size()->Increment(source_length);
|
553
551
|
|
554
552
|
// The VM is in the COMPILER state until exiting this function.
|
555
|
-
VMState state(COMPILER);
|
553
|
+
VMState state(isolate, COMPILER);
|
556
554
|
|
557
555
|
// Do a lookup in the compilation cache; if the entry is not there, invoke
|
558
556
|
// the compiler and add the result to the cache.
|
559
557
|
Handle<SharedFunctionInfo> result;
|
560
|
-
|
561
|
-
|
562
|
-
|
563
|
-
|
558
|
+
CompilationCache* compilation_cache = isolate->compilation_cache();
|
559
|
+
result = compilation_cache->LookupEval(source,
|
560
|
+
context,
|
561
|
+
is_global,
|
562
|
+
strict_mode);
|
564
563
|
|
565
564
|
if (result.is_null()) {
|
566
565
|
// Create a script object describing the script to be compiled.
|
567
|
-
Handle<Script> script =
|
566
|
+
Handle<Script> script = isolate->factory()->NewScript(source);
|
568
567
|
CompilationInfo info(script);
|
569
568
|
info.MarkAsEval();
|
570
569
|
if (is_global) info.MarkAsGlobal();
|
@@ -572,11 +571,12 @@ Handle<SharedFunctionInfo> Compiler::CompileEval(Handle<String> source,
|
|
572
571
|
info.SetCallingContext(context);
|
573
572
|
result = MakeFunctionInfo(&info);
|
574
573
|
if (!result.is_null()) {
|
574
|
+
CompilationCache* compilation_cache = isolate->compilation_cache();
|
575
575
|
// If caller is strict mode, the result must be strict as well,
|
576
576
|
// but not the other way around. Consider:
|
577
577
|
// eval("'use strict'; ...");
|
578
578
|
ASSERT(strict_mode == kNonStrictMode || result->strict_mode());
|
579
|
-
|
579
|
+
compilation_cache->PutEval(source, context, is_global, result);
|
580
580
|
}
|
581
581
|
}
|
582
582
|
|
@@ -588,29 +588,35 @@ bool Compiler::CompileLazy(CompilationInfo* info) {
|
|
588
588
|
CompilationZoneScope zone_scope(DELETE_ON_EXIT);
|
589
589
|
|
590
590
|
// The VM is in the COMPILER state until exiting this function.
|
591
|
-
VMState state(COMPILER);
|
591
|
+
VMState state(info->isolate(), COMPILER);
|
592
592
|
|
593
|
-
|
593
|
+
Isolate* isolate = info->isolate();
|
594
|
+
PostponeInterruptsScope postpone(isolate);
|
594
595
|
|
595
596
|
Handle<SharedFunctionInfo> shared = info->shared_info();
|
596
597
|
int compiled_size = shared->end_position() - shared->start_position();
|
597
|
-
|
598
|
+
isolate->counters()->total_compile_size()->Increment(compiled_size);
|
598
599
|
|
599
600
|
// Generate the AST for the lazily compiled function.
|
600
601
|
if (ParserApi::Parse(info)) {
|
601
602
|
// Measure how long it takes to do the lazy compilation; only take the
|
602
603
|
// rest of the function into account to avoid overlap with the lazy
|
603
604
|
// parsing statistics.
|
604
|
-
HistogramTimerScope timer(
|
605
|
+
HistogramTimerScope timer(isolate->counters()->compile_lazy());
|
605
606
|
|
606
607
|
// Compile the code.
|
607
608
|
if (!MakeCode(info)) {
|
608
|
-
if (!
|
609
|
-
|
609
|
+
if (!isolate->has_pending_exception()) {
|
610
|
+
isolate->StackOverflow();
|
610
611
|
}
|
611
612
|
} else {
|
612
613
|
ASSERT(!info->code().is_null());
|
613
614
|
Handle<Code> code = info->code();
|
615
|
+
// Set optimizable to false if this is disallowed by the shared
|
616
|
+
// function info, e.g., we might have flushed the code and must
|
617
|
+
// reset this bit when lazy compiling the code again.
|
618
|
+
if (shared->optimization_disabled()) code->set_optimizable(false);
|
619
|
+
|
614
620
|
Handle<JSFunction> function = info->closure();
|
615
621
|
RecordFunctionCompilation(Logger::LAZY_COMPILE_TAG, info, shared);
|
616
622
|
|
@@ -647,16 +653,18 @@ bool Compiler::CompileLazy(CompilationInfo* info) {
|
|
647
653
|
ASSERT(shared->is_compiled());
|
648
654
|
shared->set_code_age(0);
|
649
655
|
|
650
|
-
if (
|
656
|
+
if (info->AllowOptimize() && !shared->optimization_disabled()) {
|
651
657
|
// If we're asked to always optimize, we compile the optimized
|
652
658
|
// version of the function right away - unless the debugger is
|
653
659
|
// active as it makes no sense to compile optimized code then.
|
654
|
-
if (FLAG_always_opt &&
|
660
|
+
if (FLAG_always_opt &&
|
661
|
+
!Isolate::Current()->debug()->has_break_points()) {
|
655
662
|
CompilationInfo optimized(function);
|
656
663
|
optimized.SetOptimizing(AstNode::kNoNumber);
|
657
664
|
return CompileLazy(&optimized);
|
658
|
-
} else if (
|
659
|
-
|
665
|
+
} else if (isolate->compilation_cache()->ShouldOptimizeEagerly(
|
666
|
+
function)) {
|
667
|
+
isolate->runtime_profiler()->OptimizeSoon(*function);
|
660
668
|
}
|
661
669
|
}
|
662
670
|
}
|
@@ -677,55 +685,32 @@ Handle<SharedFunctionInfo> Compiler::BuildFunctionInfo(FunctionLiteral* literal,
|
|
677
685
|
info.SetFunction(literal);
|
678
686
|
info.SetScope(literal->scope());
|
679
687
|
|
680
|
-
LiveEditFunctionTracker live_edit_tracker(literal);
|
688
|
+
LiveEditFunctionTracker live_edit_tracker(info.isolate(), literal);
|
681
689
|
// Determine if the function can be lazily compiled. This is necessary to
|
682
690
|
// allow some of our builtin JS files to be lazily compiled. These
|
683
691
|
// builtins cannot be handled lazily by the parser, since we have to know
|
684
692
|
// if a function uses the special natives syntax, which is something the
|
685
693
|
// parser records.
|
686
694
|
bool allow_lazy = literal->AllowsLazyCompilation() &&
|
687
|
-
!LiveEditFunctionTracker::IsActive();
|
695
|
+
!LiveEditFunctionTracker::IsActive(info.isolate());
|
688
696
|
|
689
697
|
Handle<SerializedScopeInfo> scope_info(SerializedScopeInfo::Empty());
|
690
698
|
|
691
699
|
// Generate code
|
692
700
|
if (FLAG_lazy && allow_lazy) {
|
693
|
-
Handle<Code> code(
|
701
|
+
Handle<Code> code = info.isolate()->builtins()->LazyCompile();
|
694
702
|
info.SetCode(code);
|
695
|
-
} else
|
696
|
-
|
697
|
-
if (!MakeCrankshaftCode(&info)) {
|
698
|
-
return Handle<SharedFunctionInfo>::null();
|
699
|
-
}
|
700
|
-
} else {
|
701
|
-
// The bodies of function literals have not yet been visited by the
|
702
|
-
// AST optimizer/analyzer.
|
703
|
-
if (!Rewriter::Analyze(&info)) return Handle<SharedFunctionInfo>::null();
|
704
|
-
|
705
|
-
bool is_run_once = literal->try_full_codegen();
|
706
|
-
bool can_use_full = FLAG_full_compiler && !literal->contains_loops();
|
707
|
-
|
708
|
-
if (AlwaysFullCompiler() || (is_run_once && can_use_full)) {
|
709
|
-
if (!FullCodeGenerator::MakeCode(&info)) {
|
710
|
-
return Handle<SharedFunctionInfo>::null();
|
711
|
-
}
|
712
|
-
} else {
|
713
|
-
// We fall back to the classic V8 code generator.
|
714
|
-
if (!AssignedVariablesAnalyzer::Analyze(&info) ||
|
715
|
-
!CodeGenerator::MakeCode(&info)) {
|
716
|
-
return Handle<SharedFunctionInfo>::null();
|
717
|
-
}
|
718
|
-
}
|
719
|
-
}
|
703
|
+
} else if ((V8::UseCrankshaft() && MakeCrankshaftCode(&info)) ||
|
704
|
+
(!V8::UseCrankshaft() && FullCodeGenerator::MakeCode(&info))) {
|
720
705
|
ASSERT(!info.code().is_null());
|
721
|
-
|
722
|
-
// Function compilation complete.
|
723
706
|
scope_info = SerializedScopeInfo::Create(info.scope());
|
707
|
+
} else {
|
708
|
+
return Handle<SharedFunctionInfo>::null();
|
724
709
|
}
|
725
710
|
|
726
711
|
// Create a shared function info object.
|
727
712
|
Handle<SharedFunctionInfo> result =
|
728
|
-
|
713
|
+
FACTORY->NewSharedFunctionInfo(literal->name(),
|
729
714
|
literal->materialized_literal_count(),
|
730
715
|
info.code(),
|
731
716
|
scope_info);
|
@@ -762,7 +747,6 @@ void Compiler::SetFunctionInfo(Handle<SharedFunctionInfo> function_info,
|
|
762
747
|
function_info->SetThisPropertyAssignmentsInfo(
|
763
748
|
lit->has_only_simple_this_property_assignments(),
|
764
749
|
*lit->this_property_assignments());
|
765
|
-
function_info->set_try_full_codegen(lit->try_full_codegen());
|
766
750
|
function_info->set_allows_lazy_compilation(lit->AllowsLazyCompilation());
|
767
751
|
function_info->set_strict_mode(lit->strict_mode());
|
768
752
|
}
|
@@ -777,20 +761,23 @@ void Compiler::RecordFunctionCompilation(Logger::LogEventsAndTags tag,
|
|
777
761
|
// Log the code generation. If source information is available include
|
778
762
|
// script name and line number. Check explicitly whether logging is
|
779
763
|
// enabled as finding the line number is not free.
|
780
|
-
if (
|
764
|
+
if (info->isolate()->logger()->is_logging() || CpuProfiler::is_profiling()) {
|
781
765
|
Handle<Script> script = info->script();
|
782
766
|
Handle<Code> code = info->code();
|
783
|
-
if (*code ==
|
767
|
+
if (*code == info->isolate()->builtins()->builtin(Builtins::kLazyCompile))
|
768
|
+
return;
|
784
769
|
if (script->name()->IsString()) {
|
785
770
|
int line_num = GetScriptLineNumber(script, shared->start_position()) + 1;
|
786
771
|
USE(line_num);
|
787
|
-
PROFILE(
|
772
|
+
PROFILE(info->isolate(),
|
773
|
+
CodeCreateEvent(Logger::ToNativeByScript(tag, *script),
|
788
774
|
*code,
|
789
775
|
*shared,
|
790
776
|
String::cast(script->name()),
|
791
777
|
line_num));
|
792
778
|
} else {
|
793
|
-
PROFILE(
|
779
|
+
PROFILE(info->isolate(),
|
780
|
+
CodeCreateEvent(Logger::ToNativeByScript(tag, *script),
|
794
781
|
*code,
|
795
782
|
*shared,
|
796
783
|
shared->DebugName()));
|