OLD | NEW |
1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/interpreter/interpreter.h" | 5 #include "src/interpreter/interpreter.h" |
6 | 6 |
7 #include <fstream> | 7 #include <fstream> |
8 #include <memory> | 8 #include <memory> |
9 | 9 |
10 #include "src/ast/prettyprinter.h" | 10 #include "src/ast/prettyprinter.h" |
(...skipping 1836 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1847 // Jump by number of bytes in the Smi in the |idx| entry in the constant pool | 1847 // Jump by number of bytes in the Smi in the |idx| entry in the constant pool |
1848 // if the object referenced by the accumulator is the hole constant. | 1848 // if the object referenced by the accumulator is the hole constant. |
1849 void Interpreter::DoJumpIfNotHoleConstant(InterpreterAssembler* assembler) { | 1849 void Interpreter::DoJumpIfNotHoleConstant(InterpreterAssembler* assembler) { |
1850 Node* accumulator = __ GetAccumulator(); | 1850 Node* accumulator = __ GetAccumulator(); |
1851 Node* the_hole_value = __ HeapConstant(isolate_->factory()->the_hole_value()); | 1851 Node* the_hole_value = __ HeapConstant(isolate_->factory()->the_hole_value()); |
1852 Node* index = __ BytecodeOperandIdx(0); | 1852 Node* index = __ BytecodeOperandIdx(0); |
1853 Node* relative_jump = __ LoadAndUntagConstantPoolEntry(index); | 1853 Node* relative_jump = __ LoadAndUntagConstantPoolEntry(index); |
1854 __ JumpIfWordNotEqual(accumulator, the_hole_value, relative_jump); | 1854 __ JumpIfWordNotEqual(accumulator, the_hole_value, relative_jump); |
1855 } | 1855 } |
1856 | 1856 |
| 1857 // JumpLoop <imm> <loop_depth> |
| 1858 // |
| 1859 // Jump by number of bytes represented by the immediate operand |imm|. Also |
| 1860 // performs a loop nesting check and potentially triggers OSR in case the |
| 1861 // current OSR level matches (or exceeds) the specified |loop_depth|. |
| 1862 void Interpreter::DoJumpLoop(InterpreterAssembler* assembler) { |
| 1863 Node* relative_jump = __ BytecodeOperandImm(0); |
| 1864 Node* loop_depth = __ BytecodeOperandImm(1); |
| 1865 Node* osr_level = __ LoadOSRNestingLevel(); |
| 1866 |
| 1867 // Check if OSR points at the given {loop_depth} are armed by comparing it to |
| 1868 // the current {osr_level} loaded from the header of the BytecodeArray. |
| 1869 Label ok(assembler), osr_armed(assembler, Label::kDeferred); |
| 1870 Node* condition = __ Int32GreaterThanOrEqual(loop_depth, osr_level); |
| 1871 __ Branch(condition, &ok, &osr_armed); |
| 1872 |
| 1873 __ Bind(&ok); |
| 1874 __ Jump(relative_jump); |
| 1875 |
| 1876 __ Bind(&osr_armed); |
| 1877 { |
| 1878 Callable callable = CodeFactory::InterpreterOnStackReplacement(isolate_); |
| 1879 Node* target = __ HeapConstant(callable.code()); |
| 1880 Node* context = __ GetContext(); |
| 1881 __ CallStub(callable.descriptor(), target, context); |
| 1882 __ Jump(relative_jump); |
| 1883 } |
| 1884 } |
| 1885 |
1857 // CreateRegExpLiteral <pattern_idx> <literal_idx> <flags> | 1886 // CreateRegExpLiteral <pattern_idx> <literal_idx> <flags> |
1858 // | 1887 // |
1859 // Creates a regular expression literal for literal index <literal_idx> with | 1888 // Creates a regular expression literal for literal index <literal_idx> with |
1860 // <flags> and the pattern in <pattern_idx>. | 1889 // <flags> and the pattern in <pattern_idx>. |
1861 void Interpreter::DoCreateRegExpLiteral(InterpreterAssembler* assembler) { | 1890 void Interpreter::DoCreateRegExpLiteral(InterpreterAssembler* assembler) { |
1862 Node* index = __ BytecodeOperandIdx(0); | 1891 Node* index = __ BytecodeOperandIdx(0); |
1863 Node* pattern = __ LoadConstantPoolEntry(index); | 1892 Node* pattern = __ LoadConstantPoolEntry(index); |
1864 Node* literal_index_raw = __ BytecodeOperandIdx(1); | 1893 Node* literal_index_raw = __ BytecodeOperandIdx(1); |
1865 Node* literal_index = __ SmiTag(literal_index_raw); | 1894 Node* literal_index = __ SmiTag(literal_index_raw); |
1866 Node* flags_raw = __ BytecodeOperandFlag(2); | 1895 Node* flags_raw = __ BytecodeOperandFlag(2); |
(...skipping 250 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2117 __ Dispatch(); | 2146 __ Dispatch(); |
2118 | 2147 |
2119 __ Bind(&stack_check_interrupt); | 2148 __ Bind(&stack_check_interrupt); |
2120 { | 2149 { |
2121 Node* context = __ GetContext(); | 2150 Node* context = __ GetContext(); |
2122 __ CallRuntime(Runtime::kStackGuard, context); | 2151 __ CallRuntime(Runtime::kStackGuard, context); |
2123 __ Dispatch(); | 2152 __ Dispatch(); |
2124 } | 2153 } |
2125 } | 2154 } |
2126 | 2155 |
2127 // OsrPoll <loop_depth> | |
2128 // | |
2129 // Performs a loop nesting check and potentially triggers OSR. | |
2130 void Interpreter::DoOsrPoll(InterpreterAssembler* assembler) { | |
2131 Node* loop_depth = __ BytecodeOperandImm(0); | |
2132 Node* osr_level = __ LoadOSRNestingLevel(); | |
2133 | |
2134 // Check if OSR points at the given {loop_depth} are armed by comparing it to | |
2135 // the current {osr_level} loaded from the header of the BytecodeArray. | |
2136 Label ok(assembler), osr_armed(assembler, Label::kDeferred); | |
2137 Node* condition = __ Int32GreaterThanOrEqual(loop_depth, osr_level); | |
2138 __ Branch(condition, &ok, &osr_armed); | |
2139 | |
2140 __ Bind(&ok); | |
2141 __ Dispatch(); | |
2142 | |
2143 __ Bind(&osr_armed); | |
2144 { | |
2145 Callable callable = CodeFactory::InterpreterOnStackReplacement(isolate_); | |
2146 Node* target = __ HeapConstant(callable.code()); | |
2147 Node* context = __ GetContext(); | |
2148 __ CallStub(callable.descriptor(), target, context); | |
2149 __ Dispatch(); | |
2150 } | |
2151 } | |
2152 | |
2153 // Throw | 2156 // Throw |
2154 // | 2157 // |
2155 // Throws the exception in the accumulator. | 2158 // Throws the exception in the accumulator. |
2156 void Interpreter::DoThrow(InterpreterAssembler* assembler) { | 2159 void Interpreter::DoThrow(InterpreterAssembler* assembler) { |
2157 Node* exception = __ GetAccumulator(); | 2160 Node* exception = __ GetAccumulator(); |
2158 Node* context = __ GetContext(); | 2161 Node* context = __ GetContext(); |
2159 __ CallRuntime(Runtime::kThrow, context, exception); | 2162 __ CallRuntime(Runtime::kThrow, context, exception); |
2160 // We shouldn't ever return from a throw. | 2163 // We shouldn't ever return from a throw. |
2161 __ Abort(kUnexpectedReturnFromThrow); | 2164 __ Abort(kUnexpectedReturnFromThrow); |
2162 } | 2165 } |
(...skipping 300 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2463 __ StoreObjectField(generator, JSGeneratorObject::kContinuationOffset, | 2466 __ StoreObjectField(generator, JSGeneratorObject::kContinuationOffset, |
2464 __ SmiTag(new_state)); | 2467 __ SmiTag(new_state)); |
2465 __ SetAccumulator(old_state); | 2468 __ SetAccumulator(old_state); |
2466 | 2469 |
2467 __ Dispatch(); | 2470 __ Dispatch(); |
2468 } | 2471 } |
2469 | 2472 |
2470 } // namespace interpreter | 2473 } // namespace interpreter |
2471 } // namespace internal | 2474 } // namespace internal |
2472 } // namespace v8 | 2475 } // namespace v8 |
OLD | NEW |