Chromium Code Reviews| 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 2066 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2077 // | 2077 // |
| 2078 // Call a JSfunction or Callable in |callable| with the |receiver| and | 2078 // Call a JSfunction or Callable in |callable| with the |receiver| and |
| 2079 // |arg_count| arguments in subsequent registers. Collect type feedback into | 2079 // |arg_count| arguments in subsequent registers. Collect type feedback into |
| 2080 // |feedback_slot_id|. The callable is known to be a property of the receiver. | 2080 // |feedback_slot_id|. The callable is known to be a property of the receiver. |
| 2081 void Interpreter::DoCallProperty(InterpreterAssembler* assembler) { | 2081 void Interpreter::DoCallProperty(InterpreterAssembler* assembler) { |
| 2082 // TODO(leszeks): Look into making the interpreter use the fact that the | 2082 // TODO(leszeks): Look into making the interpreter use the fact that the |
| 2083 // receiver is non-null. | 2083 // receiver is non-null. |
| 2084 DoJSCall(assembler, TailCallMode::kDisallow); | 2084 DoJSCall(assembler, TailCallMode::kDisallow); |
| 2085 } | 2085 } |
| 2086 | 2086 |
| 2087 void Interpreter::DoCall0(InterpreterAssembler* assembler) { | |
| 2088 Node* function_reg = __ BytecodeOperandReg(0); | |
| 2089 Node* function = __ LoadRegister(function_reg); | |
| 2090 Node* receiver_reg = __ BytecodeOperandReg(1); | |
| 2091 Node* receiver_arg = __ RegisterLocation(receiver_reg); | |
| 2092 Node* receiver = __ Load(MachineType::TaggedPointer(), receiver_arg); | |
| 2093 Node* slot_id = __ BytecodeOperandIdxInt32(2); | |
| 2094 Node* type_feedback_vector = __ LoadTypeFeedbackVector(); | |
| 2095 Node* context = __ GetContext(); | |
| 2096 Callable call_ic = CodeFactory::CallIC(isolate_); | |
| 2097 Node* result = __ CallStub(call_ic, context, function, __ Int32Constant(0), | |
| 2098 slot_id, type_feedback_vector, receiver); | |
|
rmcilroy
2017/02/06 12:20:01
Could we pull the shared logic out to a common hel
| |
| 2099 __ SetAccumulator(result); | |
| 2100 __ Dispatch(); | |
| 2101 } | |
| 2102 | |
| 2103 void Interpreter::DoCall1(InterpreterAssembler* assembler) { | |
| 2104 Node* function_reg = __ BytecodeOperandReg(0); | |
| 2105 Node* function = __ LoadRegister(function_reg); | |
| 2106 Node* receiver_reg = __ BytecodeOperandReg(1); | |
| 2107 Node* receiver_arg = __ RegisterLocation(receiver_reg); | |
| 2108 Node* receiver = __ Load(MachineType::TaggedPointer(), receiver_arg); | |
| 2109 Node* arg0_reg = __ BytecodeOperandReg(2); | |
| 2110 Node* arg0 = __ LoadRegister(arg0_reg); | |
| 2111 Node* slot_id = __ BytecodeOperandIdxInt32(3); | |
| 2112 Node* type_feedback_vector = __ LoadTypeFeedbackVector(); | |
| 2113 Node* context = __ GetContext(); | |
| 2114 Callable call_ic = CodeFactory::CallIC(isolate_); | |
| 2115 Node* result = __ CallStub(call_ic, context, function, __ Int32Constant(1), | |
| 2116 slot_id, type_feedback_vector, receiver, arg0); | |
| 2117 __ SetAccumulator(result); | |
| 2118 __ Dispatch(); | |
| 2119 } | |
| 2120 | |
| 2121 void Interpreter::DoCall2(InterpreterAssembler* assembler) { | |
| 2122 Node* function_reg = __ BytecodeOperandReg(0); | |
| 2123 Node* function = __ LoadRegister(function_reg); | |
| 2124 Node* receiver_reg = __ BytecodeOperandReg(1); | |
| 2125 Node* receiver = __ LoadRegister(receiver_reg); | |
| 2126 Node* arg0_reg = __ BytecodeOperandReg(2); | |
| 2127 Node* arg0 = __ LoadRegister(arg0_reg); | |
| 2128 Node* arg1_reg = __ BytecodeOperandReg(3); | |
| 2129 Node* arg1 = __ LoadRegister(arg1_reg); | |
| 2130 Node* slot_id = __ BytecodeOperandIdxInt32(4); | |
| 2131 Node* type_feedback_vector = __ LoadTypeFeedbackVector(); | |
| 2132 Node* context = __ GetContext(); | |
| 2133 Callable call_ic = CodeFactory::CallIC(isolate_); | |
| 2134 Node* result = | |
| 2135 __ CallStub(call_ic, context, function, __ Int32Constant(2), slot_id, | |
| 2136 type_feedback_vector, receiver, arg0, arg1); | |
| 2137 __ Comment("SetAccumulator"); | |
|
rmcilroy
2017/02/06 12:20:01
unintended comment?
| |
| 2138 __ SetAccumulator(result); | |
| 2139 __ Dispatch(); | |
| 2140 } | |
| 2141 | |
| 2087 // TailCall <callable> <receiver> <arg_count> <feedback_slot_id> | 2142 // TailCall <callable> <receiver> <arg_count> <feedback_slot_id> |
| 2088 // | 2143 // |
| 2089 // Tail call a JSfunction or Callable in |callable| with the |receiver| and | 2144 // Tail call a JSfunction or Callable in |callable| with the |receiver| and |
| 2090 // |arg_count| arguments in subsequent registers. Collect type feedback | 2145 // |arg_count| arguments in subsequent registers. Collect type feedback |
| 2091 // into |feedback_slot_id| | 2146 // into |feedback_slot_id| |
| 2092 void Interpreter::DoTailCall(InterpreterAssembler* assembler) { | 2147 void Interpreter::DoTailCall(InterpreterAssembler* assembler) { |
| 2093 DoJSCall(assembler, TailCallMode::kAllow); | 2148 DoJSCall(assembler, TailCallMode::kAllow); |
| 2094 } | 2149 } |
| 2095 | 2150 |
| 2096 // CallRuntime <function_id> <first_arg> <arg_count> | 2151 // CallRuntime <function_id> <first_arg> <arg_count> |
| (...skipping 1202 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3299 __ StoreObjectField(generator, JSGeneratorObject::kContinuationOffset, | 3354 __ StoreObjectField(generator, JSGeneratorObject::kContinuationOffset, |
| 3300 __ SmiTag(new_state)); | 3355 __ SmiTag(new_state)); |
| 3301 __ SetAccumulator(old_state); | 3356 __ SetAccumulator(old_state); |
| 3302 | 3357 |
| 3303 __ Dispatch(); | 3358 __ Dispatch(); |
| 3304 } | 3359 } |
| 3305 | 3360 |
| 3306 } // namespace interpreter | 3361 } // namespace interpreter |
| 3307 } // namespace internal | 3362 } // namespace internal |
| 3308 } // namespace v8 | 3363 } // namespace v8 |
| OLD | NEW |