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
@@ -34,7 +34,7 @@ namespace v8 {
|
|
34
34
|
namespace internal {
|
35
35
|
|
36
36
|
// Forward declaration.
|
37
|
-
class
|
37
|
+
class CallWrapper;
|
38
38
|
|
39
39
|
// ----------------------------------------------------------------------------
|
40
40
|
// Static helper functions
|
@@ -90,14 +90,21 @@ enum ObjectToDoubleFlags {
|
|
90
90
|
// MacroAssembler implements a collection of frequently used macros.
|
91
91
|
class MacroAssembler: public Assembler {
|
92
92
|
public:
|
93
|
-
|
93
|
+
// The isolate parameter can be NULL if the macro assembler should
|
94
|
+
// not use isolate-dependent functionality. In this case, it's the
|
95
|
+
// responsibility of the caller to never invoke such function on the
|
96
|
+
// macro assembler.
|
97
|
+
MacroAssembler(Isolate* isolate, void* buffer, int size);
|
94
98
|
|
95
99
|
// Jump, Call, and Ret pseudo instructions implementing inter-working.
|
96
100
|
void Jump(Register target, Condition cond = al);
|
97
101
|
void Jump(byte* target, RelocInfo::Mode rmode, Condition cond = al);
|
98
102
|
void Jump(Handle<Code> code, RelocInfo::Mode rmode, Condition cond = al);
|
103
|
+
int CallSize(Register target, Condition cond = al);
|
99
104
|
void Call(Register target, Condition cond = al);
|
105
|
+
int CallSize(byte* target, RelocInfo::Mode rmode, Condition cond = al);
|
100
106
|
void Call(byte* target, RelocInfo::Mode rmode, Condition cond = al);
|
107
|
+
int CallSize(Handle<Code> code, RelocInfo::Mode rmode, Condition cond = al);
|
101
108
|
void Call(Handle<Code> code, RelocInfo::Mode rmode, Condition cond = al);
|
102
109
|
void Ret(Condition cond = al);
|
103
110
|
|
@@ -121,6 +128,15 @@ class MacroAssembler: public Assembler {
|
|
121
128
|
Condition cond = al);
|
122
129
|
void Sbfx(Register dst, Register src, int lsb, int width,
|
123
130
|
Condition cond = al);
|
131
|
+
// The scratch register is not used for ARMv7.
|
132
|
+
// scratch can be the same register as src (in which case it is trashed), but
|
133
|
+
// not the same as dst.
|
134
|
+
void Bfi(Register dst,
|
135
|
+
Register src,
|
136
|
+
Register scratch,
|
137
|
+
int lsb,
|
138
|
+
int width,
|
139
|
+
Condition cond = al);
|
124
140
|
void Bfc(Register dst, int lsb, int width, Condition cond = al);
|
125
141
|
void Usat(Register dst, int satpos, const Operand& src,
|
126
142
|
Condition cond = al);
|
@@ -234,6 +250,17 @@ class MacroAssembler: public Assembler {
|
|
234
250
|
}
|
235
251
|
}
|
236
252
|
|
253
|
+
// Pop two registers. Pops rightmost register first (from lower address).
|
254
|
+
void Pop(Register src1, Register src2, Condition cond = al) {
|
255
|
+
ASSERT(!src1.is(src2));
|
256
|
+
if (src1.code() > src2.code()) {
|
257
|
+
ldm(ia_w, sp, src1.bit() | src2.bit(), cond);
|
258
|
+
} else {
|
259
|
+
ldr(src2, MemOperand(sp, 4, PostIndex), cond);
|
260
|
+
ldr(src1, MemOperand(sp, 4, PostIndex), cond);
|
261
|
+
}
|
262
|
+
}
|
263
|
+
|
237
264
|
// Push and pop the registers that can hold pointers, as defined by the
|
238
265
|
// RegList constant kSafepointSavedRegisters.
|
239
266
|
void PushSafepointRegisters();
|
@@ -323,7 +350,7 @@ class MacroAssembler: public Assembler {
|
|
323
350
|
const ParameterCount& expected,
|
324
351
|
const ParameterCount& actual,
|
325
352
|
InvokeFlag flag,
|
326
|
-
|
353
|
+
CallWrapper* call_wrapper = NULL);
|
327
354
|
|
328
355
|
void InvokeCode(Handle<Code> code,
|
329
356
|
const ParameterCount& expected,
|
@@ -336,7 +363,7 @@ class MacroAssembler: public Assembler {
|
|
336
363
|
void InvokeFunction(Register function,
|
337
364
|
const ParameterCount& actual,
|
338
365
|
InvokeFlag flag,
|
339
|
-
|
366
|
+
CallWrapper* call_wrapper = NULL);
|
340
367
|
|
341
368
|
void InvokeFunction(JSFunction* function,
|
342
369
|
const ParameterCount& actual,
|
@@ -497,6 +524,14 @@ class MacroAssembler: public Assembler {
|
|
497
524
|
// Copies a fixed number of fields of heap objects from src to dst.
|
498
525
|
void CopyFields(Register dst, Register src, RegList temps, int field_count);
|
499
526
|
|
527
|
+
// Copies a number of bytes from src to dst. All registers are clobbered. On
|
528
|
+
// exit src and dst will point to the place just after where the last byte was
|
529
|
+
// read or written and length will be zero.
|
530
|
+
void CopyBytes(Register src,
|
531
|
+
Register dst,
|
532
|
+
Register length,
|
533
|
+
Register scratch);
|
534
|
+
|
500
535
|
// ---------------------------------------------------------------------------
|
501
536
|
// Support functions.
|
502
537
|
|
@@ -549,6 +584,11 @@ class MacroAssembler: public Assembler {
|
|
549
584
|
bool is_heap_object);
|
550
585
|
|
551
586
|
|
587
|
+
// Compare the object in a register to a value from the root list.
|
588
|
+
// Uses the ip register as scratch.
|
589
|
+
void CompareRoot(Register obj, Heap::RootListIndex index);
|
590
|
+
|
591
|
+
|
552
592
|
// Load and check the instance type of an object for being a string.
|
553
593
|
// Loads the type into the second argument register.
|
554
594
|
// Returns a condition that will be enabled if the object was a string.
|
@@ -613,6 +653,40 @@ class MacroAssembler: public Assembler {
|
|
613
653
|
DwVfpRegister double_scratch,
|
614
654
|
Label *not_int32);
|
615
655
|
|
656
|
+
// Truncates a double using a specific rounding mode.
|
657
|
+
// Clears the z flag (ne condition) if an overflow occurs.
|
658
|
+
// If exact_conversion is true, the z flag is also cleared if the conversion
|
659
|
+
// was inexact, ie. if the double value could not be converted exactly
|
660
|
+
// to a 32bit integer.
|
661
|
+
void EmitVFPTruncate(VFPRoundingMode rounding_mode,
|
662
|
+
SwVfpRegister result,
|
663
|
+
DwVfpRegister double_input,
|
664
|
+
Register scratch1,
|
665
|
+
Register scratch2,
|
666
|
+
CheckForInexactConversion check
|
667
|
+
= kDontCheckForInexactConversion);
|
668
|
+
|
669
|
+
// Helper for EmitECMATruncate.
|
670
|
+
// This will truncate a floating-point value outside of the singed 32bit
|
671
|
+
// integer range to a 32bit signed integer.
|
672
|
+
// Expects the double value loaded in input_high and input_low.
|
673
|
+
// Exits with the answer in 'result'.
|
674
|
+
// Note that this code does not work for values in the 32bit range!
|
675
|
+
void EmitOutOfInt32RangeTruncate(Register result,
|
676
|
+
Register input_high,
|
677
|
+
Register input_low,
|
678
|
+
Register scratch);
|
679
|
+
|
680
|
+
// Performs a truncating conversion of a floating point number as used by
|
681
|
+
// the JS bitwise operations. See ECMA-262 9.5: ToInt32.
|
682
|
+
// Exits with 'result' holding the answer and all other registers clobbered.
|
683
|
+
void EmitECMATruncate(Register result,
|
684
|
+
DwVfpRegister double_input,
|
685
|
+
SwVfpRegister single_scratch,
|
686
|
+
Register scratch,
|
687
|
+
Register scratch2,
|
688
|
+
Register scratch3);
|
689
|
+
|
616
690
|
// Count leading zeros in a 32 bit word. On ARM5 and later it uses the clz
|
617
691
|
// instruction. On pre-ARM5 hardware this routine gives the wrong answer
|
618
692
|
// for 0 (31 instead of 32). Source and scratch can be the same in which case
|
@@ -638,7 +712,7 @@ class MacroAssembler: public Assembler {
|
|
638
712
|
Condition cond = al);
|
639
713
|
|
640
714
|
// Call a runtime routine.
|
641
|
-
void CallRuntime(Runtime::Function* f, int num_arguments);
|
715
|
+
void CallRuntime(const Runtime::Function* f, int num_arguments);
|
642
716
|
void CallRuntimeSaveDoubles(Runtime::FunctionId id);
|
643
717
|
|
644
718
|
// Convenience function: Same as above, but takes the fid instead.
|
@@ -682,7 +756,7 @@ class MacroAssembler: public Assembler {
|
|
682
756
|
// return address (unless this is somehow accounted for by the called
|
683
757
|
// function).
|
684
758
|
void CallCFunction(ExternalReference function, int num_arguments);
|
685
|
-
void CallCFunction(Register function, int num_arguments);
|
759
|
+
void CallCFunction(Register function, Register scratch, int num_arguments);
|
686
760
|
|
687
761
|
void GetCFunctionDoubleResult(const DoubleRegister dst);
|
688
762
|
|
@@ -690,7 +764,7 @@ class MacroAssembler: public Assembler {
|
|
690
764
|
// from handle and propagates exceptions. Restores context.
|
691
765
|
// stack_space - space to be unwound on exit (includes the call js
|
692
766
|
// arguments space and the additional space allocated for the fast call).
|
693
|
-
MaybeObject* TryCallApiFunctionAndReturn(
|
767
|
+
MaybeObject* TryCallApiFunctionAndReturn(ExternalReference function,
|
694
768
|
int stack_space);
|
695
769
|
|
696
770
|
// Jump to a runtime routine.
|
@@ -702,7 +776,7 @@ class MacroAssembler: public Assembler {
|
|
702
776
|
// the unresolved list if the name does not resolve.
|
703
777
|
void InvokeBuiltin(Builtins::JavaScript id,
|
704
778
|
InvokeJSFlags flags,
|
705
|
-
|
779
|
+
CallWrapper* call_wrapper = NULL);
|
706
780
|
|
707
781
|
// Store the code object for the given builtin in the target register and
|
708
782
|
// setup the function in r1.
|
@@ -711,7 +785,10 @@ class MacroAssembler: public Assembler {
|
|
711
785
|
// Store the function for the given builtin in the target register.
|
712
786
|
void GetBuiltinFunction(Register target, Builtins::JavaScript id);
|
713
787
|
|
714
|
-
Handle<Object> CodeObject() {
|
788
|
+
Handle<Object> CodeObject() {
|
789
|
+
ASSERT(!code_object_.is_null());
|
790
|
+
return code_object_;
|
791
|
+
}
|
715
792
|
|
716
793
|
|
717
794
|
// ---------------------------------------------------------------------------
|
@@ -756,6 +833,16 @@ class MacroAssembler: public Assembler {
|
|
756
833
|
void JumpIfNotPowerOfTwoOrZero(Register reg,
|
757
834
|
Register scratch,
|
758
835
|
Label* not_power_of_two_or_zero);
|
836
|
+
// Check whether the value of reg is a power of two and not zero.
|
837
|
+
// Control falls through if it is, with scratch containing the mask
|
838
|
+
// value (reg - 1).
|
839
|
+
// Otherwise control jumps to the 'zero_and_neg' label if the value of reg is
|
840
|
+
// zero or negative, or jumps to the 'not_power_of_two' label if the value is
|
841
|
+
// strictly positive but not a power of two.
|
842
|
+
void JumpIfNotPowerOfTwoOrZeroAndNeg(Register reg,
|
843
|
+
Register scratch,
|
844
|
+
Label* zero_and_neg,
|
845
|
+
Label* not_power_of_two);
|
759
846
|
|
760
847
|
// ---------------------------------------------------------------------------
|
761
848
|
// Smi utilities
|
@@ -777,11 +864,11 @@ class MacroAssembler: public Assembler {
|
|
777
864
|
mov(reg, scratch);
|
778
865
|
}
|
779
866
|
|
780
|
-
void SmiUntag(Register reg) {
|
781
|
-
mov(reg, Operand(reg, ASR, kSmiTagSize));
|
867
|
+
void SmiUntag(Register reg, SBit s = LeaveCC) {
|
868
|
+
mov(reg, Operand(reg, ASR, kSmiTagSize), s);
|
782
869
|
}
|
783
|
-
void SmiUntag(Register dst, Register src) {
|
784
|
-
mov(dst, Operand(src, ASR, kSmiTagSize));
|
870
|
+
void SmiUntag(Register dst, Register src, SBit s = LeaveCC) {
|
871
|
+
mov(dst, Operand(src, ASR, kSmiTagSize), s);
|
785
872
|
}
|
786
873
|
|
787
874
|
// Jump the register contains a smi.
|
@@ -864,7 +951,13 @@ class MacroAssembler: public Assembler {
|
|
864
951
|
|
865
952
|
|
866
953
|
private:
|
954
|
+
void CallCFunctionHelper(Register function,
|
955
|
+
ExternalReference function_reference,
|
956
|
+
Register scratch,
|
957
|
+
int num_arguments);
|
958
|
+
|
867
959
|
void Jump(intptr_t target, RelocInfo::Mode rmode, Condition cond = al);
|
960
|
+
int CallSize(intptr_t target, RelocInfo::Mode rmode, Condition cond = al);
|
868
961
|
void Call(intptr_t target, RelocInfo::Mode rmode, Condition cond = al);
|
869
962
|
|
870
963
|
// Helper functions for generating invokes.
|
@@ -874,7 +967,7 @@ class MacroAssembler: public Assembler {
|
|
874
967
|
Register code_reg,
|
875
968
|
Label* done,
|
876
969
|
InvokeFlag flag,
|
877
|
-
|
970
|
+
CallWrapper* call_wrapper = NULL);
|
878
971
|
|
879
972
|
// Activation support.
|
880
973
|
void EnterFrame(StackFrame::Type type);
|
@@ -938,11 +1031,15 @@ class CodePatcher {
|
|
938
1031
|
// Helper class for generating code or data associated with the code
|
939
1032
|
// right after a call instruction. As an example this can be used to
|
940
1033
|
// generate safepoint data after calls for crankshaft.
|
941
|
-
class
|
1034
|
+
class CallWrapper {
|
942
1035
|
public:
|
943
|
-
|
944
|
-
virtual ~
|
945
|
-
|
1036
|
+
CallWrapper() { }
|
1037
|
+
virtual ~CallWrapper() { }
|
1038
|
+
// Called just before emitting a call. Argument is the size of the generated
|
1039
|
+
// call code.
|
1040
|
+
virtual void BeforeCall(int call_size) = 0;
|
1041
|
+
// Called just after emitting a call, i.e., at the return site for the call.
|
1042
|
+
virtual void AfterCall() = 0;
|
946
1043
|
};
|
947
1044
|
|
948
1045
|
|
@@ -60,6 +60,7 @@ namespace internal {
|
|
60
60
|
* Each call to a public method should retain this convention.
|
61
61
|
*
|
62
62
|
* The stack will have the following structure:
|
63
|
+
* - fp[52] Isolate* isolate (Address of the current isolate)
|
63
64
|
* - fp[48] direct_call (if 1, direct call from JavaScript code,
|
64
65
|
* if 0, call through the runtime system).
|
65
66
|
* - fp[44] stack_area_base (High end of the memory area to use as
|
@@ -115,7 +116,7 @@ namespace internal {
|
|
115
116
|
RegExpMacroAssemblerARM::RegExpMacroAssemblerARM(
|
116
117
|
Mode mode,
|
117
118
|
int registers_to_save)
|
118
|
-
: masm_(new MacroAssembler(NULL, kRegExpCodeSize)),
|
119
|
+
: masm_(new MacroAssembler(Isolate::Current(), NULL, kRegExpCodeSize)),
|
119
120
|
mode_(mode),
|
120
121
|
num_registers_(registers_to_save),
|
121
122
|
num_saved_registers_(registers_to_save),
|
@@ -346,7 +347,7 @@ void RegExpMacroAssemblerARM::CheckNotBackReferenceIgnoreCase(
|
|
346
347
|
__ sub(current_input_offset(), r2, end_of_input_address());
|
347
348
|
} else {
|
348
349
|
ASSERT(mode_ == UC16);
|
349
|
-
int argument_count =
|
350
|
+
int argument_count = 4;
|
350
351
|
__ PrepareCallCFunction(argument_count, r2);
|
351
352
|
|
352
353
|
// r0 - offset of start of capture
|
@@ -357,6 +358,7 @@ void RegExpMacroAssemblerARM::CheckNotBackReferenceIgnoreCase(
|
|
357
358
|
// r0: Address byte_offset1 - Address captured substring's start.
|
358
359
|
// r1: Address byte_offset2 - Address of current character position.
|
359
360
|
// r2: size_t byte_length - length of capture in bytes(!)
|
361
|
+
// r3: Isolate* isolate
|
360
362
|
|
361
363
|
// Address of start of capture.
|
362
364
|
__ add(r0, r0, Operand(end_of_input_address()));
|
@@ -366,9 +368,11 @@ void RegExpMacroAssemblerARM::CheckNotBackReferenceIgnoreCase(
|
|
366
368
|
__ mov(r4, Operand(r1));
|
367
369
|
// Address of current input position.
|
368
370
|
__ add(r1, current_input_offset(), Operand(end_of_input_address()));
|
371
|
+
// Isolate.
|
372
|
+
__ mov(r3, Operand(ExternalReference::isolate_address()));
|
369
373
|
|
370
374
|
ExternalReference function =
|
371
|
-
ExternalReference::re_case_insensitive_compare_uc16();
|
375
|
+
ExternalReference::re_case_insensitive_compare_uc16(masm_->isolate());
|
372
376
|
__ CallCFunction(function, argument_count);
|
373
377
|
|
374
378
|
// Check if function returned non-zero for success or zero for failure.
|
@@ -626,7 +630,7 @@ Handle<Object> RegExpMacroAssemblerARM::GetCode(Handle<String> source) {
|
|
626
630
|
Label stack_ok;
|
627
631
|
|
628
632
|
ExternalReference stack_limit =
|
629
|
-
ExternalReference::address_of_stack_limit();
|
633
|
+
ExternalReference::address_of_stack_limit(masm_->isolate());
|
630
634
|
__ mov(r0, Operand(stack_limit));
|
631
635
|
__ ldr(r0, MemOperand(r0));
|
632
636
|
__ sub(r0, sp, r0, SetCC);
|
@@ -777,12 +781,13 @@ Handle<Object> RegExpMacroAssemblerARM::GetCode(Handle<String> source) {
|
|
777
781
|
Label grow_failed;
|
778
782
|
|
779
783
|
// Call GrowStack(backtrack_stackpointer(), &stack_base)
|
780
|
-
static const int num_arguments =
|
784
|
+
static const int num_arguments = 3;
|
781
785
|
__ PrepareCallCFunction(num_arguments, r0);
|
782
786
|
__ mov(r0, backtrack_stackpointer());
|
783
787
|
__ add(r1, frame_pointer(), Operand(kStackHighEnd));
|
788
|
+
__ mov(r2, Operand(ExternalReference::isolate_address()));
|
784
789
|
ExternalReference grow_stack =
|
785
|
-
|
790
|
+
ExternalReference::re_grow_stack(masm_->isolate());
|
786
791
|
__ CallCFunction(grow_stack, num_arguments);
|
787
792
|
// If return NULL, we have failed to grow the stack, and
|
788
793
|
// must exit with a stack-overflow exception.
|
@@ -804,10 +809,10 @@ Handle<Object> RegExpMacroAssemblerARM::GetCode(Handle<String> source) {
|
|
804
809
|
|
805
810
|
CodeDesc code_desc;
|
806
811
|
masm_->GetCode(&code_desc);
|
807
|
-
Handle<Code> code =
|
812
|
+
Handle<Code> code = FACTORY->NewCode(code_desc,
|
808
813
|
Code::ComputeFlags(Code::REGEXP),
|
809
814
|
masm_->CodeObject());
|
810
|
-
PROFILE(RegExpCodeCreateEvent(*code, *source));
|
815
|
+
PROFILE(Isolate::Current(), RegExpCodeCreateEvent(*code, *source));
|
811
816
|
return Handle<Object>::cast(code);
|
812
817
|
}
|
813
818
|
|
@@ -998,7 +1003,7 @@ void RegExpMacroAssemblerARM::CallCheckStackGuardState(Register scratch) {
|
|
998
1003
|
__ mov(r1, Operand(masm_->CodeObject()));
|
999
1004
|
// r0 becomes return address pointer.
|
1000
1005
|
ExternalReference stack_guard_check =
|
1001
|
-
ExternalReference::re_check_stack_guard_state();
|
1006
|
+
ExternalReference::re_check_stack_guard_state(masm_->isolate());
|
1002
1007
|
CallCFunctionUsingStub(stack_guard_check, num_arguments);
|
1003
1008
|
}
|
1004
1009
|
|
@@ -1013,8 +1018,10 @@ static T& frame_entry(Address re_frame, int frame_offset) {
|
|
1013
1018
|
int RegExpMacroAssemblerARM::CheckStackGuardState(Address* return_address,
|
1014
1019
|
Code* re_code,
|
1015
1020
|
Address re_frame) {
|
1016
|
-
|
1017
|
-
|
1021
|
+
Isolate* isolate = frame_entry<Isolate*>(re_frame, kIsolate);
|
1022
|
+
ASSERT(isolate == Isolate::Current());
|
1023
|
+
if (isolate->stack_guard()->IsStackOverflow()) {
|
1024
|
+
isolate->StackOverflow();
|
1018
1025
|
return EXCEPTION;
|
1019
1026
|
}
|
1020
1027
|
|
@@ -1158,7 +1165,7 @@ void RegExpMacroAssemblerARM::Pop(Register target) {
|
|
1158
1165
|
void RegExpMacroAssemblerARM::CheckPreemption() {
|
1159
1166
|
// Check for preemption.
|
1160
1167
|
ExternalReference stack_limit =
|
1161
|
-
ExternalReference::address_of_stack_limit();
|
1168
|
+
ExternalReference::address_of_stack_limit(masm_->isolate());
|
1162
1169
|
__ mov(r0, Operand(stack_limit));
|
1163
1170
|
__ ldr(r0, MemOperand(r0));
|
1164
1171
|
__ cmp(sp, r0);
|
@@ -1168,7 +1175,7 @@ void RegExpMacroAssemblerARM::CheckPreemption() {
|
|
1168
1175
|
|
1169
1176
|
void RegExpMacroAssemblerARM::CheckStackLimit() {
|
1170
1177
|
ExternalReference stack_limit =
|
1171
|
-
ExternalReference::address_of_regexp_stack_limit();
|
1178
|
+
ExternalReference::address_of_regexp_stack_limit(masm_->isolate());
|
1172
1179
|
__ mov(r0, Operand(stack_limit));
|
1173
1180
|
__ ldr(r0, MemOperand(r0));
|
1174
1181
|
__ cmp(backtrack_stackpointer(), Operand(r0));
|
@@ -127,6 +127,7 @@ class RegExpMacroAssemblerARM: public NativeRegExpMacroAssembler {
|
|
127
127
|
static const int kRegisterOutput = kSecondaryReturnAddress + kPointerSize;
|
128
128
|
static const int kStackHighEnd = kRegisterOutput + kPointerSize;
|
129
129
|
static const int kDirectCall = kStackHighEnd + kPointerSize;
|
130
|
+
static const int kIsolate = kDirectCall + kPointerSize;
|
130
131
|
|
131
132
|
// Below the frame pointer.
|
132
133
|
// Register parameters stored by setup code.
|
@@ -49,12 +49,12 @@ namespace internal {
|
|
49
49
|
// Windows C Run-Time Library does not provide vsscanf.
|
50
50
|
#define SScanF sscanf // NOLINT
|
51
51
|
|
52
|
-
// The
|
52
|
+
// The ArmDebugger class is used by the simulator while debugging simulated ARM
|
53
53
|
// code.
|
54
|
-
class
|
54
|
+
class ArmDebugger {
|
55
55
|
public:
|
56
|
-
explicit
|
57
|
-
~
|
56
|
+
explicit ArmDebugger(Simulator* sim);
|
57
|
+
~ArmDebugger();
|
58
58
|
|
59
59
|
void Stop(Instruction* instr);
|
60
60
|
void Debug();
|
@@ -83,12 +83,12 @@ class Debugger {
|
|
83
83
|
};
|
84
84
|
|
85
85
|
|
86
|
-
|
86
|
+
ArmDebugger::ArmDebugger(Simulator* sim) {
|
87
87
|
sim_ = sim;
|
88
88
|
}
|
89
89
|
|
90
90
|
|
91
|
-
|
91
|
+
ArmDebugger::~ArmDebugger() {
|
92
92
|
}
|
93
93
|
|
94
94
|
|
@@ -105,7 +105,7 @@ static void InitializeCoverage() {
|
|
105
105
|
}
|
106
106
|
|
107
107
|
|
108
|
-
void
|
108
|
+
void ArmDebugger::Stop(Instruction* instr) {
|
109
109
|
// Get the stop code.
|
110
110
|
uint32_t code = instr->SvcValue() & kStopCodeMask;
|
111
111
|
// Retrieve the encoded address, which comes just after this stop.
|
@@ -137,7 +137,7 @@ static void InitializeCoverage() {
|
|
137
137
|
}
|
138
138
|
|
139
139
|
|
140
|
-
void
|
140
|
+
void ArmDebugger::Stop(Instruction* instr) {
|
141
141
|
// Get the stop code.
|
142
142
|
uint32_t code = instr->SvcValue() & kStopCodeMask;
|
143
143
|
// Retrieve the encoded address, which comes just after this stop.
|
@@ -159,7 +159,7 @@ void Debugger::Stop(Instruction* instr) {
|
|
159
159
|
#endif
|
160
160
|
|
161
161
|
|
162
|
-
int32_t
|
162
|
+
int32_t ArmDebugger::GetRegisterValue(int regnum) {
|
163
163
|
if (regnum == kPCRegister) {
|
164
164
|
return sim_->get_pc();
|
165
165
|
} else {
|
@@ -168,12 +168,12 @@ int32_t Debugger::GetRegisterValue(int regnum) {
|
|
168
168
|
}
|
169
169
|
|
170
170
|
|
171
|
-
double
|
171
|
+
double ArmDebugger::GetVFPDoubleRegisterValue(int regnum) {
|
172
172
|
return sim_->get_double_from_d_register(regnum);
|
173
173
|
}
|
174
174
|
|
175
175
|
|
176
|
-
bool
|
176
|
+
bool ArmDebugger::GetValue(const char* desc, int32_t* value) {
|
177
177
|
int regnum = Registers::Number(desc);
|
178
178
|
if (regnum != kNoRegister) {
|
179
179
|
*value = GetRegisterValue(regnum);
|
@@ -189,7 +189,7 @@ bool Debugger::GetValue(const char* desc, int32_t* value) {
|
|
189
189
|
}
|
190
190
|
|
191
191
|
|
192
|
-
bool
|
192
|
+
bool ArmDebugger::GetVFPSingleValue(const char* desc, float* value) {
|
193
193
|
bool is_double;
|
194
194
|
int regnum = VFPRegisters::Number(desc, &is_double);
|
195
195
|
if (regnum != kNoRegister && !is_double) {
|
@@ -200,7 +200,7 @@ bool Debugger::GetVFPSingleValue(const char* desc, float* value) {
|
|
200
200
|
}
|
201
201
|
|
202
202
|
|
203
|
-
bool
|
203
|
+
bool ArmDebugger::GetVFPDoubleValue(const char* desc, double* value) {
|
204
204
|
bool is_double;
|
205
205
|
int regnum = VFPRegisters::Number(desc, &is_double);
|
206
206
|
if (regnum != kNoRegister && is_double) {
|
@@ -211,7 +211,7 @@ bool Debugger::GetVFPDoubleValue(const char* desc, double* value) {
|
|
211
211
|
}
|
212
212
|
|
213
213
|
|
214
|
-
bool
|
214
|
+
bool ArmDebugger::SetBreakpoint(Instruction* breakpc) {
|
215
215
|
// Check if a breakpoint can be set. If not return without any side-effects.
|
216
216
|
if (sim_->break_pc_ != NULL) {
|
217
217
|
return false;
|
@@ -226,7 +226,7 @@ bool Debugger::SetBreakpoint(Instruction* breakpc) {
|
|
226
226
|
}
|
227
227
|
|
228
228
|
|
229
|
-
bool
|
229
|
+
bool ArmDebugger::DeleteBreakpoint(Instruction* breakpc) {
|
230
230
|
if (sim_->break_pc_ != NULL) {
|
231
231
|
sim_->break_pc_->SetInstructionBits(sim_->break_instr_);
|
232
232
|
}
|
@@ -237,21 +237,21 @@ bool Debugger::DeleteBreakpoint(Instruction* breakpc) {
|
|
237
237
|
}
|
238
238
|
|
239
239
|
|
240
|
-
void
|
240
|
+
void ArmDebugger::UndoBreakpoints() {
|
241
241
|
if (sim_->break_pc_ != NULL) {
|
242
242
|
sim_->break_pc_->SetInstructionBits(sim_->break_instr_);
|
243
243
|
}
|
244
244
|
}
|
245
245
|
|
246
246
|
|
247
|
-
void
|
247
|
+
void ArmDebugger::RedoBreakpoints() {
|
248
248
|
if (sim_->break_pc_ != NULL) {
|
249
249
|
sim_->break_pc_->SetInstructionBits(kBreakpointInstr);
|
250
250
|
}
|
251
251
|
}
|
252
252
|
|
253
253
|
|
254
|
-
void
|
254
|
+
void ArmDebugger::Debug() {
|
255
255
|
intptr_t last_pc = -1;
|
256
256
|
bool done = false;
|
257
257
|
|
@@ -316,16 +316,26 @@ void Debugger::Debug() {
|
|
316
316
|
}
|
317
317
|
for (int i = 0; i < kNumVFPDoubleRegisters; i++) {
|
318
318
|
dvalue = GetVFPDoubleRegisterValue(i);
|
319
|
-
|
320
|
-
|
319
|
+
uint64_t as_words = BitCast<uint64_t>(dvalue);
|
320
|
+
PrintF("%3s: %f 0x%08x %08x\n",
|
321
|
+
VFPRegisters::Name(i, true),
|
322
|
+
dvalue,
|
323
|
+
static_cast<uint32_t>(as_words >> 32),
|
324
|
+
static_cast<uint32_t>(as_words & 0xffffffff));
|
321
325
|
}
|
322
326
|
} else {
|
323
327
|
if (GetValue(arg1, &value)) {
|
324
328
|
PrintF("%s: 0x%08x %d \n", arg1, value, value);
|
325
329
|
} else if (GetVFPSingleValue(arg1, &svalue)) {
|
326
|
-
|
330
|
+
uint32_t as_word = BitCast<uint32_t>(svalue);
|
331
|
+
PrintF("%s: %f 0x%08x\n", arg1, svalue, as_word);
|
327
332
|
} else if (GetVFPDoubleValue(arg1, &dvalue)) {
|
328
|
-
|
333
|
+
uint64_t as_words = BitCast<uint64_t>(dvalue);
|
334
|
+
PrintF("%s: %f 0x%08x %08x\n",
|
335
|
+
arg1,
|
336
|
+
dvalue,
|
337
|
+
static_cast<uint32_t>(as_words >> 32),
|
338
|
+
static_cast<uint32_t>(as_words & 0xffffffff));
|
329
339
|
} else {
|
330
340
|
PrintF("%s unrecognized\n", arg1);
|
331
341
|
}
|
@@ -380,11 +390,24 @@ void Debugger::Debug() {
|
|
380
390
|
end = cur + words;
|
381
391
|
|
382
392
|
while (cur < end) {
|
383
|
-
PrintF(" 0x%08x: 0x%08x %10d
|
393
|
+
PrintF(" 0x%08x: 0x%08x %10d",
|
384
394
|
reinterpret_cast<intptr_t>(cur), *cur, *cur);
|
395
|
+
HeapObject* obj = reinterpret_cast<HeapObject*>(*cur);
|
396
|
+
int value = *cur;
|
397
|
+
Heap* current_heap = v8::internal::Isolate::Current()->heap();
|
398
|
+
if (current_heap->Contains(obj) || ((value & 1) == 0)) {
|
399
|
+
PrintF(" (");
|
400
|
+
if ((value & 1) == 0) {
|
401
|
+
PrintF("smi %d", value / 2);
|
402
|
+
} else {
|
403
|
+
obj->ShortPrint();
|
404
|
+
}
|
405
|
+
PrintF(")");
|
406
|
+
}
|
407
|
+
PrintF("\n");
|
385
408
|
cur++;
|
386
409
|
}
|
387
|
-
} else if (strcmp(cmd, "disasm") == 0) {
|
410
|
+
} else if (strcmp(cmd, "disasm") == 0 || strcmp(cmd, "di") == 0) {
|
388
411
|
disasm::NameConverter converter;
|
389
412
|
disasm::Disassembler dasm(converter);
|
390
413
|
// use a reasonably large buffer
|
@@ -398,11 +421,23 @@ void Debugger::Debug() {
|
|
398
421
|
cur = reinterpret_cast<byte*>(sim_->get_pc());
|
399
422
|
end = cur + (10 * Instruction::kInstrSize);
|
400
423
|
} else if (argc == 2) {
|
401
|
-
|
402
|
-
if (
|
403
|
-
|
404
|
-
|
405
|
-
|
424
|
+
int regnum = Registers::Number(arg1);
|
425
|
+
if (regnum != kNoRegister || strncmp(arg1, "0x", 2) == 0) {
|
426
|
+
// The argument is an address or a register name.
|
427
|
+
int32_t value;
|
428
|
+
if (GetValue(arg1, &value)) {
|
429
|
+
cur = reinterpret_cast<byte*>(value);
|
430
|
+
// Disassemble 10 instructions at <arg1>.
|
431
|
+
end = cur + (10 * Instruction::kInstrSize);
|
432
|
+
}
|
433
|
+
} else {
|
434
|
+
// The argument is the number of instructions.
|
435
|
+
int32_t value;
|
436
|
+
if (GetValue(arg1, &value)) {
|
437
|
+
cur = reinterpret_cast<byte*>(sim_->get_pc());
|
438
|
+
// Disassemble <arg1> instructions.
|
439
|
+
end = cur + (value * Instruction::kInstrSize);
|
440
|
+
}
|
406
441
|
}
|
407
442
|
} else {
|
408
443
|
int32_t value1;
|
@@ -524,8 +559,10 @@ void Debugger::Debug() {
|
|
524
559
|
PrintF("mem <address> [<words>]\n");
|
525
560
|
PrintF(" dump memory content, default dump 10 words)\n");
|
526
561
|
PrintF("disasm [<instructions>]\n");
|
527
|
-
PrintF("disasm [
|
528
|
-
PrintF("
|
562
|
+
PrintF("disasm [<address/register>]\n");
|
563
|
+
PrintF("disasm [[<address/register>] <instructions>]\n");
|
564
|
+
PrintF(" disassemble code, default is 10 instructions\n");
|
565
|
+
PrintF(" from pc (alias 'di')\n");
|
529
566
|
PrintF("gdb\n");
|
530
567
|
PrintF(" enter gdb\n");
|
531
568
|
PrintF("break <address>\n");
|
@@ -539,11 +576,11 @@ void Debugger::Debug() {
|
|
539
576
|
PrintF(" Stops are debug instructions inserted by\n");
|
540
577
|
PrintF(" the Assembler::stop() function.\n");
|
541
578
|
PrintF(" When hitting a stop, the Simulator will\n");
|
542
|
-
PrintF(" stop and and give control to the
|
579
|
+
PrintF(" stop and and give control to the ArmDebugger.\n");
|
543
580
|
PrintF(" The first %d stop codes are watched:\n",
|
544
581
|
Simulator::kNumOfWatchedStops);
|
545
582
|
PrintF(" - They can be enabled / disabled: the Simulator\n");
|
546
|
-
PrintF("
|
583
|
+
PrintF(" will / won't stop when hitting them.\n");
|
547
584
|
PrintF(" - The Simulator keeps track of how many times they \n");
|
548
585
|
PrintF(" are met. (See the info command.) Going over a\n");
|
549
586
|
PrintF(" disabled stop still increases its counter. \n");
|
@@ -593,7 +630,9 @@ static bool AllOnOnePage(uintptr_t start, int size) {
|
|
593
630
|
}
|
594
631
|
|
595
632
|
|
596
|
-
void Simulator::FlushICache(
|
633
|
+
void Simulator::FlushICache(v8::internal::HashMap* i_cache,
|
634
|
+
void* start_addr,
|
635
|
+
size_t size) {
|
597
636
|
intptr_t start = reinterpret_cast<intptr_t>(start_addr);
|
598
637
|
int intra_line = (start & CachePage::kLineMask);
|
599
638
|
start -= intra_line;
|
@@ -602,22 +641,22 @@ void Simulator::FlushICache(void* start_addr, size_t size) {
|
|
602
641
|
int offset = (start & CachePage::kPageMask);
|
603
642
|
while (!AllOnOnePage(start, size - 1)) {
|
604
643
|
int bytes_to_flush = CachePage::kPageSize - offset;
|
605
|
-
FlushOnePage(start, bytes_to_flush);
|
644
|
+
FlushOnePage(i_cache, start, bytes_to_flush);
|
606
645
|
start += bytes_to_flush;
|
607
646
|
size -= bytes_to_flush;
|
608
647
|
ASSERT_EQ(0, start & CachePage::kPageMask);
|
609
648
|
offset = 0;
|
610
649
|
}
|
611
650
|
if (size != 0) {
|
612
|
-
FlushOnePage(start, size);
|
651
|
+
FlushOnePage(i_cache, start, size);
|
613
652
|
}
|
614
653
|
}
|
615
654
|
|
616
655
|
|
617
|
-
CachePage* Simulator::GetCachePage(void* page) {
|
618
|
-
v8::internal::HashMap::Entry* entry =
|
619
|
-
|
620
|
-
|
656
|
+
CachePage* Simulator::GetCachePage(v8::internal::HashMap* i_cache, void* page) {
|
657
|
+
v8::internal::HashMap::Entry* entry = i_cache->Lookup(page,
|
658
|
+
ICacheHash(page),
|
659
|
+
true);
|
621
660
|
if (entry->value == NULL) {
|
622
661
|
CachePage* new_page = new CachePage();
|
623
662
|
entry->value = new_page;
|
@@ -627,25 +666,28 @@ CachePage* Simulator::GetCachePage(void* page) {
|
|
627
666
|
|
628
667
|
|
629
668
|
// Flush from start up to and not including start + size.
|
630
|
-
void Simulator::FlushOnePage(
|
669
|
+
void Simulator::FlushOnePage(v8::internal::HashMap* i_cache,
|
670
|
+
intptr_t start,
|
671
|
+
int size) {
|
631
672
|
ASSERT(size <= CachePage::kPageSize);
|
632
673
|
ASSERT(AllOnOnePage(start, size - 1));
|
633
674
|
ASSERT((start & CachePage::kLineMask) == 0);
|
634
675
|
ASSERT((size & CachePage::kLineMask) == 0);
|
635
676
|
void* page = reinterpret_cast<void*>(start & (~CachePage::kPageMask));
|
636
677
|
int offset = (start & CachePage::kPageMask);
|
637
|
-
CachePage* cache_page = GetCachePage(page);
|
678
|
+
CachePage* cache_page = GetCachePage(i_cache, page);
|
638
679
|
char* valid_bytemap = cache_page->ValidityByte(offset);
|
639
680
|
memset(valid_bytemap, CachePage::LINE_INVALID, size >> CachePage::kLineShift);
|
640
681
|
}
|
641
682
|
|
642
683
|
|
643
|
-
void Simulator::CheckICache(
|
684
|
+
void Simulator::CheckICache(v8::internal::HashMap* i_cache,
|
685
|
+
Instruction* instr) {
|
644
686
|
intptr_t address = reinterpret_cast<intptr_t>(instr);
|
645
687
|
void* page = reinterpret_cast<void*>(address & (~CachePage::kPageMask));
|
646
688
|
void* line = reinterpret_cast<void*>(address & (~CachePage::kLineMask));
|
647
689
|
int offset = (address & CachePage::kPageMask);
|
648
|
-
CachePage* cache_page = GetCachePage(page);
|
690
|
+
CachePage* cache_page = GetCachePage(i_cache, page);
|
649
691
|
char* cache_valid_byte = cache_page->ValidityByte(offset);
|
650
692
|
bool cache_hit = (*cache_valid_byte == CachePage::LINE_VALID);
|
651
693
|
char* cached_line = cache_page->CachedData(offset & ~CachePage::kLineMask);
|
@@ -662,27 +704,18 @@ void Simulator::CheckICache(Instruction* instr) {
|
|
662
704
|
}
|
663
705
|
|
664
706
|
|
665
|
-
// Create one simulator per thread and keep it in thread local storage.
|
666
|
-
static v8::internal::Thread::LocalStorageKey simulator_key;
|
667
|
-
|
668
|
-
|
669
|
-
bool Simulator::initialized_ = false;
|
670
|
-
|
671
|
-
|
672
707
|
void Simulator::Initialize() {
|
673
|
-
if (
|
674
|
-
|
675
|
-
initialized_ = true;
|
708
|
+
if (Isolate::Current()->simulator_initialized()) return;
|
709
|
+
Isolate::Current()->set_simulator_initialized(true);
|
676
710
|
::v8::internal::ExternalReference::set_redirector(&RedirectExternalReference);
|
677
711
|
}
|
678
712
|
|
679
713
|
|
680
|
-
|
681
|
-
|
682
|
-
|
683
|
-
Simulator::Simulator() {
|
714
|
+
Simulator::Simulator() : isolate_(Isolate::Current()) {
|
715
|
+
i_cache_ = isolate_->simulator_i_cache();
|
684
716
|
if (i_cache_ == NULL) {
|
685
717
|
i_cache_ = new v8::internal::HashMap(&ICacheMatch);
|
718
|
+
isolate_->set_simulator_i_cache(i_cache_);
|
686
719
|
}
|
687
720
|
Initialize();
|
688
721
|
// Setup simulator support first. Some of this information is needed to
|
@@ -748,11 +781,14 @@ class Redirection {
|
|
748
781
|
: external_function_(external_function),
|
749
782
|
swi_instruction_(al | (0xf*B24) | kCallRtRedirected),
|
750
783
|
type_(type),
|
751
|
-
next_(
|
752
|
-
|
753
|
-
|
754
|
-
|
755
|
-
|
784
|
+
next_(NULL) {
|
785
|
+
Isolate* isolate = Isolate::Current();
|
786
|
+
next_ = isolate->simulator_redirection();
|
787
|
+
Simulator::current(isolate)->
|
788
|
+
FlushICache(isolate->simulator_i_cache(),
|
789
|
+
reinterpret_cast<void*>(&swi_instruction_),
|
790
|
+
Instruction::kInstrSize);
|
791
|
+
isolate->set_simulator_redirection(this);
|
756
792
|
}
|
757
793
|
|
758
794
|
void* address_of_swi_instruction() {
|
@@ -764,8 +800,9 @@ class Redirection {
|
|
764
800
|
|
765
801
|
static Redirection* Get(void* external_function,
|
766
802
|
ExternalReference::Type type) {
|
767
|
-
|
768
|
-
|
803
|
+
Isolate* isolate = Isolate::Current();
|
804
|
+
Redirection* current = isolate->simulator_redirection();
|
805
|
+
for (; current != NULL; current = current->next_) {
|
769
806
|
if (current->external_function_ == external_function) return current;
|
770
807
|
}
|
771
808
|
return new Redirection(external_function, type);
|
@@ -783,13 +820,9 @@ class Redirection {
|
|
783
820
|
uint32_t swi_instruction_;
|
784
821
|
ExternalReference::Type type_;
|
785
822
|
Redirection* next_;
|
786
|
-
static Redirection* list_;
|
787
823
|
};
|
788
824
|
|
789
825
|
|
790
|
-
Redirection* Redirection::list_ = NULL;
|
791
|
-
|
792
|
-
|
793
826
|
void* Simulator::RedirectExternalReference(void* external_function,
|
794
827
|
ExternalReference::Type type) {
|
795
828
|
Redirection* redirection = Redirection::Get(external_function, type);
|
@@ -798,14 +831,20 @@ void* Simulator::RedirectExternalReference(void* external_function,
|
|
798
831
|
|
799
832
|
|
800
833
|
// Get the active Simulator for the current thread.
|
801
|
-
Simulator* Simulator::current() {
|
802
|
-
|
803
|
-
|
804
|
-
|
834
|
+
Simulator* Simulator::current(Isolate* isolate) {
|
835
|
+
v8::internal::Isolate::PerIsolateThreadData* isolate_data =
|
836
|
+
Isolate::CurrentPerIsolateThreadData();
|
837
|
+
if (isolate_data == NULL) {
|
838
|
+
Isolate::EnterDefaultIsolate();
|
839
|
+
isolate_data = Isolate::CurrentPerIsolateThreadData();
|
840
|
+
}
|
841
|
+
ASSERT(isolate_data != NULL);
|
842
|
+
|
843
|
+
Simulator* sim = isolate_data->simulator();
|
805
844
|
if (sim == NULL) {
|
806
|
-
// TODO(146): delete the simulator object when a thread goes away.
|
845
|
+
// TODO(146): delete the simulator object when a thread/isolate goes away.
|
807
846
|
sim = new Simulator();
|
808
|
-
|
847
|
+
isolate_data->set_simulator(sim);
|
809
848
|
}
|
810
849
|
return sim;
|
811
850
|
}
|
@@ -1005,7 +1044,9 @@ int Simulator::ReadW(int32_t addr, Instruction* instr) {
|
|
1005
1044
|
intptr_t* ptr = reinterpret_cast<intptr_t*>(addr);
|
1006
1045
|
return *ptr;
|
1007
1046
|
}
|
1008
|
-
PrintF("Unaligned read at 0x%08x, pc
|
1047
|
+
PrintF("Unaligned read at 0x%08x, pc=0x%08" V8PRIxPTR "\n",
|
1048
|
+
addr,
|
1049
|
+
reinterpret_cast<intptr_t>(instr));
|
1009
1050
|
UNIMPLEMENTED();
|
1010
1051
|
return 0;
|
1011
1052
|
#endif
|
@@ -1023,7 +1064,9 @@ void Simulator::WriteW(int32_t addr, int value, Instruction* instr) {
|
|
1023
1064
|
*ptr = value;
|
1024
1065
|
return;
|
1025
1066
|
}
|
1026
|
-
PrintF("Unaligned write at 0x%08x, pc
|
1067
|
+
PrintF("Unaligned write at 0x%08x, pc=0x%08" V8PRIxPTR "\n",
|
1068
|
+
addr,
|
1069
|
+
reinterpret_cast<intptr_t>(instr));
|
1027
1070
|
UNIMPLEMENTED();
|
1028
1071
|
#endif
|
1029
1072
|
}
|
@@ -1038,7 +1081,9 @@ uint16_t Simulator::ReadHU(int32_t addr, Instruction* instr) {
|
|
1038
1081
|
uint16_t* ptr = reinterpret_cast<uint16_t*>(addr);
|
1039
1082
|
return *ptr;
|
1040
1083
|
}
|
1041
|
-
PrintF("Unaligned unsigned halfword read at 0x%08x, pc
|
1084
|
+
PrintF("Unaligned unsigned halfword read at 0x%08x, pc=0x%08" V8PRIxPTR "\n",
|
1085
|
+
addr,
|
1086
|
+
reinterpret_cast<intptr_t>(instr));
|
1042
1087
|
UNIMPLEMENTED();
|
1043
1088
|
return 0;
|
1044
1089
|
#endif
|
@@ -1072,7 +1117,9 @@ void Simulator::WriteH(int32_t addr, uint16_t value, Instruction* instr) {
|
|
1072
1117
|
*ptr = value;
|
1073
1118
|
return;
|
1074
1119
|
}
|
1075
|
-
PrintF("Unaligned unsigned halfword write at 0x%08x, pc
|
1120
|
+
PrintF("Unaligned unsigned halfword write at 0x%08x, pc=0x%08" V8PRIxPTR "\n",
|
1121
|
+
addr,
|
1122
|
+
reinterpret_cast<intptr_t>(instr));
|
1076
1123
|
UNIMPLEMENTED();
|
1077
1124
|
#endif
|
1078
1125
|
}
|
@@ -1089,7 +1136,9 @@ void Simulator::WriteH(int32_t addr, int16_t value, Instruction* instr) {
|
|
1089
1136
|
*ptr = value;
|
1090
1137
|
return;
|
1091
1138
|
}
|
1092
|
-
PrintF("Unaligned halfword write at 0x%08x, pc
|
1139
|
+
PrintF("Unaligned halfword write at 0x%08x, pc=0x%08" V8PRIxPTR "\n",
|
1140
|
+
addr,
|
1141
|
+
reinterpret_cast<intptr_t>(instr));
|
1093
1142
|
UNIMPLEMENTED();
|
1094
1143
|
#endif
|
1095
1144
|
}
|
@@ -1523,7 +1572,8 @@ typedef int64_t (*SimulatorRuntimeCall)(int32_t arg0,
|
|
1523
1572
|
int32_t arg1,
|
1524
1573
|
int32_t arg2,
|
1525
1574
|
int32_t arg3,
|
1526
|
-
int32_t arg4
|
1575
|
+
int32_t arg4,
|
1576
|
+
int32_t arg5);
|
1527
1577
|
typedef double (*SimulatorRuntimeFPCall)(int32_t arg0,
|
1528
1578
|
int32_t arg1,
|
1529
1579
|
int32_t arg2,
|
@@ -1531,7 +1581,11 @@ typedef double (*SimulatorRuntimeFPCall)(int32_t arg0,
|
|
1531
1581
|
|
1532
1582
|
// This signature supports direct call in to API function native callback
|
1533
1583
|
// (refer to InvocationCallback in v8.h).
|
1534
|
-
typedef v8::Handle<v8::Value> (*
|
1584
|
+
typedef v8::Handle<v8::Value> (*SimulatorRuntimeDirectApiCall)(int32_t arg0);
|
1585
|
+
|
1586
|
+
// This signature supports direct call to accessor getter callback.
|
1587
|
+
typedef v8::Handle<v8::Value> (*SimulatorRuntimeDirectGetterCall)(int32_t arg0,
|
1588
|
+
int32_t arg1);
|
1535
1589
|
|
1536
1590
|
// Software interrupt instructions are used by the simulator to call into the
|
1537
1591
|
// C-based V8 runtime.
|
@@ -1550,7 +1604,8 @@ void Simulator::SoftwareInterrupt(Instruction* instr) {
|
|
1550
1604
|
int32_t arg2 = get_register(r2);
|
1551
1605
|
int32_t arg3 = get_register(r3);
|
1552
1606
|
int32_t* stack_pointer = reinterpret_cast<int32_t*>(get_register(sp));
|
1553
|
-
int32_t arg4 =
|
1607
|
+
int32_t arg4 = stack_pointer[0];
|
1608
|
+
int32_t arg5 = stack_pointer[1];
|
1554
1609
|
// This is dodgy but it works because the C entry stubs are never moved.
|
1555
1610
|
// See comment in codegen-arm.cc and bug 1242173.
|
1556
1611
|
int32_t saved_lr = get_register(lr);
|
@@ -1572,14 +1627,12 @@ void Simulator::SoftwareInterrupt(Instruction* instr) {
|
|
1572
1627
|
CHECK(stack_aligned);
|
1573
1628
|
double result = target(arg0, arg1, arg2, arg3);
|
1574
1629
|
SetFpResult(result);
|
1575
|
-
} else if (redirection->type() == ExternalReference::
|
1576
|
-
|
1577
|
-
reinterpret_cast<
|
1630
|
+
} else if (redirection->type() == ExternalReference::DIRECT_API_CALL) {
|
1631
|
+
SimulatorRuntimeDirectApiCall target =
|
1632
|
+
reinterpret_cast<SimulatorRuntimeDirectApiCall>(external);
|
1578
1633
|
if (::v8::internal::FLAG_trace_sim || !stack_aligned) {
|
1579
|
-
PrintF(
|
1580
|
-
|
1581
|
-
FUNCTION_ADDR(target),
|
1582
|
-
arg0);
|
1634
|
+
PrintF("Call to host function at %p args %08x",
|
1635
|
+
FUNCTION_ADDR(target), arg0);
|
1583
1636
|
if (!stack_aligned) {
|
1584
1637
|
PrintF(" with unaligned stack %08x\n", get_register(sp));
|
1585
1638
|
}
|
@@ -1591,6 +1644,23 @@ void Simulator::SoftwareInterrupt(Instruction* instr) {
|
|
1591
1644
|
PrintF("Returned %p\n", reinterpret_cast<void *>(*result));
|
1592
1645
|
}
|
1593
1646
|
set_register(r0, (int32_t) *result);
|
1647
|
+
} else if (redirection->type() == ExternalReference::DIRECT_GETTER_CALL) {
|
1648
|
+
SimulatorRuntimeDirectGetterCall target =
|
1649
|
+
reinterpret_cast<SimulatorRuntimeDirectGetterCall>(external);
|
1650
|
+
if (::v8::internal::FLAG_trace_sim || !stack_aligned) {
|
1651
|
+
PrintF("Call to host function at %p args %08x %08x",
|
1652
|
+
FUNCTION_ADDR(target), arg0, arg1);
|
1653
|
+
if (!stack_aligned) {
|
1654
|
+
PrintF(" with unaligned stack %08x\n", get_register(sp));
|
1655
|
+
}
|
1656
|
+
PrintF("\n");
|
1657
|
+
}
|
1658
|
+
CHECK(stack_aligned);
|
1659
|
+
v8::Handle<v8::Value> result = target(arg0, arg1);
|
1660
|
+
if (::v8::internal::FLAG_trace_sim) {
|
1661
|
+
PrintF("Returned %p\n", reinterpret_cast<void *>(*result));
|
1662
|
+
}
|
1663
|
+
set_register(r0, (int32_t) *result);
|
1594
1664
|
} else {
|
1595
1665
|
// builtin call.
|
1596
1666
|
ASSERT(redirection->type() == ExternalReference::BUILTIN_CALL);
|
@@ -1598,20 +1668,22 @@ void Simulator::SoftwareInterrupt(Instruction* instr) {
|
|
1598
1668
|
reinterpret_cast<SimulatorRuntimeCall>(external);
|
1599
1669
|
if (::v8::internal::FLAG_trace_sim || !stack_aligned) {
|
1600
1670
|
PrintF(
|
1601
|
-
"Call to host function at %p
|
1671
|
+
"Call to host function at %p"
|
1672
|
+
"args %08x, %08x, %08x, %08x, %08x, %08x",
|
1602
1673
|
FUNCTION_ADDR(target),
|
1603
1674
|
arg0,
|
1604
1675
|
arg1,
|
1605
1676
|
arg2,
|
1606
1677
|
arg3,
|
1607
|
-
arg4
|
1678
|
+
arg4,
|
1679
|
+
arg5);
|
1608
1680
|
if (!stack_aligned) {
|
1609
1681
|
PrintF(" with unaligned stack %08x\n", get_register(sp));
|
1610
1682
|
}
|
1611
1683
|
PrintF("\n");
|
1612
1684
|
}
|
1613
1685
|
CHECK(stack_aligned);
|
1614
|
-
int64_t result = target(arg0, arg1, arg2, arg3, arg4);
|
1686
|
+
int64_t result = target(arg0, arg1, arg2, arg3, arg4, arg5);
|
1615
1687
|
int32_t lo_res = static_cast<int32_t>(result);
|
1616
1688
|
int32_t hi_res = static_cast<int32_t>(result >> 32);
|
1617
1689
|
if (::v8::internal::FLAG_trace_sim) {
|
@@ -1625,7 +1697,7 @@ void Simulator::SoftwareInterrupt(Instruction* instr) {
|
|
1625
1697
|
break;
|
1626
1698
|
}
|
1627
1699
|
case kBreakpoint: {
|
1628
|
-
|
1700
|
+
ArmDebugger dbg(this);
|
1629
1701
|
dbg.Debug();
|
1630
1702
|
break;
|
1631
1703
|
}
|
@@ -1639,7 +1711,7 @@ void Simulator::SoftwareInterrupt(Instruction* instr) {
|
|
1639
1711
|
// Stop if it is enabled, otherwise go on jumping over the stop
|
1640
1712
|
// and the message address.
|
1641
1713
|
if (isEnabledStop(code)) {
|
1642
|
-
|
1714
|
+
ArmDebugger dbg(this);
|
1643
1715
|
dbg.Stop(instr);
|
1644
1716
|
} else {
|
1645
1717
|
set_pc(get_pc() + 2 * Instruction::kInstrSize);
|
@@ -1947,7 +2019,7 @@ void Simulator::DecodeType01(Instruction* instr) {
|
|
1947
2019
|
break;
|
1948
2020
|
}
|
1949
2021
|
case BKPT: {
|
1950
|
-
|
2022
|
+
ArmDebugger dbg(this);
|
1951
2023
|
PrintF("Simulator hit BKPT.\n");
|
1952
2024
|
dbg.Debug();
|
1953
2025
|
break;
|
@@ -2438,6 +2510,8 @@ void Simulator::DecodeType7(Instruction* instr) {
|
|
2438
2510
|
// vmov :Rt = Sn
|
2439
2511
|
// vcvt: Dd = Sm
|
2440
2512
|
// vcvt: Sd = Dm
|
2513
|
+
// Dd = vabs(Dm)
|
2514
|
+
// Dd = vneg(Dm)
|
2441
2515
|
// Dd = vadd(Dn, Dm)
|
2442
2516
|
// Dd = vsub(Dn, Dm)
|
2443
2517
|
// Dd = vmul(Dn, Dm)
|
@@ -2473,6 +2547,11 @@ void Simulator::DecodeTypeVFP(Instruction* instr) {
|
|
2473
2547
|
double dm_value = get_double_from_d_register(vm);
|
2474
2548
|
double dd_value = fabs(dm_value);
|
2475
2549
|
set_d_register_from_double(vd, dd_value);
|
2550
|
+
} else if ((instr->Opc2Value() == 0x1) && (instr->Opc3Value() == 0x1)) {
|
2551
|
+
// vneg
|
2552
|
+
double dm_value = get_double_from_d_register(vm);
|
2553
|
+
double dd_value = -dm_value;
|
2554
|
+
set_d_register_from_double(vd, dd_value);
|
2476
2555
|
} else if ((instr->Opc2Value() == 0x7) && (instr->Opc3Value() == 0x3)) {
|
2477
2556
|
DecodeVCVTBetweenDoubleAndSingle(instr);
|
2478
2557
|
} else if ((instr->Opc2Value() == 0x8) && (instr->Opc3Value() & 0x1)) {
|
@@ -2535,6 +2614,7 @@ void Simulator::DecodeTypeVFP(Instruction* instr) {
|
|
2535
2614
|
double dn_value = get_double_from_d_register(vn);
|
2536
2615
|
double dm_value = get_double_from_d_register(vm);
|
2537
2616
|
double dd_value = dn_value / dm_value;
|
2617
|
+
div_zero_vfp_flag_ = (dm_value == 0);
|
2538
2618
|
set_d_register_from_double(vd, dd_value);
|
2539
2619
|
} else {
|
2540
2620
|
UNIMPLEMENTED(); // Not used by V8.
|
@@ -2769,14 +2849,17 @@ void Simulator::DecodeVCVTBetweenFloatingPointAndInteger(Instruction* instr) {
|
|
2769
2849
|
|
2770
2850
|
inv_op_vfp_flag_ = get_inv_op_vfp_flag(mode, val, unsigned_integer);
|
2771
2851
|
|
2852
|
+
double abs_diff =
|
2853
|
+
unsigned_integer ? fabs(val - static_cast<uint32_t>(temp))
|
2854
|
+
: fabs(val - temp);
|
2855
|
+
|
2856
|
+
inexact_vfp_flag_ = (abs_diff != 0);
|
2857
|
+
|
2772
2858
|
if (inv_op_vfp_flag_) {
|
2773
2859
|
temp = VFPConversionSaturate(val, unsigned_integer);
|
2774
2860
|
} else {
|
2775
2861
|
switch (mode) {
|
2776
2862
|
case RN: {
|
2777
|
-
double abs_diff =
|
2778
|
-
unsigned_integer ? fabs(val - static_cast<uint32_t>(temp))
|
2779
|
-
: fabs(val - temp);
|
2780
2863
|
int val_sign = (val > 0) ? 1 : -1;
|
2781
2864
|
if (abs_diff > 0.5) {
|
2782
2865
|
temp += val_sign;
|
@@ -2924,7 +3007,7 @@ void Simulator::DecodeType6CoprocessorIns(Instruction* instr) {
|
|
2924
3007
|
// Executes the current instruction.
|
2925
3008
|
void Simulator::InstructionDecode(Instruction* instr) {
|
2926
3009
|
if (v8::internal::FLAG_check_icache) {
|
2927
|
-
CheckICache(instr);
|
3010
|
+
CheckICache(isolate_->simulator_i_cache(), instr);
|
2928
3011
|
}
|
2929
3012
|
pc_modified_ = false;
|
2930
3013
|
if (::v8::internal::FLAG_trace_sim) {
|
@@ -3007,7 +3090,7 @@ void Simulator::Execute() {
|
|
3007
3090
|
Instruction* instr = reinterpret_cast<Instruction*>(program_counter);
|
3008
3091
|
icount_++;
|
3009
3092
|
if (icount_ == ::v8::internal::FLAG_stop_sim_at) {
|
3010
|
-
|
3093
|
+
ArmDebugger dbg(this);
|
3011
3094
|
dbg.Debug();
|
3012
3095
|
} else {
|
3013
3096
|
InstructionDecode(instr);
|